信息收集
端口扫描
使用nmap扫描之后,发现22,80,8000端口开放。
基于OpenSSH和Apache版本,主机可能运行的是 Ubuntu 18.04
访问80端口,该网站适用于教育类型的公司:
目录爆破
使用feroxbuster工具对其目录进行爆破。
没找到有用的东西。
子域名枚举
使用wfuzz对主域名进行子域名探测,发现存在exam子域。
访问子域名。发现该站点是托管考试管理系统。
单击“admin”链接转到/admin/login.php,它只是弹出一个消息框:
继续对子域名的目录进行探测。
漏洞利用
SQL注入漏洞
使用searchsplouit搜索历史漏洞。
通过历史漏洞搜索,发现其payload:poc=take_exam&id=1' AND 4755=4755 AND 'VHNu'='VHNu
经过测试之后,发现该版本还存在sql注入。
使用sqlmap枚举数据库
首先判断注入点。用法:sqlmap -u'http://exam.seventeen.htb/?p=take_exam&id=1'-p id --technique B --batch
接下来,使用--dbs列出数据库。
列出数据库里面的表。
接着读出表里面的用户。
在表里面,发现都指导了这个../oldmanagement/files/文件目录。
访问一下试试,发现是一个登录框。
接着继续读数据库里面的表。发现存在user表。
然后读里面的内容。发现了一些登录用户。
继续读下去。
密码解密
可以使用CrackStation:https://crackstation.net/来进行解密
或者使用somd5解密。密码为:autodestruction
使用id和密码成功登录进行。
命令执行漏洞
发现是一个上传界面。我上传了一个php木马。
里面有一个pdf,看看里面有什么东西可以利用。是一份成绩单。
在里面发现了一个新的域名。
添加到/etc/hosts,然后访问看看。
查看版本信息
访问/CHANGELOG可以判断其版本,或者使用f12查看。
源代码分析
下载源代码,对其进行代码审计一下看看下载处的代码逻辑。
download.php很简单:
storage它从数据库的表中获取一行,并从结果中获取文件名。它返回readfile(files/[stud_no]/[filename])。
所以它应该在/var/www/oldmanagement/files/31234/0xdf.php.需要一个目录来放在我的上传文件旁边。download.php使用store_id获取路径,但也许我可以/files/31234直接访问
在这个文件夹中运行feroxbuster找到一个papers目录!
访问之后,发现提示报错。
首先上传一个php文件,然后将文件名更改为.htaccess
getshell
然后访问上传的php木马文件,成功getshell。
使用script /dev/null -c bash进行外壳升级
主机信息收集
继续翻一下,机器里面的这些文件,找一些有用的东西。
发现数据库的登录密码。
$dBUsername = "root";
$dbPassword = "2020bestyearofmylife";
在mastermailer/config/config.inc.php我会找到这个连接字符串。
在oldmanagement/admin/conn.php另一个连接中,也含有一些信息。
ssh登录
使用上面获取到的登录密码进行登录。
获取user.txt
登录之后,发现存在user.txt
使用ls -la 判断当前用户的权限。
邮件提示
发现一个邮件,有 kavi 的邮件/var/mail:
邮件提到了一个新项目、一个私有注册表(有一些问题)和一个旧记录器被替换为loglevel(一个公开可用的 JavaScript记录应用程序)
查看监听端口,有一堆东西只在 localhost 上监听:
通过一些研究,我可以将其余这些端口分为:
- Roundcube 的邮件服务器 - 110、143、993、995
- 用于各种网络服务器的 MySQL - 3306
- 域名系统 - 53
- 网站转发到 Docker - 8081 (exams), 8082 (oldmanager)
- 未知 - 4873,但在.npm上面的文件夹中引用。
老记录器
该电子邮件提到了“旧记录器”,并提升了“注册表”。
然后使用npm在本地注册表中搜索哪些日志记录模块。
运行npm install并将其指向本地存储库
将其下载到当前目录,从而创建一个node_modules目录。在那里,我看到了一堆模块,包括db-logger:
文件分析
该模块由一个 JavaScript 文件和一个package.json
该package.json文件描述了该模块
在js文件里面翻到了登录密码。
var mysql = require('mysql'); var con = mysql.createConnection({ host: "localhost", user: "root", password: "IhateMathematics123#", database: "logger" }); function log(msg) { con.connect(function(err) { if (err) throw err; var date = Date(); var sql = `INSERT INTO logs (time, msg) VALUES (${date}, ${msg});`; con.query(sql, function (err, result) { if (err) throw err; console.log("[+] Logged"); }); }); }; module.exports.log = log
继续使用ssh进行登录。、
使用ls -la 查看有那些文件。
有一个.npmrc文件,它配置如何npm运行,将默认注册表设置为本地注册表:
权限提升
kavi 用户也可以访问/opt/app
创建模块步骤:https://docs.npmjs.com/creating-node-js-modules
恶意的js模块
使用npm login,发现是注册被禁用。
我在上面注意到有一个.npmrc文件/home/kavi设置了这个用户使用的存储库。我将尝试将其更改为指向我的主机,然后让 Verdaccio 的实例在那里提供恶意程序包。
创建节点模块。
创建一个loglevl目录,然后使用npm init 开始本地的模块
创建一个loglevel目录,然后编辑index.js文件。
本地搭建
使用docker,本地搭建节点模块
注册模块
运行docker pull verdaccio/verdaccio(以 root 身份、使用sudo或使用我的用户在docker组中)以获取容器映像的副本。
发布模块
设置.npmrc文件
运行文件
运行脚本,sudo /opt/app/startup.sh
成功获得shell。
获取root.txt
总结
首先通过信息收集中的常规操作,先端口扫描,然后继续目录爆破,接着子域名枚举。发现一个登录页面,通过历史漏洞搜索,发现其存在sql注入漏洞,然后使用sqlmap枚举数据库。接着登录之后,发现可以上传文件,上传之后进行命令执行,命令执行获取shell之后,进行主机信息收集,搜索一些登录信息,然后ssh远程登录。登录之后,获取user.txt,接着发现一封邮件,然后根据提示,发现了node.js模块,然后进行恶意js的模块利用进行权限提升,接着获取root.txt。该靶机为困难模式的靶机,在gethsll的时候,有2种方法,权限提升到最高权限有3种方法。