2021-01-26 HTB Waldo walkthrough

目标机IP:10.10.10.87

信息搜集

照常进行nmap扫描
nmap -sC -sV -A -oN 10.10.10.87.txt 10.10.10.87

nmap.png

发现80端口开放,扫描目录无果,进去探测一番

Get user.txt

枚举

点进网站发现没什么东西,顺手点开源码发现list.js有一些值得注意的内容

function writeList(listNum, data){ 
    var xhttp = new XMLHttpRequest();
    xhttp.open("POST","fileWrite.php",false);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.send('listnum=' + listNum + '&data=' + data);
    if (xhttp.readyState === 4 && xhttp.status === 200) {
        return xhttp.responseText;
    }else{
    }
}


function deleteList(listNum){ 
    var xhttp = new XMLHttpRequest();
    xhttp.open("POST","fileDelete.php",false);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.send('listnum=' + listNum);
    if (xhttp.readyState === 4 && xhttp.status === 200) {
        listLists();
        return xhttp.responseText;
    }else{
    }
}

function readDir(path){ 
    var xhttp = new XMLHttpRequest();
    xhttp.open("POST","dirRead.php",false);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.send('path=' + path);
    if (xhttp.readyState === 4 && xhttp.status === 200) {
        return xhttp.responseText;
    }else{
    }
}


function readFile(file){ 
    var xhttp = new XMLHttpRequest();
    xhttp.open("POST","fileRead.php",false);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.send('file=' + file);
    if (xhttp.readyState === 4 && xhttp.status === 200) {
        return xhttp.responseText;
    }else{
    }
}

这四个函数分别利用XHR访问四个不同的php文件,而且貌似进行一定程度上敏感的读写操作,十分值得注意。
那么现在就构造出了一种攻击思路:
将反弹webshell写入一个php文件->对文件进行访问获取shell
但是接下来进行枚举过程中,发现了一些问题:

首先读所有的文件,把代码读下来:

fileRead.php
<?php
if($_SERVER['REQUEST_METHOD'] === "POST"){
$fileContent['file'] = false;
header('Content-Type: application/json');
if(isset($_POST['file'])){

    header('Content-Type: application/json');
    $_POST['file'] = str_replace( array("../", "..\""), "", $_POST['file']); ../ .."
    if(strpos($_POST['file'], "user.txt") === false){
        $file = fopen("/var/www/html/" . $_POST['file'], "r");
        $fileContent['file'] = fread($file,filesize($_POST['file']));  
        fclose();
    }
    }
    echo json_encode($fileContent);
}


fileWrite.php
<?php

if($_SERVER['REQUEST_METHOD'] === "POST"){
    header('Content-Type: application/json');
    $condition['result'] = false;
    if(isset($_POST['listnum'])){
        if(is_numeric($_POST['listnum'])){
            $myFile = "/var/www/html/.list/list" . $_POST['listnum'];
            $handle = fopen($myFile, 'w');
            $data = $_POST['data'];
            fwrite($handle, $data);
            fclose();
            $condition['result'] = true;
        }
    }
    echo json_encode($condition);
}

fileDelete.php
<?php
if($_SERVER['REQUEST_METHOD'] === "POST"){
    if(isset($_POST['listnum'])){
        header('Content-Type: application/json');
        if(is_numeric($_POST['listnum'])){
            $myFile = "/var/www/html/.list/list" . $_POST['listnum'];
            unlink($myFile);
            header('Content-Type: application/json');
            echo '[true]';
        }else{
        header('Content-Type: application/json');
        echo '[false]';
    }
}else{
    header('Content-Type: application/json');
    echo '[false]';
}
}

dirRead.php
<?php

if($_SERVER['REQUEST_METHOD'] === "POST"){
    if(isset($_POST['path'])){
        header('Content-type: application/json');
        $_POST['path'] = str_replace( array("../", "..\""), "", $_POST['path']);
        echo json_encode(scandir("/var/www/html/" . $_POST['path']));
    }else{
        header('Content-type: application/json');
        echo '[false]';
    }
}

发现文件写入过程中对文件名有is_numeric限制,文件读取和目录读取过程有preg_replace进行目录限制。
因此没办法直接写入php文件进去,思路中断。

换个思路

preg_replace是可以绕过的,利用重写的方式:
..././ => ../
对各种系统里的文件进行读取后,在用户目录下发现了令人感兴趣的东西:
ssh的私钥
最终通过ssh私钥登录成功获取到user.txt

getuser.png

Get root.txt

更换账户

从我的角度来讲这点还是挺难的
最开始还是用LinEnum来进行枚举,然而没有发现任何有用的线索
一时之间卡在这里不知道该怎么处理才好
后面突然想到之前拿到的monitor私钥在nobody账户,那么用nobody直接ssh连接monitor不知是否可行
尝试后发现可行:

ssh

发现shell受限,利用ssh强制转换shell
ssh -i .ssh/.monitor monitor@10.10.10.87 -t sh
app-dev目录下有个logmonitor应用,查看logmonitor.c可以看到能够利用logMonitor监控各种日志

/*******************************************
*
*This is an application to print out common log files
*
********************************************/

#include "logMonitor.h"

void printUsage() {
    printf("Usage: %s [-aAbdDfhklmsw] [--help]\n", PROGRAMNAME);
}


int main(int argc, char** argv){
        int opt = 0;
        char filename[26];
        {
                //temporary variables for parsing
                static struct option long_options[] ={
                        /* These options don’t set a flag.
                        We distinguish them by their indices. */
                        {"auth", no_argument, 0, 'a'},
                        {"alternatives", no_argument, 0, 'A'},
                        {"btmp", no_argument, 0, 'b'},
                        {"dpkg", no_argument, 0, 'd'},
                        {"daemon", no_argument, 0, 'D'},
                        {"faillog", no_argument, 0, 'f'},
                        {"help", no_argument, 0, 'h'},
                        {"kern", no_argument, 0, 'k'},
                        {"lastlog", no_argument, 0, 'l'},
                        {"messages", no_argument, 0, 'm'},
                        {"syslog", no_argument, 0, 's'},
                        {"wtmp", no_argument, 0, 'w'},
                        {0,0,0,0}
                };
                //parse the command line arguments
                int option_index = 0;
                while((opt = getopt_long (argc, argv, "aAbdDfhklmsw", long_options, &option_index)) != -1 ){
                        switch (opt) {
                                case 'a' :
                                        strncpy(filename, "/var/log/auth.log", sizeof(filename));
                                        printFile(filename);
                                        break;
                                case 'A' :
                                        strncpy(filename, "/var/log/alternatives.log", sizeof(filename));
                                        printFile(filename);
                                        break;
                                case 'b' :
                                        strncpy(filename, "/var/log/btmp",sizeof(filename));
                                        printFile(filename);
                                        break;
                                case 'd' :
                                        strncpy(filename, "/var/log/daemon.log",sizeof(filename));
                                        printFile(filename);
                                        break;
                                case 'D' :
                                        strncpy(filename, "/var/log/dpkg.log",sizeof(filename));
                                        printFile(filename);
                                        break;
                                case 'f' :
                                        strncpy(filename, "/var/log/faillog",sizeof(filename));
                                        printFile(filename);
                                        break;
                                case 'h' :
                                        printUsage();
                                        exit(1);
                                case 'k' :
                                        strncpy(filename, "/var/log/kern.log",sizeof(filename));
                                        printFile(filename);
                                        break;
                                case 'l' :
                                        strncpy(filename, "/var/log/lastlog",sizeof(filename));
                                        printFile(filename);
                                        break;
                                case 'm' :
                                        strncpy(filename, "/var/log/messages",sizeof(filename));
                                        printFile(filename);
                                        break;
                                case 's' :
                                        strncpy(filename, "/var/log/syslog",sizeof(filename));
                                        printFile(filename);
                                        break;
                                case 'w' :
                                        strncpy(filename, "/var/log/wtmp",sizeof(filename));
                                        printFile(filename);
                                        break;
                                default:
                                        printUsage();
                                        exit(EXIT_FAILURE);
                        }
                }
        }
        return 1;
}

但是实际运行,并没有足够权限,这一点十分奇怪。
进入目录下v0.1版本,发现0.1版本有权限,上网搜索一下是linux capabilities的问题。
用户sh有tac权限,直接读取 root.txt
完事

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • writeup链接: https://pan.baidu.com/s/1mip9WaG 密码: ypza 获取权限...
    苏州暮雨阅读 923评论 0 0
  • 概述 目标靶机是一台Linux机器,部署了一个网站,但是网站被人日了,黑客留下了一些线索和工具在服务上,我们需要利...
    半夜菊花茶阅读 962评论 0 0
  • 总算是挺过了期末12门的魔鬼考试日程,迎来了寒假......这次寒假打算学的还挺多的,也希望自己能坚持学习,把知识...
    byc_404阅读 773评论 0 2
  • 推荐指数: 6.0 书籍主旨关键词:特权、焦点、注意力、语言联想、情景联想 观点: 1.统计学现在叫数据分析,社会...
    Jenaral阅读 5,711评论 0 5
  • 城空了,有树长出来 我的城死了 铸起它的人,杀死它的人 不愿因为这件事而骄傲 一座城的终结 永远因为终结这件事而显...
    于十六阅读 2,854评论 6 17