一、环境
一个简单的域环境,3台机器即可,一个server2012,win7,,win10
二、开始初始的认识内网
在我们日常渗透中,我们进入企业去进行渗透的时候都是处于一个域的环境下,简单来说域一类网络服务而在服务器旁边旁挂着一个防火墙,或者IDS和IPS旁,后面是一个核心交换机,镜像口可以将所有的流量导入IDS,IPS入侵检测或者入侵防御设备中,所以检测到我们流量,然后通过流量匹配规则来进行一个告警
像平常的扫描等一些,就会被防火墙检测到,平常的sql注入是有一个waf这个是防web方面的漏洞,等我们这些都绕过以后只是拿到了一个网站的权限或者APP或小程序,而我们想要入侵内网,就需要拿到一个入口,通过这个入口拿下DMZ区域(一般两张网卡一张对外一张对内),提权之后,用DMZ当做一个代理,之后跳入内网中
还有一种方法内网进入,通过VPN,而这种方式更多的是需要我们通过钓鱼邮件,有可能看到VPN
当然内网扫描中(看内网中有几个服务器)还有一个防护,名为态势感知,这个是专门监管网络流量的,假如网络流量变大,它立马就会检测内网是否能匹配它的规则,假如我们用nmap去扫描直接就会被禁掉
pass:IDS有两种模式,一种是在它的主干链路上直接安装,一种是旁挂,但是我们目前用到的基本是旁观而旁挂基本上就是镜像口把网络流量导入IDS
HIDS:主机日志检测
三、案例进行研究
3.1简单描述一下HIDS(研究一下检测思路)
代理都会有埋点
代理会主动连接我们的服务端,检测的是服务端的日志(apache,系统,ssh登录)
apache的日志
假设我们在暴力破解,那么服务端就会生成日志
日志回传给IDS,而在IDS中有一定的规则去匹配它
规则文件:
行了说了这么多,用九头蛇暴力破解去试一下
看看服务端日志,每一个规则以sshd开头
看一下IDS规则怎么匹配的,方法是正则sshd
之后直接会报警
当然这只是入侵检测,还没牵扯到防御,所以内网渗透是很难成功
3.2 推荐几款软件
作用:取证,监控,隔离(国内顺丰快递用的就是这一套)
Welcome :: Velociraptor - Digging deeper!
pass:
w5:
雾织:(类似于w5要收费100w)
国外有两款开源的也好用:n8n.io,shuffler.io
四、正式开始讨论
4.1协议前的花絮
我们的域管理员就仿佛最高权限的司令官可以登录域内所有的机器上去
我们可以看到/domai中是有我们的域管理员的
域用户:
本地用户:
假如我们现在拿下了一台服务器的权限,那我们要做的第一件事就是信息收集
我们一看这个很明显就知道我们是加入到域里面去了
想知道域控制器的ip怎么办?
直接ping或者看DNS
网上有一个工具fscan
下下来之后,根据gethub上面的说明使用
缺点:动静太大了
扫出来咱们的域成员
单扫存活主机有可能避免造成流量过大报警
原因nmap是通过三次握手探测的,而icmp是通过ping来进行探测的
这里有篇文章总结的挺详细的
内网存活主机探测的几种方法 - 春告鳥 - 博客园 (cnblogs.com)
在内网中tasklist查看进程有用可以查看是不是有杀毒软件等进程
在内网中因为域管理员可以登录到域内所有电脑的情况,我们不能用域管理员直接登录,不然我们的明文密码和hash就会被泄露
解释一下吧:windows登录流程是winlogon进程和lass进程还有一个是SAM进程
winlogon是我们登录的框框,账号密码发给lsass进程后一份明文保留在程序,一份hash加密存到SAM中去
这意味一个问题lass进程的明文能不能被抓取出来?
刚好有这一款工具mimikatz
gentilkiwi/mimikatz: A little tool to play with Windows security (github.com)
尝试一下吧,下载好后,导入,进行提权使用
之后输入
sekurlsa::logonpasswords
这一下后我们可以看到把lsass进程中的所有明文倒出来啦
抓取密码被补丁限制了,但是我依然抓到了一个hash值
那在win10和win2012后怎么抓取呢?这里推荐一篇文章
win10及win2012之后系统的明文抓取方式 - XHC远方 - 博客园 (cnblogs.com)
可以看到要求是很苛刻的
服务器不能莫名其妙重启,所以是锁屏,但也只是在win2012 service版本下是有效的
尝试一下吧;
在win系统下进入注册表,新加一个
改成1
这样后息屏或者重新登录我们才可以抓到,此时我们就抓到了管理员的明文密码,可以横向渗透了
那我们要是没有这么理想的环境(域管理员登录过),没有明文,只有hash呢
接下来研究两个登录协议:
横向工具(psexec):可以不需要密码只需要我们的hash
下载地址(微软工具集):learn.microsoft.com/zh-cn/sysinternals/downloads/psexec
可以看到我们这里可以直接登录上去而且权限很高,前提是我们要有域管理员的账号和密码,直接横向
但是我们要研究的是hash横向不是密码横向
我们通过mimikatz再次抓取一下hash,但是这只有一个我们要的是LMhash和NThash这两个需要组合
我们的cs也可以抓hash,但是cs要求我们需要给本地种一个马(这个自己下去查资料),通过学习发现win7后把LMhash废除了全部变成aad3的形式了(其实也是空的随便写都无所谓)
拿到hash
4.2开始了解协议 (HTLM)
NTLM 基础 介绍 | windows protocol (gitbook.io)
ntmshash生成方式详解:
全称是LAN Manager Hash, windows最早用的加密算法,由IBM设计。
LM Hash的计算:
-
用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
-
密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
-
再分7bit为一组,每组末尾加0,再组成一组
-
上步骤得到的二组,分别作为key 为 "
KGS!@#$%
"进行DES加密。 -
将加密后的两组拼接在一起,得到最终LM HASH值。
# -*- coding:utf-8 -*-
"""
@Author: lingchenwudiandexing
@contact: 3131579667@qq.com
@Time: 2024/3/29 15:09
@version: 1.0
"""
#coding=utf-8
import re
import binascii
from pyDes import *
def DesEncrypt(data, Des_Key):
k = des(binascii.a2b_hex(Des_Key), ECB, pad=None)
encrypt_str = k.encrypt(data)
return binascii.b2a_hex(encrypt_str)
def group_just(length, text):
text_area = re.findall(r'.{%d}' % int(length), text)
text_area_padding = [i + '0' for i in text_area]
hex_str = ''.join(text_area_padding)
hex_int = hex(int(hex_str, 2))[2:].rstrip("L")
if hex_int == '0':
hex_int = '0000000000000000'
return hex_int
def lm_hash(password):
pass_hex = password.upper().encode("ascii").hex().ljust(28, '0')
left_str = pass_hex[:14]
right_str = pass_hex[14:]
left_stream = bin(int(left_str, 16)).lstrip('0b').rjust(56, '0')
right_stream = bin(int(right_str, 16)).lstrip('0b').rjust(56, '0')
left_stream = group_just(7, left_stream)
right_stream = group_just(7, right_stream)
left_lm = DesEncrypt(b'KGS!@#$%', left_stream.encode('ascii')).decode('ascii')
right_lm = DesEncrypt(b'KGS!@#$%', right_stream.encode('ascii')).decode('ascii')
return left_lm + right_lm
if __name__ == '__main__':
hash = lm_hash("123456")
print(hash)
LM加密算法存在一些固有的漏洞
-
首先,密码长度最大只能为14个字符
-
密码不区分大小写。在生成哈希值之前,所有密码都将转换为大写
-
查看我们的加密过程,就可以看到使用的是分组的DES,如果密码强度是小于7位,那么第二个分组加密后的结果肯定是
aad3b435b51404ee
,如果我们看到lm hash的结尾是aad3b435b51404ee
,就可以很轻易的发现密码强度少于7位 -
一个14个字符的密码分成7 + 7个字符,并且分别为这两个半部分计算哈希值。这种计算哈希值的方式使破解难度大大降低,这使得14个字符的密码的有效强度等于,7个字符的密码的两倍,该密码的复杂度明显低于
14个字符的密码的理论强度。
-
Des密码强度不高
不同版本的支持
登录别人电脑视为网络,登录自己电脑视为本地
登录别人电脑的时候它不可能以明文匹配,所以只能对你明文再次进行加密然后进行比对
这是域环境那在工作组环境是怎么去比对呢
类似于证书中的签名
-
用户登录客户端电脑
-
(type 1)客户端向服务器发送type 1(协商)消息,它主要包含客户端支持和服务器请求的功能列表。
-
(type 2)服务器用type 2消息(质询)进行响应,这包含服务器支持和同意的功能列表。但是,最重要的是,它包含服务器产生的Challenge。
-
(type 3)客户端用type 3消息(身份验证)回复质询。用户接收到步骤3中的challenge之后,使用用户hash与challenge进行加密运算得到response,将response,username,challeng发给服务器。消息中的response是最关键的部分,因为它们向服务器证明客户端用户已经知道帐户密码。
-
服务器拿到type 3之后,使用challenge和用户hash进行加密得到response2与type 3发来的response进行比较。如果用户hash是存储在域控里面的话,那么没有用户hash,也就没办法计算response2。也就没法验证。这个时候用户服务器就会通过netlogon协议联系域控,建立一个安全通道,然后将type 1,type 2,type3 全部发给域控(这个过程也叫作Pass Through Authentication认证流程)
-
域控使用challenge和用户hash进行加密得到response2,与type 3的response进行比较
ok,此时此刻我们终于了解完了通信
接下来再看一篇文章
NTLM协议详解-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/2227928前面的我们都聊过了我们现在看看下面这个
上传我们的马
ok上线了,并且我们的cobalt strike抓到了本地的hash
我们现在模拟工作组环境,不模拟域环境 ,进行抓包验证
客户端:我有签名能力但是我不能签名
看回包
如图所示,可以看到在NTLMv2 Response响应消息下的NTProofStr字段,该字段的值是用做数据签名的Hash(HMAC-MD5)值,目的是保证数据的完整性。
而对于NTLMv2 Hash和NTProofStr,有如下计算公式。
· NTLMv2 Hash = HMAC-MD5(unicode(hex((upper(UserName)+DomainName))), NTLM Hash)
· NTProofStr = HMAC-MD5(challenge + blob, NTLMv2 Hash)
详细的:我上面所说文章
但是没用,如果中途篡改其中一个MIC立马就不一样了,我们只是了解一个流程
4.3漏洞概述