RDP日志取证与清除

注意:本文乃阅读文章所写的笔记

原文链接在:

https://mp.weixin.qq.com/s?__biz=Mzg4MzA4Nzg4Ng==&mid=2247483915&idx=1&sn=c362bdbde3cde022c1ea10de6229eb4c&chksm=cf4d8d6af83a047c351194957f8b368f41531279c08e6035e16b0b6b85f873f1ade52208738e&mpshare=1&scene=23&srcid=&sharer_sharetime=1569592419145&sharer_shareid=64458b89777349122de4fc747d336e14#rd

RDP登录方式

  • 爆破登录:多次登录失败&登录成功
  • 管理员登录:账号密码、凭据
  • console登录

用到的工具

  • wevtutil (系统自带)
  • LogParser
  • powershell (系统自带)
  • regedit (系统自带)

取证关键点

  • 登录IP
  • 登录IP和端口
  • 登录时间
  • 登录客户端和主机名
  • 登录后操作日志
  • 服务端敏感文件
  • 服务端登录的服务器IP
  • 服务端浏览器记录

登录成功
EventID=4624,从安全日志中获取登录成功的客户端登录IP、登录源端口、登录时间等信息

显示凭证登录
EventID=4648

常用的事件ID

LogParser用法

H:\日志分析器>LogParser.exe -i:EVT -o:DATAGRID "SELECT TimeGenerated as LoginTim
e,EXTRACT_TOKEN(Strings,5,'|') as username,EXTRACT_TOKEN(Strings, 8, '|') as Log
onType,EXTRACT_TOKEN(Strings, 17, '|') AS ProcessName,EXTRACT_TOKEN(Strings, 18,
 '|') AS SourceIP FROM C:\Users\jiushi\Desktop\test.evtx where EventID=4624"

要查询别的事件的话改ID就好了,记得将evtx的路径换成自己的路径

LogParser的参数说明

  • -i:输入文件的格式
  • -o:输出格式
  • sql语句

完整的语句格式:

LogParser –i:输入文件的格式 –o:输出格式 “SQL语句”

SQL查询语句分析:

SELECT TimeGenerated as LoginTim
e,EXTRACT_TOKEN(Strings,5,'|') as username,EXTRACT_TOKEN(Strings, 8, '|') as Log
onType,EXTRACT_TOKEN(Strings, 17, '|') AS ProcessName,EXTRACT_TOKEN(Strings, 18,
 '|') AS SourceIP
  • TimeGenerated –生成时间
  • LoginTime –登录时间
  • username –登录的usernaem
  • LogonType –登录类型
  • ProcessName –进程名
  • 8 SourceIP –来源IP
  • EXTRACT_TOKEN(Strings,数字,’|’) –提取令牌,这个好像是用来隔开的

上述所说的表名出自日志里的xml

例如添加个UserId上去,语句就别成了

H:\日志分析器>LogParser.exe -i:EVT -o:DATAGRID "SELECT TimeGenerated as LoginTim
e,EXTRACT_TOKEN(Strings,5,'|') as username,EXTRACT_TOKEN(Strings, 8, '|') as Log
onType,EXTRACT_TOKEN(Strings, 17, '|') AS ProcessName,EXTRACT_TOKEN(Strings, 18,
 '|') as UserSid,EXTRACT_TOKEN(Strings, 19, '|') AS SourceIP  FROM C:\Users\jius
hi\Desktop\test.evtx where EventID=4720"

具体sql构造得参考xml

提取RDP登录日志
EventID=4624/4625

C:\Users\jiushi\Desktop>wevtutil epl Microsoft-Windows-TerminalServices-LocalSes
sionManager/Operational ./LocalSessionManager.evtx

客户登录日志
EventID=1024

wevtutil epl Microsoft-Windows-TerminalServices-RDPClient/Operational ./ClientActiveXCore.evtx

注册表取证
使用py来查询注册表得到需要的信息

#@author:九世
#@time:2019/9/28
#@file:qz.py

import winreg

class Diaocha(object):
    def __init__(self):
        self.path=winreg.HKEY_USERS

    def client_name(self):
        data=''
        datas=''
        jg=[]
        jg2=[]
        try:
            key=winreg.OpenKey(self.path,None,0,winreg.KEY_ALL_ACCESS)
            ckey=winreg.QueryInfoKey(key)[0]
            for c in range(int(ckey)):
                name=winreg.EnumKey(key,c)
                if len(name)>8 and len(name)<54:
                    jg.append(name)

            winreg.CloseKey(key)
            dk=winreg.OpenKey(self.path,'{}\\Volatile Environment'.format(jg[0]),0,winreg.KEY_ALL_ACCESS)
            yk=winreg.QueryInfoKey(dk)[0]
            for v in range(yk):
                gs=winreg.EnumKey(dk,v)
                dv=winreg.OpenKey(self.path,'{}\\Volatile Environment\\{}'.format(jg[0],gs),0,winreg.KEY_ALL_ACCESS)
                qzhi_value=winreg.QueryValueEx(dv,'SESSIONNAME')
                client_naems=winreg.QueryValueEx(dv,'CLIENTNAME')
                data+='会话名称:{}'.format(qzhi_value[0])
                data+=' 登录本机的客户端名称:{}'.format(client_naems[0])
            winreg.CloseKey(dv)
            winreg.CloseKey(dk)
            print('[+] :{}'.format(data))
            dk = winreg.OpenKey(self.path, '{}\\Software\\Microsoft\\Terminal Server Client\\Servers'.format(jg[0]), 0, winreg.KEY_ALL_ACCESS)
            vt=winreg.QueryInfoKey(dk)[0]
            for y in range(int(vt)):
                values = winreg.EnumKey(dk, y)
                jg2.append(values)
            winreg.CloseKey(dk)
            for u in jg2:
                dk=winreg.OpenKey(self.path,'{}\\Software\\Microsoft\\Terminal Server Client\\Servers\\{}'.format(jg[0],u),0,winreg.KEY_ALL_ACCESS)
                quzhi=winreg.QueryValueEx(dk,'UsernameHint')[0]
                print('[+] 登录过的RDP连接:{} 登录使用的用户名:{}'.format(u,quzhi))
                winreg.CloseKey(dk)
            dk=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,'SYSTEM\\CurrentControlSet\\services\\eventlog\\Security')
            qz=winreg.QueryValueEx(dk,'MaxSize')[0]
            print('[+] 日志最大限制:{}'.format(qz))
            winreg.CloseKey(dk)

            dk=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,'System\\CurrentControlSet\\Control\\Terminal Server\\WinStations\RDP-Tcp',0,winreg.KEY_ALL_ACCESS)
            portnumber=winreg.QueryValueEx(dk,'PortNumber')[0]
            print('[+] 本机RDP端口:{}'.format(portnumber))
            winreg.CloseKey(dk)

        except Exception as r:
            print('Error {}'.format(r))

if __name__ == '__main__':
    obj=Diaocha()
    obj.client_name()

结果如下:

几个注册表说明

HKEY_USERS\SID\Volatile Environment\X.CLIENTNAME --登录过本机的客户端的Computer名
HKEY_USERS\SID\Software\Microsoft\Terminal Server Client\Servers\* --你登录过的RDP的IP
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security --日志最大限制
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp --本机RDP端口

清除日志
暴力删除:
1.删除注册表项
2.找到日志直接整个删除(C:\Windows\System32\winevt\Logs\Security_new.evtx)
3.使用恢复软件查询留在系统删除区的文件,在删一次日志

温柔删除:
根据EventID单条删除

wevtutil epl Security C:\Windows\System32\winevt\Logs\Security_new.evtx /q:"*[System[(EventRecordID!=6810)]]" /ow:true

根据IP批量删除
(只是删除了日志里的,注册表里的记录项并没有删)

wevtutil epl Security C:\Windows\System32\winevt\Logs\Security_new.evtx /q:"*[EventData[(Data[@Name='IpAddress']!='127.0.0.1')]]" /ow:true

Github仓库:

https://github.com/422926799/note/tree/master/%E8%87%AA%E5%B7%B1%E5%86%99%E7%9A%84%E5%B7%A5%E5%85%B7/RDP%E5%8F%96%E8%AF%81

参考链接:
[RDP日志取证与清除](


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:RDP日志取证与清除

本文作者:九世

发布时间:2019-09-28, 17:10:36

最后更新:2019-09-28, 17:12:05

原始链接:http://422926799.github.io/posts/896062dd.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录