0x00 前言在域滲透中,獲得了域控制器權限後,需要獲得域用戶的登錄信息,包括域用戶登錄的IP地址和登錄時間。通常使用的方法是查看域控制器的登錄日誌(Eventid=4624)。然而,人工從登錄日誌(Eventid=4624)中篩選出域用戶登錄的IP地址和登錄時間需要耗費大量時間,不僅無效數據多,而且需要多次判斷,所以我們需要編寫程序來實現這個功能。
在實際使用過程中,為了能夠適配多種環境,還需要支持本地和多種協議的遠程登錄。於是本文將要分享我的實現方法,開源兩個工具,記錄細節。
0x01 簡介本文將要介紹以下內容:
通過EventLogSession實現
通過WMI實現
開源代碼
0x02 通過EventLogSession實現通過查詢資料發現,通過EventLogSession不僅支持解析本地日誌內容,還支持通過RPC遠程解析日誌,下面介紹關於EventLogSession的開發細節
1.輸出Eventid=4624的日誌內容C Sharp實現代碼:
usingSystem;
usingSystem.Diagnostics.Eventing.Reader;
namespaceTest1
{
classProgram
{
staticvoidMain(string[]args)
{
varsession=newEventLogSession();
stringLogName='Security';
stringXPathQuery='*[System/EventID=4624]';
EventLogQueryeventLogQuery=newEventLogQuery(LogName,PathType.LogName,XPathQuery)
{
Session=session,
TolerateQueryErrors=true,
ReverseDirection=true
};
using(EventLogReadereventLogReader=newEventLogReader(eventLogQuery))
{
eventLogReader.Seek(System.IO.SeekOrigin.Begin,0);
do
{
EventRecordeventData=eventLogReader.ReadEvent();
if(eventData==null)
break;
Console.WriteLine(eventData.FormatDescription());
eventData.Dispose();
}while(true);
}
}
}
}以上代碼能夠查詢本地日誌並輸出日誌的完整內容
2.xml格式解析為了便於提取內容,可以選擇將輸出內容轉換為xml格式
關鍵代碼:
Console.WriteLine(eventData.ToXml());輸出內容示例:
從xml格式中,可直接提取出EventRecordID,關鍵代碼:
XmlDocumentxmldoc=newXmlDocument();
xmldoc.LoadXml(eventData.ToXml());
XmlNodeListrecordid=xmldoc.GetElementsByTagName('EventRecordID');
Console.WriteLine(recordid[0].InnerText);提取TargetUserName需要先取出Data的內容,再做一個篩選,關鍵代碼:
XmlNodeListdata=xmldoc.GetElementsByTagName('Data');
foreach(XmlNodevalueindata)
{
if(value.OuterXml.Contains('TargetUserName'))
{
Console.WriteLine(value.InnerText);
}
}這裡我們一共需要篩選出以下屬性:
TargetUserSid
TargetDomainName
TargetUserName
IpAddress
在做字符匹配時,由於格式固定,所以我們可以從固定偏移位置得到對應的屬性,避免多次判斷,提高查詢效率
關鍵代碼:
XmlNodeListdata=xmldoc.GetElementsByTagName('Data');
StringtargetUserSid=data[4].InnerText;
StringtargetDomainName=data[6].InnerText;
StringtargetUserName=data[5].InnerText;
StringipAddress=data[18].InnerText;3.篩選判斷條件為了篩選出有效登錄信息,這裡對targetUserSid和ipAddress的長度做了判斷,targetUserSid長度需要大於9,ipAddress長度需要大於8
關鍵代碼:
XmlNodeListdata=xmldoc.GetElementsByTagName('Data');
StringtargetUserSid=data[4].InnerText;
StringtargetDomainName=data[6].InnerText;
StringtargetUserName=data[5].InnerText;
StringipAddress=data[18].InnerText;
if(targetUserSid.Length9ipAddress.Length8)
{
Console.WriteLine(targetUserSid);
Console.WriteLine(targetDomainName);
Console.WriteLine(targetUserName);
Console.WriteLine(ipAddress);
}4.支持篩選指定時間內的日誌可以通過修改搜索條件實現,關鍵代碼:
stringXPathQuery='(Event/System/EventID=4624)andEvent/System/TimeCreated/@SystemTime='2022-01-26T02:30:39'andEvent/System/TimeCreated/@SystemTime='2022-01-26T02:30:39'andEvent/System/TimeCreated/@SystemTime=20210526ANDTimeGenerated=20210526ANDTimeGenerated=20220426';
ManagementScopes=newManagementScope('root\\CIMV2');
SelectQueryq=newSelectQuery(queryString);
ManagementObjectSearchermos=newManagementObjectSearcher(s,q);
intflagTotal=0;
intflagExist=0;
foreach(ManagementObjectoinmos.Get())
{
flagTotal++;
StringMessage=o.GetPropertyValue('Message').ToString();
intpos1=Message.LastIndexOf('SecurityID');
intpos2=Message.LastIndexOf('AccountName');
intpos3=Message.LastIndexOf('AccountDomain');
intpos4=Message.LastIndexOf('LogonID');
intpos5=Message.LastIndexOf('SourceNetworkAddress');
intpos6=Message.LastIndexOf('SourcePort');
intlength1=pos2-pos1-16;
intlength2=pos4-pos3-20;
intlength3=pos3-pos2-17;
intlength4=pos6-pos5-27;
if(length10||length20||length30||length40)
continue;
StringtargetUserSid=Message.Substring(pos1+14,length1);
StringtargetDomainName=Message.Substring(pos3+17,length2);
StringtargetUserName=Message.Substring(pos2+15,length3);
StringipAddress=Message.Substring(pos5+24,length4);
{
Console.WriteLine('[+]EventRecordID:'+o.GetPropertyValue('RecordNumber'));
Console.WriteLine('TimeCreated:'+o.GetPropertyValue('TimeGenerated'));
Console.WriteLine('UserSid:'+targetUserSid);
Console.WriteLine('DomainName:'+targetDomainName);
Console.WriteLine('UserName:'+targetUserName);
Console.WriteLine('IpAddress:'+ipAddress);
flagExist++;
}
}
Console.WriteLine('Total:'+flagTotal+',Exist:'+flagExist);
}
}
}5.支持遠程登錄關鍵代碼:
varopt=newConnectionOptions();
opt.Username='TEST\\Administrator';
opt.Password='Password@123';
ManagementScopes=newManagementScope('\\\\192.168.1.1\\root\\CIMV2',opt);將以上代碼整合,得出最終代碼,代碼已上傳至github,地址如下:
https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpGetUserLoginIPWMI.cs
代碼支持以下功能:
可使用csc.exe進行編譯,支持3.5和4.0
支持本地和遠程日誌解析,遠程日誌解析使用WMI方式
支持判斷條件,可篩選指定日期
自動提取信息:EventRecordID、TimeCreated、UserSid、DomainName、UserName和IpAddress
0x04 小結本文介紹了獲得域用戶登錄信息的實現細節,開源兩個工具SharpGetUserLoginIPRPC.cs和SharpGetUserLoginIPWMI.cs,在通信效率上,RPC要快於WMI。
Recommended Comments