iT邦幫忙

2026 iThome 鐵人賽

DAY 29
0
Claude AI

打靶機 30 天:從 Metasploitable2 到 3 的滲透測試學習筆記系列 第 29 篇

打靶機 30 天犯過的蠢錯誤大公開

  • 分享至 

  • xImage
  •  

這篇不一樣。這篇是那些寫不進技術報告裡的錯誤——不是工具 bug、不是環境問題,純粹是自己腦子沒轉過來、手比腦快、或者犯了所有初學者都會犯的經典失誤。

每一條都是真的。每一條在當時都讓我對著螢幕發呆至少五分鐘。

蠢錯誤分級

嚴重程度圖例:

  🤡  笑著就過去了(< 5 min)
  🤦  浪費了一些時間(5-15 min)
  💀  嚴重懷疑自己適不適合做這行(> 15 min)

1 忘記開 listener 就跑 exploit

等級:🤡
發生次數:至少 3 次

Metasploit 裡 set LHOST、set LPORT,確認參數沒問題,信心滿滿按下 run——exploit 成功了,但 session 沒開。

為什麼?因為 reverse shell 需要你這邊有人在聽。我用了 exploit/multi/handler 以外的方式打(比如手動 curl 觸發),但忘了先開 nc -lvnp 4444。

shell 飛過來,沒人接,就沒了。

正確流程:

  Terminal 1                Terminal 2
  ──────────                ──────────
  nc -lvnp 4444            (等 listener 就緒後)
  Listening on 0.0.0.0:4444  curl "http://target/shell.php?cmd=..."
       │                          │
       └──── shell 連回來 ◄───────┘

教訓:listener 先開,exploit 後打。養成習慣左邊永遠掛著一個 nc -lvnp。


2 在 PowerShell 裡打 cmd 語法

等級:🤡
發生次數:無數次

evil-winrm 連上 Windows 之後,它給你的是 PowerShell 環境。但我的肌肉記憶全是 cmd:

*Evil-WinRM* PS > dir /s /b C:\Users 2>nul
# 報錯:一堆紅字

*Evil-WinRM* PS > type C:\Windows\System32\drivers\etc\hosts
# 報錯:type 在 PowerShell 是 Get-Content 的別名,行為不同

每次都要在前面加 cmd /c:

cmd /c "dir /s /b C:\Users 2>nul"
cmd /c "type C:\path\to\file"

教訓:進了 evil-winrm 先在腦子裡切換語言。或者乾脆每條指令都包 cmd /c,保險。


3 編譯 exploit 成功 → 跑不動 → 查半天 → 是 noexec

等級:💀
發生次數:1 次(但花了 20 分鐘)

00:00  gcc 編譯成功 → 「太好了」
00:01  ./ofs → Permission denied → 「啊?」
00:02  chmod +x ofs → 再跑 → 還是 denied → 「???」
00:05  ls -la → 權限明明有 x → 「到底???」
00:08  換個檔名試 → 不行
00:10  重新編譯 → 不行
00:12  開始懷疑 gcc → 用 file 檢查 → ELF 沒問題
00:15  開始懷疑人生
00:18  終於想到檢查 mount → noexec → 「……」
00:19  cp 到 /var/www/html/ → 一次成功
00:20  對著螢幕嘆氣

蠢在哪:mount 是一條一秒鐘的指令。我花了 18 分鐘檢查所有不相關的東西,就是沒想到往上看一層。


4 Metasploit search 打太廣,淹死在結果裡

等級:🤡
發生次數:經常

msf6 > search apache
# → 300+ 筆結果
# → 花 5 分鐘翻頁
# → 找不到想要的

msf6 > search type:exploit name:continuum
# → 1 筆結果 → 就是它

教訓:search 要加 type: 和 name: 縮小範圍。另外先用 searchsploit 在 ExploitDB 查清楚模組名稱再進 MSF 更快。


5 拿到 shell 之後興奮地開始操作,忘了看自己是誰

等級:🤦
發生次數:2 次

打穿之後,立刻開始搞事——下載工具、找設定檔、試著改東西。一堆 Access Denied。

然後才想到跑 whoami,發現自己是 LOCAL SERVICE,不是 SYSTEM。

正確的第一步:

  拿到 shell
      │
      ▼
  whoami            ← 我是誰
  id / whoami /priv ← 我有什麼權限
  pwd / cd          ← 我在哪裡
      │
      ▼
  然後才開始操作

教訓:拿到 shell 的前三條指令永遠是 whoami、id(Linux)或 whoami /priv(Windows)、pwd。情報在先,操作在後。


6 Python HTTP server 被佔用,以為 wget 壞了

等級:🤡
發生次數:1 次

Kali 上開 python3 -m http.server,預設 port 8000。在目標機 wget 下載 exploit,一直 connection refused。

花了五分鐘查目標的網路、防火牆、DNS。最後回頭看 Kali 的 terminal——Address already in use。Python server 根本沒啟動成功。

# 蠢:沒看 server 是否真的跑起來
python3 -m http.server
# OSError: [Errno 98] Address already in use

# 正確:換個 port 或先確認
python3 -m http.server 8888
# Serving HTTP on 0.0.0.0 port 8888 ← 確認這行有出現

教訓:開 server 之後看一眼有沒有 Serving HTTP on... 再做下一步。


7 Copy-paste payload 的引號被終端吃掉

等級:🤦
發生次數:3 次

從筆記或網頁複製 reverse shell payload,貼進終端。不 work。花時間除錯,最後發現引號從 " 變成了 "(smart quotes),或者某個特殊字元被終端截斷了。

常見的隱形字元陷阱:

  " " → " "    smart quotes(Word / 某些網頁)
  – —  → - -    em/en dash
  看不見的 \r    Windows 換行混進 Linux shell
  不可見空格     全形空格或 non-breaking space

教訓:payload 手打,不要 copy-paste。或者貼完之後用 cat -A 檢查有沒有奇怪的字元。


8 打完忘記清理,下次來發現 webshell 還在

等級:🤦
發生次數:多次

每次打完一條路,就興沖沖去打下一條。WebShell 留在 /var/www/html/shell.php,overlayfs exploit 留在 /var/www/html/ofs,WAR 留在 autodeploy 目錄。

雖然是練習環境不影響,但如果是真實滲透測試,這些都是證據。

每條路打完的清理清單:

  □ 刪除上傳的 webshell
  □ 刪除編譯的 exploit
  □ 刪除傳上去的工具(JuicyPotato 等)
  □ 移除新增的帳號(net user hacker /del)
  □ 還原改過的設定檔(sudoers 等)

教訓:打完 → 截圖 → 清理 → 下一個。養成 SOP。


9 SSH 隧道開了忘了用,用完忘了關

等級:🤡
發生次數:2 次

ssh -f -N -L 33306:127.0.0.1:3306 vagrant@192.168.145.145

開完之後忘了自己開過,繼續嘗試直連 192.168.145.145:3306。connection refused。花時間查問題。

還有一次反過來——隧道開著沒關,佔了 port 33306。下次想開新隧道,port 衝突。lsof -i :33306 才發現背景有殘留 SSH。

教訓:開隧道就寫下來。用完 kill 掉背景程序。或者不加 -f,讓它留在前台好管理。


上一篇
手動攻擊 vs 自動化工具:該如何取捨
下一篇
30 天總結:打靶機教會我的事
系列文
打靶機 30 天:從 Metasploitable2 到 3 的滲透測試學習筆記 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言