這篇不一樣。這篇是那些寫不進技術報告裡的錯誤——不是工具 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,讓它留在前台好管理。