如何構建完美的Dropbox(下)
接上文《如何構建完美的Dropbox(上)》
自動化攻擊方案
這還可以自動區分上面提到的兩種場景,通過監控 /sys/class/net/lan/carrier和/sys/class/net/wan/carrier,我們可以檢測LAN和WAN接口是否有一個或兩個連接。
如果你希望自動化網絡配置,一個選項是監控這些文件,如果LAN接口是活動的,則假定這是一個處于中間位置的人的場景,而如果LAN接口沒有載體,則繼續執行“未使用的端口”場景。如下所示:
- while [ `cat /sys/class/net/wan/carrier` == 0 ] ; do
- sleep 1
- done
- if [ `cat /sys/class/net/lan/carrier` == 0 ] ; then
- # execute "unused port" scenario
- else
- # execute Person in the Middle scenario
- fi
這樣,你就可以繼續選擇一個IP地址,或者使用DHCP請求一個IP地址。請注意,由于請求的字段不同,或者發送到服務器的填充字段不同,有時可能會區分Windows和Linux DHCP客戶機。花一些時間監控和微調你自己的DHCP請求可能是值得的,然后開始探索你連接的網絡。
Windows 10 DHCP請求(左)和Kali Linux(右)之間的區別
關于網絡訪問控制
你可能在會議室中發現了一個未使用的網絡端口,但是很可能會受到網絡訪問控制(NAC)檢查。從802.1x到連接新設備上的服務以檢查諸如防病毒配置等服務的網絡服務器,它們的形式多種多樣。如果新設備無法通過檢查,則交換機端口將禁用或配置為受限VLAN,而無法訪問真正有趣的系統,真令人失望!
解決此類控件的一種簡單方法是對現有設備執行中間人攻擊,這可能是PC,打印機,甚至是IP電話。在許多情況下,打印機等設備無法執行802.1x身份驗證,因此在該特定網絡端口上將其禁用。在其他情況下,設備具有在網絡上的必要授權,因此,網絡端口已分配給正確的VLAN。中間設備的人需要做的就是確保它發送的任何流量看起來都和受害者的一樣,這樣開關就不會檢測到任何不正常的東西。如果在一個端口上檢測到不止一個MAC地址,那么可以配置許多交換機關閉一個端口,這是你真的不希望發生的事情!
為此,我在閱讀了這篇文章后,創建了一個簡單的shell腳本,該腳本設置了適當的iptables規則以使任何來自R1S的流量似乎來自受害者。可以在GitHub上的slimjim腳本的舊版本中找到該過程的基礎。從本質上講,要弄清楚被攔截設備的MAC和IP地址,然后使用Linux ebtables(第2層)和iptables(第3層)規則來確保從person -in- middle設備到更廣泛網絡的所有流量都來自被攔截設備的MAC和IP地址。如果你還希望能夠與被攔截的設備進行交互,請選擇要使用的上游設備的MAC和IP地址,并將其偽裝成該設備。鑒于該裝置所處的特殊位置,直接與受害者相連,你可以選擇任何上游裝置來偽裝成它。
早期的slimjim依賴于手動將可到達設備的MAC地址和IP地址分別添加到ARP和路由表中,它還要求操作員使用tcpdump -nneli lan -Q in這樣的命令來識別被攔截設備的MAC和IP地址,并在運行腳本之前執行一些手動配置。當前版本的slimjim為你完成了所有這些工作,并將觀察到的DNS流量映射到相關地址。不過需要python腳本,這在資源受限的設備上可能不可行!
一旦配置了網橋,即使沒有識別出受害者的詳細信息,網絡訪問控制解決方案也應該能夠連接到受害者,執行所需的任何身份驗證過程,并相應地激活端口。
從網絡訪問控制中竊取憑據
一個有用的技巧是了解網絡訪問控制實際上是如何工作的,在某些情況下,我們已經看到,NAC解決方案使用SSH或SMB之類的協議建立到新設備的經過身份驗證的連接,并提供可以獲取和重用的憑據。此連接用于執行目錄、或驗證驗證防病毒軟件是否是最新的等等。在這些端口上運行合適的蜜罐服務可能會導致明文憑據(或等價的哈希)泄漏,這些憑證通常是高度特權帳戶,能夠登錄到所有連接到網絡的工作站!
不幸的是,802.1x解決方案并非如此!
網絡命名空間
Linux自2002年以來一直支持名稱空間約有18年,但是對于很多人來說,它們仍然是一個謎。存在用于各種不同資源類別的名稱空間,例如進程、文件系統、網絡、用戶ID等。這些名稱通常由Docker工具之類的容器工具使用,以限制所包含系統可以看到的資源。它們還可以幫助防止命名沖突,就像很多人的名字叫John一樣。
在這個實例中,我們感興趣的是網絡名稱空間,因為它們提供了一種方法,使網絡接口及其整個網絡堆棧僅對系統上運行的程序的子集可見。通過將網絡接口分配給網絡名稱空間,只有在該網絡名稱空間內運行的進程才能看到或訪問該接口。
Opsec注意事項
如前所述,由R1S產生的無意的網絡流量(如DNS查找)可能會泄露整個游戲。避免這種情況的一種方法是在網絡名稱空間(例如pitm)中隔離以太網接口,并仔細考慮在該名稱空間中啟動哪些進程。當前的slimjim腳本也會處理這個問題,在名稱空間內創建一個屏幕實例。在pitm名稱空間內啟動的任何進程都可以訪問以太網接口,而在名稱空間外創建的進程則不能。這樣,我們就可以確保不會有意外的流量擊中目標的網絡,暴露他們的存在!
安裝slimjim
要在R1S上安裝slimjim,應執行以下步驟。首先,在以太網接口上禁用IPv6:
- cat << EOF > /etc/sysctl.d/01-disable-ipv6.conf
- # disable IPv6 on Ethernet interfaces
- #
- net.ipv6.conf.wan.disable_ipv6 = 1
- net.ipv6.conf.lan.disable_ipv6 = 1
- EOF
不幸的是,Linux IPv6堆棧執行了一些自動沖突檢測,這可能允許意外的流量傳出到以太網接口。接下來,安裝所需的軟件包:
- apt install -y dnsmasq tcpdump ebtables redsocks iftop python3-pypcap python3-dpkt python3-pyroute2 python3-iptables python3-setuptools python3-cffi
我們希望防止Redsocks自動啟動,因為除非它在pitm名稱空間內運行,否則它將無法訪問網絡接口。 slimjim腳本將在命名空間內為我們啟動它。我們還希望將Redsock偵聽的IP地址更新為位于以太網橋上。可以這樣做:
- systemctl disable --now redsocks
- sed -i -e 's|log = .*;|log = "stderr"|' -e 's|daemon = on;|daemon = off;|' -e 's|local_ip = 127.0.0.1;|local_ip = 169.254.0.1;|' /etc/redsocks.conf
在本文中,我們實際上不會使用redsocks,但是在此文章中使用了類似的“中間人”技術,其中提供了有關如何使用它的信息。
接下來,我們從GitHub克隆slimjim存儲庫:
- git clone https://github.com/RoganDawes/slimjim
- slimjim/slimjim
運行slimjim將在第一個窗口中使用slimjim腳本啟動屏幕會話。你將看到它等待受害者的數據包,以識別要使用的MAC和IP地址。
確認受害者的MAC和IP地址
注意:在運行slimjim腳本之前,LAN和WAN接口之間不會通過任何流量。我建議你利用前面介紹的自動化技術,通過檢測連接了LAN接口的活動接口來自動啟動slimjim,或者,在斷開目標網絡連接之前,手動啟動slimjim。
一旦確定了受害者的MAC和IP地址,就可以關閉該窗口。另一個窗口將運行一個名為pitm_snoop.py的python腳本,該腳本監視網絡流量以識別相鄰設備并更新ARP和路由表。這是必要的,因為slimjim阻止R1S執行自己的ARP查找以避免暴露。
為廣播域中的設備添加ARP條目,并將名稱映射到IP地址
另一個窗口將運行dnsmasq實例,該實例配置為僅執行基于本地“主機文件”的查找。主機文件也由pitm_snoop.py根據觀察到的來往受害者的DNS流量來創建和更新。通過這種方式,你可以了解被攔截設備正在與哪些主機通信,并了解網絡布局。如果你希望使用目標服務器的名稱服務器,則可以編輯名稱空間的自定義/etc/resolv.conf文件(通常可在/etc/netns/pitm/resolv.conf中找到)。
另一種弄清楚受害者與誰交談的方法是運行iptraf。slimjim啟動一個iptraf實例,以用戶友好的方式顯示通過pitm橋的網絡流量。
處理網絡命名空間的復雜性
使用網絡名稱空間來隔離以太網接口有時會讓事情變得有些棘手,特別是當你需要能夠將流量從控制接口引導到網橋時,或者反之亦然。為了解決這個問題,我們創建了一對虛擬網絡接口,分別為169.254.20.1(名稱空間內部)和169.254.20.2(名稱空間外部)。使用這些可以將流量路由進出命名空間。我的首選方法是使用SSH隧道,如下所示:
在R1S上,為pitm名稱空間內的虛擬接口添加一個/etc/hosts條目:
- 169.254.20.1 pitm
將以下條目添加到你的個人〜/ .ssh / config文件中:
- Host pitm
- User root
- ProxyJump nanopi-r1
- RemoteForward 1080
- Host nanopi-r1
- User root
- RemoteForward 1080
然后,如果你在R1S上安裝了ssh公鑰,你可以使用以下命令直接ssh到pitm名稱空間:
- ssh pitm
這利用了OpenSSH的“ProxyJump”功能,并在另一個內部建立了一個ssh連接的隧道,以便到達命名空間內的虛擬接口。這將啟用簡潔的功能,例如使用本地計算機上的Wireshark進行遠程網絡監視:
- ssh pitm tcpdump -nli pitm -w - | wireshark -k -i -
當然,其他所有SSH端口轉發技巧也都可用。
此基于slimjim的解決方案不適用于使用802.1x-2010的網絡,該網絡可以使用MACsec加密受害者與交換機之間的數據包。
本文翻譯自:https://sensepost.com/blog/2020/making-the-perfect-red-team-dropbox-part-2/