web

小菜鸟的渗透测试课程设计

Posted by nop on 2020-11-23
Words 2.1k In Total

本文所有内容仅用作实验,某些步骤或技术细节并未阐述,很多操作并不完全切合实际情况

环境概述

  • 环境清单:
    1. Microsoft Windows Server 2012 R2 Datacenter
    2. Microsoft Windows 10 Enterprise 2016 LTSB

本部分涉及一个域控(windows server 2012)、一个对外开放的web服务器(windows server 2012)、一个普通的工作机器(winodws 10),此外域内其实还有一个server 2008,但考虑到设备性能本次并未使用。

考虑到是模拟测试,目的在于对内网相关基础做一个巩固,所以在很多环节上做了较大程度的简化,与实际情况会存在较大的偏差;各部分功能描述如下:

  1. 域控机器:DC,仅做主域控
  2. web服务器:win2012, 域内机器,对外网开放web服务
  3. winodws 10: win10, 域内机器,用作模拟内部员工使用的工作电脑
  4. windows 10:attacker, 域外机器, 用作攻击机

关于域环境的搭建,过程简单,这里不再赘述,只做一部分关键记录:实验环境的关键点在于同一台物理设备如何实现各系统的网段隔离以及域内的普通机器如何出网,好在VMWare可将网卡虚拟化即同一个虚拟机可以新增多个网卡,所以网络设置时,对web服务器win2012设置两个网卡,一个用作内网机器间的通信,一个用作模拟出网,即物理机(攻击机)可以连通。

磨刀不误砍柴工-外网信息收集

因为设备性能限制,外网部分未设置DNS服务器即所有操作都是直接对ip进行操作

实际的信息收集涉及面广内容多在渗透测试中也有着举足轻重的地位,前期完善的信息收集有助于更快的拿下目标,此处测试仅对web页面做十分简要的信息收集,目的在于通过web页面存在的漏洞得到web服务器进行后续的一些操作。其实也算不上信息收集,这里的环境我使用了织梦的cms,因为是测试,所以内容并不完善,不需要收集如子域名、旁站、端口服务等等,只是简要的搭建了一个可访问的web环境。换句话说,很容易就能找到web端的漏洞点。

先用nmap查看一下基本信息:

  • 端口(只开放了80端口):
    Alt
  • 服务器版本(中间件是Nginx):
    Alt
  • 服务器操作系统(windows server 2012):
    Alt

nmap扫描的结果用处似乎并不大,而且直接扫动静也蛮大的,还是直接访问站点,从页面可以明显的看到网站用的什么CMS,在UI未被完全修改的情况可使用插件Wappalyzer识别网站相关信息:

Alt

在页面底部可以看到cms版本:

Alt

随便查一下,可以发现这个版本的CMS存在多个CVE:

Alt

因为临时搭建的本地测试环境,所以sql注入在这里用处并不大,这里选择文件上传漏洞上传web shell尝试拿到服务器执行权限进行后续操作。根据网上的文章,漏洞点在登录后内容中心的发表文章功能页:

Alt

纸上得来终觉浅-尝试getshell

前期信息收集得到了一个文件上传的漏洞,用Burp suite截包后修改数据包绕过文件类型限制上传一句话木马(这里设想为最简单情景,所以不考虑杀软):

  1. 随便选择一个图片上传:
    Alt

  2. bp截包后更改数据:
    Alt

  3. 重新发包,成功上传木马文件并得到上传路径(/uploads/allimg/201203/1-20120321550B27.php):
    Alt

连上木马,做一些简要信息获取:

  1. 连接木马getshell:
    Alt

  2. 查看重要路径,大致了解服务器的防护:

    • C:\Program Files (x86)\
      Alt
    • C:\Program Files\
      Alt

可以发现除了开启了防火墙之外并没有其他的杀软,所以考虑直接上传代理工具以方便后续攻击,这里使用nc反弹shell的方式实现命令执行:

  1. 上传nc,因为是Windows的服务器,所以系统本身并没有nc,需要自行上传,同时上传需要的工具(这里不考虑杀软):
    Alt

  2. 创建计划任务,因为这里连到的shell是adminstrator账户权限,使用system权限执行计划任务,不能使用同权限的账户执行,否则会在桌面出现cmd窗口:
    Alt

  3. 在攻击端监听9999端口,并执行计划任务:
    Alt
    计划任务执行之后,监听的cmd窗口成功返回shell:
    Alt
    并且此时的shell窗口具有本地机器的system权限:
    Alt

  4. 删除上传的webshell,以及创建的计划任务
    为了避免过早的被发现,先清除不必要的上传文件和操作痕迹:
    Alt
    Alt

心急吃不了热豆腐-内网信息收集

查看目标机器基本信息:

先查看一下 ip信息
Alt
可以看到,该机器设置了双网卡,另一个网卡用于内网使用,也即是说这台机器在内网中,尝试查看域信任关系:
Alt
幸运的是这台机器刚好在域内(当然这是之前假设搭的环境),并且得到了域名nop.local,接下来需要摸清楚域内的一些基本情况:

  1. 域用户:
    Alt
    因为拿到的机器是本地用户,所以这里的域用户信息暂时没有用处

  2. 域内组:
    Alt
    重点关注Domain Admins, Domain Computers, Domain Controllers:
    Alt
    因为拿到的机器是win2012,所以把目标放在win10或win2008:
    Alt
    可以发现只有win10能够访问,并且得到其ip,而且通过域内组还知道了域控为DC即域名为DC.nop.local

  3. 再次查看本地安装的产品以及开启的服务
    Alt
    Alt

基本了解机器的情况之后,通过注册表尝试抓取本地密码hash:
Alt

通过windows自带的工具certutil将目标文件编码,然后写入txt文件,接着将编码后的内容复制到本地再解码即可实现”文件传输“:
Alt
Alt

这种思路适合小文件,大文件的话似乎就只能在自己的服务器上开个ftp,然后上传至服务器或者直接通过前面上传的工具在目标本地解密,当让不删除上传的webshell也可以直接通过webshell上传、下载文件。

这里直接通过上传的mimikatz解密sam文件:
Alt
当然,因为这里是直接上传mimikatz在目标机器上执行,所以其实可以直接读取sam文件的密码hash:
Alt

接着在通过工具获取内存中的密码hash,当然也可以通过windows系统本身的rundll32.exe(.\rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump 624 C:\temp\lsass.dmp full)将dump进程lsass进而获取内存中的密码hash,这使用前一种方法:
Alt
很不幸这里并没有域内用户的密码。

山穷水尽疑无路,柳暗花明又一村

查看credential目录发现存在凭据滥用问题:
Alt

将此文件下载到本地(文件是系统保护文件,需在文件管理器中显示隐藏文件取消勾选隐藏系统保护文件一项)

通过mimikatz计算masterkey用于解密该文件(因为这里是直接在目标上执行,所以可以直接获取masterkey,实际情况并不会如此操作):

Alt

得到masterkey之后,直接解密凭据,获取其中保存的明文密码:
Alt

可以发现,里面保存了域管账号的密码。

有头有尾-权限维持与痕迹清理

既然得到了域管理员的账号密码,就可以导出域内所有用户hash,以及查看域内其他机器所有资源,因为这里仅是演示实验,所以只同步域内所有用户hash:

  1. 使用kekeo以nop\administrator的身份请求一个TGT,并将其注入到当前session:
    Alt

  2. 使用mimikatz同步域内hash:
    Alt

从结果可以看到,同步的hash中是存在krbtgt以及域管账号的hash,对于krbtgt的hash可用于生成黄金票据,用于后续的权限维持:
Alt

拿到必要信息之后(比如查看实验中域内机器win10上可能存在的重要资源等),删除上传的工具,并清除注入到内存中的票据,结束对目标的测试


You are welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them.