iT邦幫忙

2026 iThome 鐵人賽

DAY 28
0
Security

《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》系列 第 28 篇

Day 28 — 隧道打通之後呢?用 Proxychains 探測內網、尋找隱藏憑證

  • 分享至 

  • xImage
  •  

昨天我們用 SSH 的 -L、-D、-R 成功透過跳板機,存取了原本連不到的內網服務。

但想像一下這個場景:我們用 Lab 2 的 -D 成功建立了 SOCKS Proxy,curl 也能順利連到內網 Web 了。

然後呢?我們其實還不知道內網裡有哪些其他服務!

這時候,第一個想到的可能就是用 nmap 掃一下,結果卻發現,不是所有工具都能像 curl 一樣,直接指定 SOCKS Proxy 來連線 QQ

那有沒有辦法讓原本不直接支援 SOCKS Proxy 的工具,也能透過這條隧道連線呢?

這就是今天要解決的第一個問題!

另外,當我們真的拿到 Shell 之後,也不能只顧著繼續找漏洞。

畢竟現在大家越來越重視漏洞修補,有些漏洞可能早就被補起來了,不一定每次都能順利找到可以利用的漏洞。

但系統裡可能還留著其他有用的憑證,像是設定檔、環境變數,或應用程式使用的帳密。

有時候,比起一直找新的漏洞,從系統裡挖掘既有的憑證,反而可能找到更有價值的突破口! 👀

所以今天就來研究兩件事:

  1. Proxychains — 讓部分不直接支援 SOCKS Proxy 的工具,也能嘗試透過代理連線(實作)
  2. 憑證挖掘 — 拿到 Shell 之後,可以從哪些地方尋找憑證(Checklist)

那我們就開始吧!~


我們今天的實作,延用昨天的 Docker Lab

Step 1:啟動 Docker 環境

在昨天我們建Docker compose的資料夾,重新開終端機,下

docker compose up -d --build
  • docker compose up — 啟動 docker-compose.yml 裡定義的所有容器
  • -d — detached,在背景跑,不會佔住你的終端機
  • --build — 重新 build image(確保用最新的設定)

https://ithelp.ithome.com.tw/upload/images/20261012/20184189FS37aTR6Sb.png

Step 2:建立 SOCKS proxy

開另一個終端機:

ssh -D 1080 -p 2222 labuser@127.0.0.1
  • ssh:撥號本身,表示你要跟某個人建立連線
  • labuser@127.0.0.1:我們要打給誰、打去哪。labuser 是帳號,127.0.0.1 看起來像是「打給自己」,但因為 Docker 已經把跳板機的 port 轉接到我們本機了,所以這其實就是打給「跳板機」這個朋友,只是接聽的地方剛好也在我們電腦上
  • -p 2222:撥打的分機號碼。這個朋友(跳板機)的電話總機只接聽 2222 這支分機,不是打一般的 22(因為 Docker 把它轉接到 2222 了)

輸入密碼 labpass
https://ithelp.ithome.com.tw/upload/images/20261012/20184189KMVz4CFNG2.png

這樣我們電腦的 1080 port 就變成 SOCKS5 proxy 了。也就是說,我們本機的 1080 port,變成一個「代打窗口」—任何東西丟進 127.0.0.1:1080,都會被跳板機接手、幫我們連到它連得到的地方,再把結果帶回來給我們。

Step 3:開 WSL

Proxychains 是 Linux 工具,Windows 上沒有,但我們裝 Docker 時已經裝了 WSL2(Windows Subsystem for Linux,也就是在 Windows 裡面塞一個 Linux,讓我們不用裝虛擬機就能跑 Linux 指令),我們直接來用xddd

開另一個終端,輸入:

wsl

https://ithelp.ithome.com.tw/upload/images/20261012/20184189ttNCvT8cfL.png

就會進入 Linux 環境。

Step 4:安裝 Proxychains

在 WSL 裡面:

sudo apt update && sudo apt install -y proxychains4
  • sudo — 用管理員權限執行
  • apt update — 更新套件清單
  • apt install -y proxychains4 — 安裝 proxychains4,-y 安裝中跳出的任何問題,都自動回答yes

https://ithelp.ithome.com.tw/upload/images/20261012/20184189nf0dm6OqZK.png

出現 sudo: not found,求救一下AI發生了什麼事><
原來......Docker 自己的精簡版 Linux,沒有 sudo 也沒有 apt QQ

我們要另外裝一個完整的 Ubuntu WSL,才能安裝我們的Proxychains

裝 Ubuntu WSL

wsl --install -d Ubuntu
  • wsl --install — 安裝 WSL 發行版
  • -d Ubuntu — 指定要裝的版本是 Ubuntu

https://ithelp.ithome.com.tw/upload/images/20261012/20184189wj9tnYMArK.png

設定user account後,會跳出讓我們設定密碼
https://ithelp.ithome.com.tw/upload/images/20261012/20184189dCA47OpjPh.png

設定完成後,會出現
https://ithelp.ithome.com.tw/upload/images/20261012/20184189tbClnv94xG.png

在 Ubuntu WSL 裡面:

sudo apt update && sudo apt install -y proxychains4

https://ithelp.ithome.com.tw/upload/images/20261012/20184189SowXzdrv4D.png
安裝成功!

Step 5:設定 Proxychains

編輯設定檔:

sudo nano /etc/proxychains4.conf
  • sudo — 需要管理員權限才能改系統設定檔
  • nano — Linux 內建的文字編輯器
  • /etc/proxychains4.conf — Proxychains 的設定檔路徑

https://ithelp.ithome.com.tw/upload/images/20261012/20184189eO26Cw2WTP.png

要改兩個地方:

1. 確認模式是 dynamic_chain

找到這幾行,確認 dynamic_chain 前面沒有 #,其他的要有 #:

dynamic_chain          # ← 前面不要有 #
# strict_chain         # ← 前面要有 #

dynamic_chain 的意思是:依照設定的順序串接 Proxy,遇到無法使用的 Proxy 時,可以略過它,繼續嘗試建立連線。我們目前只有設定一個 Proxy,所以只要這個 Proxy 正常運作,dynamic_chain 和strict_chain 在這次實作中的效果就差不多。

2. 改最後面的 [ProxyList]

滑到最底部,把原本的內容改成:

[ProxyList]
socks5 127.0.0.1 1080

這行告訴 Proxychains:所有攔截到的流量,都送到 127.0.0.1:1080 這個 SOCKS5 proxy(就是我們 SSH -D 開的那個)。

改完按 Ctrl+O ,然後 Enter 存檔,再按 Ctrl+X 離開。

Step 6:測試!

Proxychains 牽涉到好幾個步驟——裝軟體、改設定檔、還要確認 tunnel(隧道,就是前面用 ssh -D 建好的那條「幫我們轉送流量到內網」的通道)真的有打通)

如果一開始就直接拿一個完全陌生的內網去掃,一旦掃不到任何東西,會完全搞不清楚問題出在哪——是我們 Proxychains 設定錯了?還是 tunnel 根本沒接通?還是這個網段本來就沒東西?超級難除錯!

所以我們這會用已經知道答案的主機(internal-web)去測。這樣如果測得到,就代表 tunnel 跟 Proxychains 都沒問題;測不到,問題就一定出在這兩個環節上,不用再懷疑別的!讓我們可以搞定新手超難上手的proxychain設定!確定會設定後,未來就可以自己用他來掃內網有哪些主機、主機又有哪些服務><(我們今天的最後會看到!!!)

tunnel 沒接通 ≠ Proxychains 設定錯

指令 → Proxychains(負責攔截流量) → tunnel(負責把流量送過去) → 跳板機 → 內網目標
  • Proxychains 設定錯:設定檔裡的位址、port 寫錯,或根本沒裝好。
  • tunnel 沒接通:SSH 根本沒連上,或 -D 開的那個窗口沒有正確監聽,流量找不到路送出去。
proxychains4 nmap -sT -Pn -p 80 internal-web
  • Proxychains 只支援 TCP。所以 nmap 必須用 -sT(TCP Connect Scan),不能用預設的 -sS(SYN Scan)
  • -Pn 是跳過 ping(ICMP),因為ICMP 走不了 SOCKS 協定
    https://ithelp.ithome.com.tw/upload/images/20261012/20184189OWQ5LxPxqp.png

https://ithelp.ithome.com.tw/upload/images/20261012/20184189xdKHba6OLb.png

internal-web 是 Docker 內部的 hostname,WSL 不認得。要用 IP 來連。

先在另一個終端(Windows PowerShell)查 internal-web 的 IP:

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' internal-web
  • docker inspect — 查看容器的詳細資訊
  • -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' — 只顯示 IP
  • internal-web — 容器名稱

https://ithelp.ithome.com.tw/upload/images/20261012/201841895jw9J5Kkuc.png

internal-web 這個 hostname 是 Docker Compose 內的 DNS 幫我們解析的,只有同一個 Docker 網路裡的容器才查得到

為什麼 internal-web 連不到,換成 IP 就有機會連到?

internal-web(名字) 172.18.0.2(IP)
這是什麼 一個「別名」,要翻譯成 IP 才能用 網路層真正認得的座標
誰負責翻譯 Docker Compose 自己架的內部 DNS 不需要翻譯,直接用
誰查得到 只有「同一個 Docker 網路裡的容器」 只要在同一層網路上,誰都能試著連
WSL 的狀況 WSL 不是那個網路裡的容器,問了沒人回答 因為這次在 WSL 中執行 Proxychains 時,無法直接解析 Docker 內部的主機名稱 internal-web,所以改用該主機的 IP 172.18.0.2 進行連線測試

internal-web 連不到,不是因為「路不通」,是因為「沒人幫忙翻譯這個名字」

https://ithelp.ithome.com.tw/upload/images/20261012/20184189zi40yVMjQv.png

剛剛我們已經查到 internal-web 的 IP 是 172.18.0.2 了。現在回到 WSL 這邊,直接用這個 IP去跑 nmap 測試,看看能不能連得到

proxychains4 nmap -sT -Pn -p 80 172.18.0.2

https://ithelp.ithome.com.tw/upload/images/20261012/20184189Ptt1OhZtFm.png

跑了之後出現 timeout 和 need more proxies,流量根本沒走進隧道 QQ

🔍 問題一:WSL 的 127.0.0.1 ≠ Windows 的 127.0.0.1

因為 WSL 是一個獨立的 Linux 系統,它有自己的網路。WSL 裡面的 127.0.0.1 是指 WSL 自己,不是 Windows。

但我們的 SSH 隧道(ssh -D 1080)是在 Windows 的 PowerShell 開的,SOCKS proxy 綁在 Windows 的 127.0.0.1:1080。WSL 要連到 Windows 上的東西,必須用 Windows 在 WSL 內部網路的 IP,就像兩台不同的電腦要互連,要用對方的 IP 才行。

怎麼查 Windows 的 IP?在 WSL 裡面:

cat /etc/resolv.conf | grep nameserver
  • cat /etc/resolv.conf — 印出 DNS 設定檔的內容
  • | — pipe,把前面的輸出餵給後面的指令
  • grep nameserver — 只留下包含 nameserver 的那一行(就是 Windows 的 IP)

https://ithelp.ithome.com.tw/upload/images/20261012/20184189B5CxET7uJh.png

這個 10.255.255.254 就是 Windows 在 Ubuntu WSL 網路裡的 IP

回去改 Proxychains 設定:

sudo nano /etc/proxychains4.conf

把 [ProxyList] 改成:

socks5 10.255.255.254 1080

大家的 IP 可能會不一樣,要用我們自己在Ubuntu WSL 網路裡查到的 Windows IP!

https://ithelp.ithome.com.tw/upload/images/20261012/20184189uD4kMAQrJG.png

改完按 Ctrl+O ,然後 Enter 存檔,再按 Ctrl+X 離開。

回 WSL 跑:

proxychains4 nmap -sT -Pn -p 80 172.18.0.2

https://ithelp.ithome.com.tw/upload/images/20261012/201841891WBeBDTDTO.png

再跑一次⋯⋯還是 timeout 😭


🔍 問題二:SSH tunnel 只監聽 127.0.0.1

原來 ssh -D 1080 預設只綁在 Windows 的 127.0.0.1:1080,只有 Windows 自己能連,WSL 從外面連不進去。

解法:把 SSH 隧道改成監聽所有介面。回到 PowerShell,先 exit 斷掉原本的 SSH,重新連:

-D 1080 這個指令,完整寫法其實是 -D [監聽位址]:[port],只打 1080 時,監聽位址這格會自動補上 127.0.0.1。也就是說:

-D 1080          等於          -D 127.0.0.1:1080

這個「監聽位址」欄位,決定的是這個服務願意接受從哪裡來的連線,跟剛剛講的「127.0.0.1 代表我自己」是同一個位址,但這裡它扮演的角色不一樣:

  • 寫 127.0.0.1:只接受從我自己這台機器內部發出的連線—就算有其他機器(像 WSL)知道了 Windows 的真實 IP、敲對了門牌,Windows 這一端的 SSH 服務還是會檢查「這個連線是不是從我自己發出的?不是的話,不理。」
  • 寫 0.0.0.0:不限制來源,這台機器上所有網路介面收到的連線,我都接受。

回到 PowerShell,先把原本的 SSH 斷掉,下exit

https://ithelp.ithome.com.tw/upload/images/20261012/20184189tmiXc4Wln2.png

然後重新連,加上 0.0.0.0:

ssh -D 0.0.0.0:1080 -p 2222 labuser@127.0.0.1

https://ithelp.ithome.com.tw/upload/images/20261012/20184189PhDbNSXFv3.png

這樣 SSH tunnel 就會監聽所有介面,WSL 也連得到了。

然後回 WSL 再試一次:

proxychains4 nmap -sT -Pn -p 80 172.18.0.2

https://ithelp.ithome.com.tw/upload/images/20261012/20184189d29pAAqpAP.png
再試一次⋯⋯還是 timeout 😭😭QQQQQ


🔍 問題三:Windows 防火牆擋住了

可能是 Windows 防火牆擋住了。在 PowerShell(用系統管理員開啟)加一條防火牆規則:

New-NetFirewallRule -DisplayName "SSH SOCKS Proxy" -Direction Inbound -LocalPort 1080 -Protocol TCP -Action Allow

https://ithelp.ithome.com.tw/upload/images/20261012/20184189TpKF6G2yN8.png

然後回 WSL 再試一次:

proxychains4 nmap -sT -Pn -p 80 172.18.0.2

還是失敗

關加的防火牆規則

Remove-NetFirewallRule -DisplayName "SSH SOCKS Proxy"

最終解法:SSH tunnel 直接開在 WSL 裡面!

與其跨 Windows 網路搞半天,不如把 SSH tunnel 也開在 WSL 裡面,所有東西都在同一個環境,就沒有跨網路的問題了:

在 WSL 裡建 SSH tunnel

ssh -D 1080 -p 2222 labuser@localhost -f -N
  • -D 1080 — 在 WSL 本機的 port 1080 開 SOCKS5 proxy
  • -p 2222 — 連到目標的 port 2222
  • labuser@localhost — 用 localhost 連到 Windows 上的 Docker 容器(WSL2 有 localhost 轉發功能)
  • -f — 認證完成後自動跑到背景(不佔住終端機)
  • -N — 不執行遠端指令,只建隧道(不開 shell)
  • 沒有 -N 的話 -f 會報錯:Cannot fork into background without a command to execute

那為什麼這次可以用 localhost 連到跳板機呢?

在我的 Docker Desktop/WSL2 環境中,因為 Docker 容器有發布 2222:22 Port,所以可以從 WSL 的 localhost:2222 連到跳板機。

不過,這是我目前實驗環境中的連線結果,不代表所有 Docker Desktop/WSL2 環境都一定能這樣連。實際的連線方式還是會受到 Docker Desktop、WSL 網路模式與 Port Publishing 等設定影響呦~

輸入密碼 labpass
https://ithelp.ithome.com.tw/upload/images/20261012/20184189lmlbUBnprS.png

然後把 Proxychains 設定改回 127.0.0.1(因為 tunnel 現在就在 WSL 本地了):

sudo nano /etc/proxychains4.conf

把最後一行改回:socks5 127.0.0.1 1080
https://ithelp.ithome.com.tw/upload/images/20261012/20184189cctu1y4fvV.png

在 WSL 裡跑:

proxychains4 nmap -sT -Pn -p 80 172.18.0.2

https://ithelp.ithome.com.tw/upload/images/20261012/201841892AQ6mViNPB.png

🎉🎉🎉 成功了!!!

看到80/tcp open http 代表 proxychains 透過 SOCKS proxy 成功掃到內網的 internal-web!

再用 curl 測試看看:

proxychains4 curl http://172.18.0.2
  • proxychains4 — 攔截後面程式的所有網路連線
  • curl http://172.18.0.2:80 — curl 以為自己在直接連內網,但 Proxychains 偷偷把流量塞進 SOCKS5 proxy,經過 SSH 隧道,由跳板機轉送到內網

跟昨天 Lab 2 的差別: 昨天我們要手動寫 curl -x socks5h://127.0.0.1:1080,現在只要前面加 proxychains4,curl 自己不用知道有 proxy 存在

https://ithelp.ithome.com.tw/upload/images/20261012/20184189QLpNt3bITN.png

看到 Welcome to Ngnix 成功了!

為什麼 Proxychain 很重要?

因為像 nmap 沒有 --proxy 參數,我們不可能寫 nmap -x socks5://...,但可以寫:

proxychains4 nmap -sT -Pn -p 80 172.18.0.2

等等,隧道建好了,然後呢? 橫向移動

到目前為止我們學了怎麼建隧道、怎麼讓工具走隧道(Proxychains),也能用 nmap 掃到內網有哪些服務了。

但拿下一台機器之後呢?內網裡不會只有一台機器,怎麼從這台跳到下一台?

這就要提到滲透測試裡很常聽到的一個詞:橫向移動(Lateral Movement)。

簡單說就是:用你在這台機器上找到的帳密或存取權限,去嘗試登入內網的其他機器。 從一個立足點慢慢擴散,一台接一台拿下來。

拿下跳板機 → 翻出密碼 → 用同一組密碼試隔壁的 DB server → 成功!
                                → 再翻出更多密碼 → 試 Domain Controller → ...

所以關鍵問題變成:密碼從哪裡來?

這就是接下來要講的「憑證挖掘」— 拿到 shell 之後,系統上到底有哪些地方可能藏著密碼。


密碼藏在哪裡?憑證挖掘

我們之前有整理過拿到機器 shell 之後的SOP,其中包含尋寶xddd(尋寶主要是要翻箱倒櫃找帳密、環境變數、API Key、私鑰等,為橫向移動做準備。這些機密資訊,理當被好好保護著,但事實上,管理員、開發者和使用者有時候會因為一些疏忽><不小心把它們遺留在機器上,讓我們有機會輕易找到他們xddd

所以說,不管我們拿到的是 root、www-data 還是一般使用者,都建議照著拿到Shell後的 SOP 走一輪~很有機會透過這個過程,找到提權或橫向移動的軌跡checklist翻一遍! 雖然說權限不同能看到的東西不一樣,但每個身分都可能藏著驚喜><

關於尋寶部分,今天還有整理了新工具!(Linux機器的尋寶新工具!)

寶物 怎麼找 為什麼要找
使用的指令紀錄 cat ~/.bash_history 不小心把密碼打在指令裡,像 mysql -u root -p'mypassword'(謝謝她!我們直接拿去用!xdd
SSH 私鑰 ls -la ~/.ssh/ 尋找id_rsa ,我們的寶,讓我們不用密碼就登入其他機器
Web 設定檔 cat /var/www/html/wp-config.php、grep -r "password" /etc/ --include="*.conf" 資料庫帳密、API Key 有時候會不小心被明文存在設定檔,而且很多人會把一組密碼用在多個地方
環境變數 env、find / -name ".env" 2>/dev/null API key、DB 連線字串常放在環境變數或 .env 檔裡
敏感資訊 cat /etc/shadow(需要 root) /etc/shadow 通常保存本機帳號的密碼雜湊,而不是明文密碼。若取得讀取權限,攻擊者可能嘗試離線破解密碼雜湊,取得原本設定的密碼後,再評估是否能用於其他服務的登入
信件目錄 ls /var/spool/mail/ 系統通知信裡,有時候會有重設密碼連結或帳密資訊
大範圍搜尋 grep -rli "password|passwd|credential|secret" /home/ /opt/ /var/ 2>/dev/null 沒線索時,進行地毯式搜索!不能放過藏有秘密的角落
  • cat — 印出檔案內容
  • ls -la — 列出所有檔案(-l 詳細、-a 包含隱藏檔)
  • grep -r — 在目錄裡遞迴搜尋、--include="*.conf" — 只搜 .conf 結尾的檔案
  • find / -name ".env" — 從根目錄找叫 .env 的檔案
  • grep -rli — -r 遞迴、-l 只列檔名、-i 不分大小寫
  • \| — grep 裡的「或」,任一關鍵字出現就算中
  • 2>/dev/null — 把「Permission denied」之類的錯誤訊息丟掉,畫面才不會一堆紅字

找到密碼後,可進行「密碼重用」— 很多人在不同服務用同一組密碼,一組帳密可能可以破解好幾台機器!

把我們的新工具,也融入我們的拿到shell後的SOP(不斷完整我們的information gathering工具!)
https://ithelp.ithome.com.tw/upload/images/20261012/20184189oNASq8WZQ4.png


今天的表定安排都完成啦!~

我們再回頭一起看一下:當我們已經可以透過跳板機存取內網時,要怎麼進一步了解內網有哪些主機,以及哪些 Port 正在開啟呢?

為了測試 Proxychains 的安裝、設定,以及 SSH Tunnel 是否正常運作,我們一開始先拿已經確定存在的 internal-web 做測試。

但在真實的滲透測試情境中,當我們取得跳板機的存取權限後,不會一開始就知道內網有一台叫 internal-web 的主機。

我們必須靠自己探測——這個網段裡有哪些 IP、哪些 Port 開啟、可能提供什麼服務,都需要一步一步挖掘出來,不會有人先把主機名稱告訴你!

現在 Proxychains 跟 SSH Tunnel 都比較熟悉了,而且時間還夠,回頭把這個「偷吃步」補起來~

假裝自己從頭就不知道 internal-web 存在,試著透過 Proxychains 和 SSH Tunnel 探測內網!

第一步:先確認要掃描的網段

不能用猜的——既然假裝自己不知道 internal-web 存在,也不應該直接假設自己知道網段範圍。

真正該做的,是回到 Windows/PowerShell 這端,查一下 Docker Compose 幫我們建立的 Network 實際設定:

docker network ls

https://ithelp.ithome.com.tw/upload/images/20261012/20184189j0bm53OWwT.png

找到 Day 27 這個資料夾對應的網路,接著查它的細節:

docker network inspect <網路名稱>
[
    {
        "Name": "docker_lab-net",
        "Id": "0242dae90acf9afdc134f0c1176f9aa0ab9e136d406edf7767c68e4b8a1d9712",
        "Created": "2026-10-11T15:55:04.165467779Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Options": {
            "com.docker.network.enable_ipv4": "true",
            "com.docker.network.enable_ipv6": "false"
        },
        "Labels": {
            "com.docker.compose.config-hash": "0f95b6172ad6413b7411e8f0e1790a71c075c17fe82a6b48a2622aed9348f6a3",
            "com.docker.compose.network": "lab-net",
            "com.docker.compose.project": "docker",
            "com.docker.compose.version": "5.5.1"
        },
        "Containers": {
            "7faac24571ec33887ffbf259ab529b5398feca525dd070c78fcc5d8f425fa9cb": {
                "Name": "internal-redis",
                "EndpointID": "34b358a00de630f7244c7bb3c7a3f6f8aefb923d1f52b6849be33f9a789b6d41",
                "MacAddress": "42:ca:47:bf:df:6c",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "cd3b3121d39fac7d2fa11ad0457ba2d67a75eaf69f63bdf6aaa788f84143f736": {
                "Name": "jump-server",
                "EndpointID": "7ef1492372235fabacc7302adf9784858399b2ae57693f0cf28cc82c6411f633",
                "MacAddress": "ea:de:d1:8a:28:b1",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "ea94e859a98eaca859371506af4852566eaf46cb451596f3ff9feb775f06dc10": {
                "Name": "internal-web",
                "EndpointID": "b6471e42cae74137721468cbdc19264a28a2a8de2960c31473399cbf7c70b579",
                "MacAddress": "62:a3:20:41:a6:0c",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Status": {
            "IPAM": {
                "Subnets": {
                    "172.18.0.0/16": {
                        "IPsInUse": 6,
                        "DynamicIPsAvailable": 65530
                    }
                }
            }
        }
    }
]

輸出裡找 IPAM → Config → Subnet 這個欄位:172.18.0.0/16,我們的網段範圍。

第二步:透過 Proxychains 探測網段

一般情況下,我們可能會先用 Nmap 的主機探索功能,確認哪些 IP 有回應,再針對存活的主機掃描 Port。

但這次我們是透過 SSH Dynamic Tunnel 搭配 Proxychains 進行測試。

Proxychains 使用 SOCKS Proxy 轉送 TCP 連線,不能直接把一般的 ICMP Ping 探測封包透過 SOCKS 隧道轉送。

因此,這次改用 -Pn,略過 Nmap 的主機探索階段,直接嘗試連線到指定的 TCP Port。

要注意的是,-Pn 並不是確認所有主機都存活,而是告訴 Nmap 不要先透過主機探索判斷目標是否在線。

接著還有另一個問題:掃描速度!

透過 Proxychains 的每個 TCP 連線,都需要經過 SOCKS Proxy 與 SSH Tunnel 轉送,通常會比直接掃描慢不少。

如果對整個 /16 網段進行全 Port 掃描,光是目標 IP 數量就可能達到數萬個,再乘上每個 IP 要測試的 Port 數量,等待時間會非常可觀。

所以這次先縮小掃描範圍,選擇一小段網段,並使用 Nmap 的 --top-ports 20 測試常見的 20 個 TCP Port:

proxychains4 nmap -sT -Pn --top-ports 20 172.18.0.0/29
  • /29 把範圍縮小,因為我們是小型lab,而且掃描上較有效率
  • --top-ports 20 只測最常見的 20 個 port
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17
Starting Nmap 7.98 ( https://nmap.org ) at 2026-10-12 20:35 +0800
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:111  ...  OK
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:993 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:993 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:993 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:993 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:1723 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:1723 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:1723 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:1723 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:3389 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:3389 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:3389 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:3389 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:21 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:21 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:21 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:21 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:8080 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:8080 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:8080 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:8080 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:443 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:443 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:443 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:443 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:445 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:445 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:445 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:445 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:3306 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:3306 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:3306 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:3306 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:23 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:23 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:23 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:23 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:993 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:5900 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:5900 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:5900 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:5900 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:80 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:80 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:80 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:80 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:135 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:135 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:135 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:135 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:995 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:995 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:995 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:995 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:25 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:25 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:25 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:25 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:22 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:22 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:22 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:22 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:110 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:110 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:110 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:110 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:139 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:139 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:139 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:139 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:53 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:53 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:53 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:53 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.3:143 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.4:143 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.5:143 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.0:143 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:1723 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:993 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:3389 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:1723 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:21 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:3389 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:8080 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:21 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:443 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:8080 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:445 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:443 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:3306 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:445 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:23 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:3306 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:111 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:5900 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:23 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:80  ...  OK
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:5900 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:135 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:80 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:995 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:135 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:25 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:995 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:22 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:25 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:110 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:22 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:139 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:110 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:53 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:139 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.2:143 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:53 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.6:143 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:993 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:993 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:1723 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:1723 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:3389 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:3389 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:21 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:21 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:8080 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:8080 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:443 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:443 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:445 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:445 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:3306 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:3306 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:23 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:23 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:5900 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:111  ...  OK
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:5900 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:80 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:80 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:135 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:135 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:995 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:995 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:25 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:25 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:22 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:22 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:110 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:110 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:139 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:139 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:53 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:53 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.7:143 <--socket error or timeout!
[proxychains] Dynamic chain  ...  127.0.0.1:1080  ...  172.18.0.1:143 <--socket error or timeout!
Nmap scan report for 172.18.0.0
Host is up (0.00s latency).

PORT     STATE  SERVICE
21/tcp   closed ftp
22/tcp   closed ssh
23/tcp   closed telnet
25/tcp   closed smtp
53/tcp   closed domain
80/tcp   closed http
110/tcp  closed pop3
111/tcp  closed rpcbind
135/tcp  closed msrpc
139/tcp  closed netbios-ssn
143/tcp  closed imap
443/tcp  closed https
445/tcp  closed microsoft-ds
993/tcp  closed imaps
995/tcp  closed pop3s
1723/tcp closed pptp
3306/tcp closed mysql
3389/tcp closed ms-wbt-server
5900/tcp closed vnc
8080/tcp closed http-proxy

Nmap scan report for 172.18.0.1
Host is up (0.00s latency).

PORT     STATE  SERVICE
21/tcp   closed ftp
22/tcp   closed ssh
23/tcp   closed telnet
25/tcp   closed smtp
53/tcp   closed domain
80/tcp   closed http
110/tcp  closed pop3
111/tcp  open   rpcbind
135/tcp  closed msrpc
139/tcp  closed netbios-ssn
143/tcp  closed imap
443/tcp  closed https
445/tcp  closed microsoft-ds
993/tcp  closed imaps
995/tcp  closed pop3s
1723/tcp closed pptp
3306/tcp closed mysql
3389/tcp closed ms-wbt-server
5900/tcp closed vnc
8080/tcp closed http-proxy

Nmap scan report for 172.18.0.2
Host is up (0.00s latency).

PORT     STATE  SERVICE
21/tcp   closed ftp
22/tcp   closed ssh
23/tcp   closed telnet
25/tcp   closed smtp
53/tcp   closed domain
80/tcp   open   http
110/tcp  closed pop3
111/tcp  closed rpcbind
135/tcp  closed msrpc
139/tcp  closed netbios-ssn
143/tcp  closed imap
443/tcp  closed https
445/tcp  closed microsoft-ds
993/tcp  closed imaps
995/tcp  closed pop3s
1723/tcp closed pptp
3306/tcp closed mysql
3389/tcp closed ms-wbt-server
5900/tcp closed vnc
8080/tcp closed http-proxy

Nmap scan report for 172.18.0.3
Host is up (0.00s latency).

PORT     STATE  SERVICE
21/tcp   closed ftp
22/tcp   closed ssh
23/tcp   closed telnet
25/tcp   closed smtp
53/tcp   closed domain
80/tcp   closed http
110/tcp  closed pop3
111/tcp  closed rpcbind
135/tcp  closed msrpc
139/tcp  closed netbios-ssn
143/tcp  closed imap
443/tcp  closed https
445/tcp  closed microsoft-ds
993/tcp  closed imaps
995/tcp  closed pop3s
1723/tcp closed pptp
3306/tcp closed mysql
3389/tcp closed ms-wbt-server
5900/tcp closed vnc
8080/tcp closed http-proxy

Nmap scan report for 172.18.0.4
Host is up (0.00s latency).

PORT     STATE  SERVICE
21/tcp   closed ftp
22/tcp   closed ssh
23/tcp   closed telnet
25/tcp   closed smtp
53/tcp   closed domain
80/tcp   closed http
110/tcp  closed pop3
111/tcp  closed rpcbind
135/tcp  closed msrpc
139/tcp  closed netbios-ssn
143/tcp  closed imap
443/tcp  closed https
445/tcp  closed microsoft-ds
993/tcp  closed imaps
995/tcp  closed pop3s
1723/tcp closed pptp
3306/tcp closed mysql
3389/tcp closed ms-wbt-server
5900/tcp closed vnc
8080/tcp closed http-proxy

Nmap scan report for 172.18.0.5
Host is up (0.00s latency).

PORT     STATE  SERVICE
21/tcp   closed ftp
22/tcp   closed ssh
23/tcp   closed telnet
25/tcp   closed smtp
53/tcp   closed domain
80/tcp   closed http
110/tcp  closed pop3
111/tcp  closed rpcbind
135/tcp  closed msrpc
139/tcp  closed netbios-ssn
143/tcp  closed imap
443/tcp  closed https
445/tcp  closed microsoft-ds
993/tcp  closed imaps
995/tcp  closed pop3s
1723/tcp closed pptp
3306/tcp closed mysql
3389/tcp closed ms-wbt-server
5900/tcp closed vnc
8080/tcp closed http-proxy

Nmap scan report for 172.18.0.6
Host is up (0.00s latency).

PORT     STATE  SERVICE
21/tcp   closed ftp
22/tcp   closed ssh
23/tcp   closed telnet
25/tcp   closed smtp
53/tcp   closed domain
80/tcp   closed http
110/tcp  closed pop3
111/tcp  closed rpcbind
135/tcp  closed msrpc
139/tcp  closed netbios-ssn
143/tcp  closed imap
443/tcp  closed https
445/tcp  closed microsoft-ds
993/tcp  closed imaps
995/tcp  closed pop3s
1723/tcp closed pptp
3306/tcp closed mysql
3389/tcp closed ms-wbt-server
5900/tcp closed vnc
8080/tcp closed http-proxy

Nmap scan report for 172.18.0.7
Host is up (0.00s latency).

PORT     STATE  SERVICE
21/tcp   closed ftp
22/tcp   closed ssh
23/tcp   closed telnet
25/tcp   closed smtp
53/tcp   closed domain
80/tcp   closed http
110/tcp  closed pop3
111/tcp  closed rpcbind
135/tcp  closed msrpc
139/tcp  closed netbios-ssn
143/tcp  closed imap
443/tcp  closed https
445/tcp  closed microsoft-ds
993/tcp  closed imaps
995/tcp  closed pop3s
1723/tcp closed pptp
3306/tcp closed mysql
3389/tcp closed ms-wbt-server
5900/tcp closed vnc
8080/tcp closed http-proxy

Nmap done: 8 IP addresses (8 hosts up) scanned in 254.03 seconds

我們使用 --top-ports 20 掃描這段網路,結果如下:

  • 172.18.0.1:111/tcp 開啟,服務為 rpcbind
  • 172.18.0.2:80/tcp 開啟,服務為 HTTP
  • 其他被掃描的位址:沒有發現這次測試的 20 個 TCP Port 開啟

由於使用了 -Pn,Nmap 顯示的 Host is up不代表已經透過主機探索確認該 IP 有主機在線><

那 Redis 的 6379 為什麼沒有出現呢?

因為我們使用的 --top-ports 20 只會掃描 Nmap 認定最常見的 20 個 TCP Port,而 6379 不在這個清單裡。

所以,即使 Redis 正在 172.18.0.3:6379 提供服務,這次掃描也不會發現它!

接下來,我們就針對 Redis 常用的 6379 Port 再掃描一次,確認內網中是否有 Redis 服務。

要掃到 Redis,改成手動指定 port:

proxychains4 nmap -sT -Pn -p 6379 172.18.0.0/29

https://ithelp.ithome.com.tw/upload/images/20261012/20184189bsTsV5UbkV.png
找到了!Redis 在 172.18.0.3:6379 open~~~
而這樣才是從「不知道內網有什麼,純粹靠SSH -D探測」的真實流程起點


反思時光 💭

今天最大的體悟:搞懂原理真的比盲目努力重要太多了!!!

Proxychains 踩坑那段就是最好的例子——如果早點搞懂整個環境的運作方式,直接把 SSH Tunnel 開在 WSL 裡面,早就完工哩 xddd~但也因為這次實際踩坑,讓我們對 Windows、WSL 和 Docker 容器之間的網路結構更有印象!

滲透測試也是一樣的道理:工具只是手段,理解原理,才能處變不驚! xddd 當工具不如預期、測試結果跟想像不一樣時,才能試著釐清問題出在哪裡,再判斷下一步該怎麼做 ><

而這也是我們一直在練習的事——從理解滲透測試的基本原理,到拿到機器後的資訊蒐集、漏洞評估與利用,一步一步累積實作經驗。

明天就是我們的限時綜合練習啦!!!不知道到時候會遇到什麼挑戰 xddd

那我們就明天見啦~


上一篇
Day 27— 不再只是複製貼上!用 Docker 搞懂 SSH 的 -L、-D、-R
下一篇
Day 29 — 限時綜合練習:檢查自己的流程有沒有漏洞
系列文
《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言