你掃完了、也看了結果,但就是找不到入口。或者你打穿了一個服務,拿到低權限 shell,接下來呢?提權怎麼提?打了好幾條路都不通,腦子一片空白。
這時候最有用的一招,不是去翻新的工具或技巧——是回頭重看你的掃描結果。
核心觀念:掃描結果是礦脈,不是報告
大部分人第一次看掃描結果時,會這樣讀:
第一次讀掃描結果(大多數人):
Port 21 → FTP,跳過
Port 22 → SSH,跳過
Port 80 → HTTP,看看有什麼網站
Port 445 → Samba,可能可以列舉
Port 3306 → MySQL,試預設密碼
Port 8080 → 又一個 HTTP,看看是什麼
Port 9200 → Elasticsearch,查 exploit
→ 快速掃一遍,挑「看起來好打的」開始動手
→ 花 30 秒讀完,然後再也不看
這就像去礦山只撿地表上的石頭,撿完就走。但真正的礦藏在底下——掃描結果中的每一行都可能藏著線索,你需要在不同的時間點、用不同的問題去重讀它。
第一遍:快速分類(攻擊前)
問:「有哪些服務?哪些可能有漏洞?」按高 / 中 / 低風險排序,挑好打的開始。大部分人只做這一遍。
第二遍:交叉比對版本(提權卡住時)
問:「版本號暗示了什麼?」
nmap 告訴你:
OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13
MySQL 5.5.62-0ubuntu0.14.04.1
^^^^^^^^
Ubuntu 14.04 → kernel 3.13.x~3.19.x
→ CVE-2015-1328 overlayfs 提權!
第三遍:服務關聯性(攻擊鏈斷了時)
問:「這些服務之間有什麼關係?」
第一遍:三個獨立目標
Port 80(payroll) / Port 3306(MySQL,localhost only) / Port 22(SSH)
第三遍:串起來
payroll SQLi → 洩漏 MySQL 密碼 'sploitme'
→ SSH 隧道繞過 localhost 限制
→ 操作 Drupal 資料庫 → PHP Filter → RCE
每個服務問自己:設定檔在哪?用什麼帳號跑?跟誰共用資料?有沒有只允許 localhost 的功能?
第四遍:NSE 腳本輸出(手動 exploit 失敗時)
-sC 的輸出大多數人跳過,但裡面藏了寶:
高價值 NSE 輸出:
ftp-anon: Anonymous login allowed → 免費情報
smb-security-mode: signing disabled → SMB Relay 可行
http-robots.txt → 洩漏隱藏路徑
smb-os-discovery → 精確 OS → 搜 exploit
MS3 的 FTP anonymous 就揭露了 IIS 根目錄裡的 caidao.asp WebShell。
第五遍:內部監聽端口(提權後找橫向移動時)
問:「從裡面看,還有什麼是外面看不到的?」
# nmap 看外面,netstat 看裡面
netstat -tlnp 2>/dev/null || ss -tlnp
# 找只聽 127.0.0.1 的服務 → SSH 隧道可達的隱藏目標
MySQL 只聽 localhost、CUPS 只聽 localhost、Rails Web Console 限制 localhost——有 SSH 帳號就能全部繞過。
三個實戰案例
案例 1:/tmp noexec
overlayfs exploit 編譯成功,執行 Permission denied。反覆查檔案權限沒問題,最後 mount | grep tmp 發現 noexec 旗標。換到 /var/www/html/ 就跑了。
教訓:限制不一定在檔案層,可能在檔案系統層。
案例 2:MySQL 連不上
知道密碼 sploitme,從 Kali 連不上。netstat 一看——127.0.0.1:3306,只聽本地。SSH 隧道 ssh -L 33306:127.0.0.1:3306 解決。
教訓:「連不上」不等於「打不了」,有時只需要一條隧道。
案例 3:GlassFish SSL 過期
管理介面和 asadmin 全因 SSL 憑證過期報錯。差點標記成「打不了」。回頭一想——目標是「部署 WAR」不是「登入管理介面」。GlassFish 有 autodeploy 目錄,用已有的 SYSTEM shell 直接寫進去。
教訓:把目標從「工具的操作」拉回「實際要達成的事」,替代方案就浮現了。
除錯四步驟
Step 1:精確描述問題
✗ 「GlassFish 打不穿」
✓ 「GlassFish 管理介面因 SSL 過期無法存取,無法部署 WAR」
Step 2:列出至少三個假設
A:SSL 可以繞過? B:有其他管理入口? C:不需要管理介面?
Step 3:從最便宜的驗證開始
先跑 30 秒能驗證的,別先做要 30 分鐘的
Step 4:重新定義目標
三個假設都排除了 → 問「達到同一目標還有什麼方式?」
部署 WAR → 管理介面 / autodeploy / REST API
拿 shell → reverse shell / bind shell / 新增帳號
讀密碼 → 破解 hash / Pass-the-Hash / 找設定檔
內部偵察速查
拿到 shell 後跑一輪,找外面看不到的攻擊面:
Linux
id # 群組(docker?)
mount | grep -E 'noexec|nosuid' # 掛載限制
netstat -tlnp 2>/dev/null || ss -tlnp # 內部監聽
find / -perm -4000 -type f 2>/dev/null # SUID
grep -r 'password' /var/www/ /etc/ 2>/dev/null | grep -v Binary | head -20
crontab -l 2>/dev/null; cat /etc/crontab 2>/dev/null
Windows
whoami /priv # 權限
whoami /groups # 群組
netstat -ano | findstr LISTENING # 內部監聽
net localgroup Administrators # 管理員
dir /s /b C:\*.xml C:\*.ini C:\*.conf 2>nul | findstr -i "tomcat\|glass\|jenkins"
小結
卡關時最有效的動作不是找新工具,是回頭重讀已有的資訊。五次重讀法——快速分類、版本交叉比對、服務關聯、NSE 輸出、內部端口——每一遍帶不同問題看同一份資料,就能看到不同的東西。
除錯四步驟:精確描述 → 列假設 → 最便宜的先驗證 → 重新定義目標。