2021-01-26 HTB Waldo walkthrough

目標(biāo)機(jī)IP:10.10.10.87

信息搜集

照常進(jìn)行nmap掃描
nmap -sC -sV -A -oN 10.10.10.87.txt 10.10.10.87

nmap.png

發(fā)現(xiàn)80端口開放喳瓣,掃描目錄無果,進(jìn)去探測(cè)一番

Get user.txt

枚舉

點(diǎn)進(jìn)網(wǎng)站發(fā)現(xiàn)沒什么東西藻治,順手點(diǎn)開源碼發(fā)現(xiàn)list.js有一些值得注意的內(nèi)容

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{
    }
}

這四個(gè)函數(shù)分別利用XHR訪問四個(gè)不同的php文件乔夯,而且貌似進(jìn)行一定程度上敏感的讀寫操作蒂培,十分值得注意搀缠。
那么現(xiàn)在就構(gòu)造出了一種攻擊思路:
將反彈webshell寫入一個(gè)php文件->對(duì)文件進(jìn)行訪問獲取shell
但是接下來進(jìn)行枚舉過程中缰泡,發(fā)現(xiàn)了一些問題:

首先讀所有的文件烧颖,把代碼讀下來:

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]';
    }
}

發(fā)現(xiàn)文件寫入過程中對(duì)文件名有is_numeric限制弱左,文件讀取和目錄讀取過程有preg_replace進(jìn)行目錄限制。
因此沒辦法直接寫入php文件進(jìn)去炕淮,思路中斷拆火。

換個(gè)思路

preg_replace是可以繞過的,利用重寫的方式:
..././ => ../
對(duì)各種系統(tǒng)里的文件進(jìn)行讀取后涂圆,在用戶目錄下發(fā)現(xiàn)了令人感興趣的東西:
ssh的私鑰
最終通過ssh私鑰登錄成功獲取到user.txt

getuser.png

Get root.txt

更換賬戶

從我的角度來講這點(diǎn)還是挺難的
最開始還是用LinEnum來進(jìn)行枚舉们镜,然而沒有發(fā)現(xiàn)任何有用的線索
一時(shí)之間卡在這里不知道該怎么處理才好
后面突然想到之前拿到的monitor私鑰在nobody賬戶,那么用nobody直接ssh連接monitor不知是否可行
嘗試后發(fā)現(xiàn)可行:

ssh

發(fā)現(xiàn)shell受限乘综,利用ssh強(qiáng)制轉(zhuǎn)換shell
ssh -i .ssh/.monitor monitor@10.10.10.87 -t sh
app-dev目錄下有個(gè)logmonitor應(yīng)用憎账,查看logmonitor.c可以看到能夠利用logMonitor監(jiān)控各種日志

/*******************************************
*
*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;
}

但是實(shí)際運(yùn)行,并沒有足夠權(quán)限卡辰,這一點(diǎn)十分奇怪胞皱。
進(jìn)入目錄下v0.1版本,發(fā)現(xiàn)0.1版本有權(quán)限九妈,上網(wǎng)搜索一下是linux capabilities的問題反砌。
用戶sh有tac權(quán)限,直接讀取 root.txt
完事

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萌朱,一起剝皮案震驚了整個(gè)濱河市宴树,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晶疼,老刑警劉巖酒贬,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件又憨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锭吨,警方通過查閱死者的電腦和手機(jī)蠢莺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來零如,“玉大人躏将,你說我怎么就攤上這事】祭伲” “怎么了祸憋?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肖卧。 經(jīng)常有香客問我蚯窥,道長,這世上最難降的妖魔是什么喜命? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任沟沙,我火速辦了婚禮,結(jié)果婚禮上壁榕,老公的妹妹穿的比我還像新娘矛紫。我一直安慰自己,他們只是感情好牌里,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布颊咬。 她就那樣靜靜地躺著,像睡著了一般牡辽。 火紅的嫁衣襯著肌膚如雪喳篇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天态辛,我揣著相機(jī)與錄音麸澜,去河邊找鬼。 笑死奏黑,一個(gè)胖子當(dāng)著我的面吹牛炊邦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播熟史,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼馁害,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蹂匹?” 一聲冷哼從身側(cè)響起碘菜,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后忍啸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仰坦,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年吊骤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缎岗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片静尼。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡白粉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鼠渺,到底是詐尸還是另有隱情鸭巴,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布拦盹,位于F島的核電站鹃祖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏普舆。R本人自食惡果不足惜恬口,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沼侣。 院中可真熱鬧祖能,春花似錦、人聲如沸蛾洛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轧膘。三九已至钞螟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谎碍,已是汗流浹背鳞滨。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蟆淀,地道東北人拯啦。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像扳碍,于是被迫代替她去往敵國和親提岔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • writeup鏈接: https://pan.baidu.com/s/1mip9WaG 密碼: ypza 獲取權(quán)限...
    蘇州暮雨閱讀 929評(píng)論 0 0
  • 概述 目標(biāo)靶機(jī)是一臺(tái)Linux機(jī)器笋敞,部署了一個(gè)網(wǎng)站碱蒙,但是網(wǎng)站被人日了,黑客留下了一些線索和工具在服務(wù)上,我們需要利...
    半夜菊花茶閱讀 967評(píng)論 0 0
  • 總算是挺過了期末12門的魔鬼考試日程赛惩,迎來了寒假......這次寒假打算學(xué)的還挺多的哀墓,也希望自己能堅(jiān)持學(xué)習(xí),把知識(shí)...
    byc_404閱讀 784評(píng)論 0 2
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)喷兼、焦點(diǎn)篮绰、注意力、語言聯(lián)想季惯、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析吠各,社會(huì)...
    Jenaral閱讀 5,724評(píng)論 0 5
  • 城空了贾漏,有樹長出來 我的城死了 鑄起它的人,殺死它的人 不愿因?yàn)檫@件事而驕傲 一座城的終結(jié) 永遠(yuǎn)因?yàn)榻K結(jié)這件事而顯...
    于十六閱讀 2,862評(píng)論 6 17