最後幾個不是「更難的漏洞」,而是需要不同的思維方式。這篇就是講那個轉變——從「找 exploit → 一鍵打」到「把手上的碎片拼成一條通路」。
攻擊順序還原
先把 13 個入口按照實際攻擊順序排出來,標記難度變化:
攻擊順序與耗時(估計)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第一梯隊:一鍵到手(共 ~40 min)
#1 Continuum MSF → 直接 root 10 min
#2 Elasticsearch MSF → SYSTEM 10 min
#3 UnrealIRCd MSF → shell → overlayfs 10 min
#4 Tomcat MSF → SYSTEM 10 min
── 此時心態:「MS3 好像也沒那麼難嘛」 ──
第二梯隊:需要動手(共 ~100 min)
#5 WAMPSERVER curl PUT → webshell 15 min
#6 Java RMI MSF → LOCAL SERVICE 10 min
#7 FTP 爆破 hydra → 情報收集 15 min
#8 IIS 菜刀 FTP 發現 → webshell 20 min
#9 Samba 列舉 → 上傳 webshell 40 min ← 需要設 smbpasswd
── 此時心態:「開始要想了,但還行」 ──
第三梯隊:最後一哩路(共 ~5 hr)
#10 Jenkins+JP 3 次卡關 → 35 min 除錯 60 min
#11 GlassFish SSL 死路 → autodeploy 繞路 50 min
#12 Rails+Docker localhost 限制 + docker 提權 60 min
#13 MySQL→Drupal 7 步攻擊鏈 90 min
#14 CUPS ❌ 確認不可打 30 min
── 此時心態:「每一步都要想,但越來越知道怎麼想」 ──
第三梯隊每個都值得單獨說。
最後一哩路 #1:Jenkins → JuicyPotato
這是 Windows 端最曲折的一條路,35 分鐘內連續撞牆三次。
為什麼難
不是漏洞難找——Jenkins Script Console 無需認證,一眼就看到。難的是拿到低權限 shell 之後的每一步都有障礙:
Jenkins 攻擊的三連撞牆:
撞牆 1:Groovy system() 只回 true/false
─────────────────────────────────────────
你以為 system('whoami') 會回 "LOCAL SERVICE"
實際回了一個 true → 懵
解法:改用反引號 `whoami` 取得輸出
撞牆 2:certutil 寫不進 C:\Windows\Temp
─────────────────────────────────────────
LOCAL SERVICE ≠ SYSTEM
Windows ACL 不給寫 → Access Denied
解法:改寫到 C:\Users\Public + Groovy Java API 下載
撞牆 3:JuicyPotato reverse shell 被防火牆擋
─────────────────────────────────────────
JuicyPotato 執行成功了,但反向 shell 出不去
解法:不做 reverse shell → 改用 net user 新增帳號
→ evil-winrm 正面登入
這條路教我什麼
每次撞牆的解法都是同一個模式:目標不變,方法換掉。
想看 whoami 輸出 → system() 不行就用反引號。想下載檔案 → certutil 不行就用 Java API。想拿互動式 shell → reverse shell 不行就新增帳號正面登入。
三次撞牆,三次用不同方法做同一件事。到第三次的時候,這個思維已經變成反射了。
最後一哩路 #2:GlassFish autodeploy
為什麼難
SSL 憑證在 2023 年過期,管理介面完全癱瘓。所有正規的管理工具(asadmin、Web Console、REST API)全走 HTTPS,全報 CertificateExpiredException。
這個卡關差點讓我把 GlassFish 標成「不可攻破」。
轉折點
問了一個好問題:我要的是「登入管理介面」還是「讓 GlassFish 執行我的 WAR」?
管理介面只是部署 WAR 的途徑之一。GlassFish 的 autodeploy 目錄不需要登入——只要把 WAR 丟進去,它就會自動部署。
死路 活路
──── ────
asadmin deploy ──┐ evil-winrm(已有 session)
Web Console ─────┤ SSL 過期 │
REST API ────────┘ upload shell.war
cmd /c move → autodeploy/
│
GlassFish 自動部署 → webshell ✓
這條路教我什麼
正門鎖了不代表房子進不去。 而且這個突破有一個前提——我手上已經有 Elasticsearch 打下來的 SYSTEM 權限 evil-winrm session。最後一哩路經常需要借用前面已拿到的資源。
最後一哩路 #3:Rails Web Console + Docker Group
為什麼難
兩層限制疊在一起:
轉折點
第一層用 SSH 繞過(vagrant:vagrant 登入後從 127.0.0.1 curl)。第二層的答案藏在 id 輸出裡:
uid=1124(chewbacca) gid=100(users) groups=100(users),999(docker)
^^^^^^
docker group = 可以啟動容器 = 可以掛載主機根目錄 = 可以寫 /etc/sudoers = root。
docker run -v /:/mnt --rm ubuntu bash -c \
'echo "chewbacca ALL=(ALL) NOPASSWD:ALL" >> /mnt/etc/sudoers'
sudo bash
# root
這條路教我什麼
兩件事:
最後一哩路 #4:MySQL → Drupal 七步鏈
這是整個 MS3 最長的攻擊鏈,也是最能代表「最後一哩路」精神的一個。
七步拆解
Step 1 payroll_app.php 原始碼 → MySQL 密碼 'sploitme'
│ (情報收集)
▼
Step 2 MySQL 只聽 127.0.0.1 → SSH 隧道繞過
│ ssh -L 33306:127.0.0.1:3306 vagrant@target
▼
Step 3 連上 MySQL → 找到 Drupal 資料庫
│ (資料庫操作)
▼
Step 4 用 PHP 生成 Drupal 格式的密碼雜湊
│ (需要理解 Drupal 的 phpass 格式)
▼
Step 5 UPDATE drupal.users 改掉 admin 密碼
│ (資料庫寫入)
▼
Step 6 登入 Drupal → 啟用 PHP Filter → 寫惡意頁面
│ (CMS 後台操作)
▼
Step 7 curl 觸發 → www-data shell → overlayfs → root
(提權)