Análise de linha do tempo · Aula 3 de 5
Construindo uma superlinha do tempo com Plaso
13 min de leitura
Um único artefato raramente revela o que aconteceu. A sequência entre vários artefatos revela: um programa foi executado, um arquivo foi aberto, uma unidade foi conectada, uma cópia apareceu nessa unidade. Uma superlinha do tempo reúne eventos de sistemas de arquivos, hives do registro, logs de eventos, históricos de navegadores e outras fontes em uma única lista ordenada por tempo. Esta aula constrói uma com o The Sleuth Kit e com o Plaso, reduz milhões de eventos aos minutos que importam e explica o erro mais comum na triagem: tratar os horários de cópia dos arquivos coletados como evidência.
Linhas do tempo do sistema de arquivos e superlinhas do tempo
Uma linha do tempo do sistema de arquivos lista apenas os registros de data e hora mantidos nos metadados do sistema de arquivos: no NTFS, os horários de $STANDARD_INFORMATION e $FILE_NAME abordados na Aula 3.2; no FAT, no ext4 e em outros, seus próprios campos de tempo. Sua construção é rápida, mas ela não diz nada sobre por que um horário mudou.
Uma superlinha do tempo acrescenta os registros de data e hora armazenados dentro dos arquivos: horários de execução do Prefetch, horários LastWrite das chaves do registro, registros de logs de eventos, dados de LNK e de Listas de Atalhos, visitas em navegadores. Cada linha passa então a ter um significado, como "última visita" ou "última execução". O custo é o volume: uma imagem completa de um sistema Windows costuma produzir milhões de eventos.
| Aspecto | Linha do tempo do sistema de arquivos | Superlinha do tempo |
|---|---|---|
| Fontes | Apenas metadados do sistema de arquivos | Sistema de arquivos mais artefatos dentro dos arquivos |
| Ferramentas típicas | fls + mactime (The Sleuth Kit) | Plaso (log2timeline.py, psort.py) |
| Significado do evento | Indicadores MACB | Texto de timestamp_desc por evento |
| Tamanho | De milhares a centenas de milhares de linhas | Frequentemente milhões de linhas |
| Melhor uso | Visão rápida da atividade de arquivos em um volume | Reconstrução da atividade do usuário e do sistema |
O método clássico: bodyfile e mactime
O The Sleuth Kit constrói uma linha do tempo do sistema de arquivos em duas etapas. Primeiro, fls -r -m E: -z America/Sao_Paulo -o 2048 usb.E01 > usb.body percorre o sistema de arquivos recursivamente (-r) e grava um bodyfile (-m, com E: como prefixo inserido antes de cada caminho); -z informa o fuso horário do sistema original, de que o fls precisa para converter os horários locais do FAT. -o 2048 é o setor inicial da partição. Depois, mactime -b usb.body -d -z UTC > usb.csv ordena o bodyfile e o exibe como texto delimitado por vírgulas (-d) em UTC (-z).
O bodyfile (formato TSK 3.x) tem 11 campos separados por barras verticais: MD5|name|inode|mode_as_string|UID|GID|size|atime|mtime|ctime|crtime. Os quatro horários são segundos desde a época Unix. No NTFS, o fls grava uma segunda linha para cada arquivo, com ($FILE_NAME) acrescentado ao nome, contendo os horários de $FN.
As colunas de saída do mactime são Data, Tamanho, Tipo, Modo, UID, GID, Meta e Nome do Arquivo. Tipo é a cadeia MACB: m modificado, a acessado, c metadados alterados, b criado. Uma linha com m.cb significa que três dos quatro horários compartilham aquele segundo.
Exemplo resolvido: lendo um horário de bodyfile
Uma linha do bodyfile para E:/Plans/agenda.docx tem crtime = 1773479721.
- 1773479721 ÷ 86.400 = 20.526 dias, com resto de 33.321 segundos.
- 20.526 dias após 1970-01-01 é 2026-03-14.
- 33.321 s = 9 h (32.400 s) + 921 s = 9 h 15 min 21 s.
- Resultado: 2026-03-14T09:15:21Z.
mactime -z UTCo exibe comoSat Mar 14 2026 09:15:21;-yexibe ISO 8601 em UTC em vez disso.
Arquitetura do Plaso
O Plaso ("Plaso Langar Að Safna Öllu") divide o trabalho em extração e saída, conectadas por um arquivo de armazenamento.
log2timeline.pyabre a fonte por meio do dfVFS, a camada de sistema de arquivos virtual do Plaso (que lê imagens E01 e brutas, partições, snapshots VSS e diretórios comuns). Ele executa analisadores sintáticos sobre cada arquivo e grava cada evento em um arquivo de armazenamento do Plaso (.plaso), baseado em SQLite.pinfo.pyinforma o que há em um arquivo de armazenamento: a versão do Plaso, cada sessão de extração e sua linha de comando, contagens de eventos por analisador sintático e avisos de extração.psort.pylê o arquivo de armazenamento, ordena por tempo, remove duplicatas, aplica filtros e grava a saída.psteal.pyexecuta a extração e a saída em uma única etapa, por exemplo,psteal.py --source usb.E01 -o dynamic -w usb.csv. As ferramentas separadas são melhores para o trabalho em casos: o arquivo de armazenamento pode ser filtrado novamente sem uma nova extração.
Analisadores sintáticos e predefinições. --parsers recebe uma lista de predefinições, analisadores sintáticos e plugins separados por vírgulas. Um prefixo ! exclui um deles. log2timeline.py --info lista todos. Predefinições úteis incluem win7 (Windows Vista e posteriores, que inclui o conjunto geral win_gen), webhist (históricos de navegadores) e linux; winreg é o analisador sintático do registro com todos os seus plugins. O analisador sintático mft lê diretamente um arquivo NTFS $MFT e gera tanto os horários de $SI quanto os de $FN; adicione-o pelo nome para que o $MFT coletado seja analisado independentemente do conteúdo de uma predefinição na sua versão do Plaso. Se você omitir --parsers, o Plaso escolhe uma predefinição com base no sistema operacional detectado; em uma pasta de triagem parcial, essa detecção pode falhar, portanto, especifique você mesmo os analisadores sintáticos.
Fontes. Uma fonte pode ser uma imagem (--partitions all ou --partitions 1,3 seleciona partições; --volumes all seleciona volumes APFS ou LVM; --vss_stores controla as cópias de sombra), um diretório, como uma coleta de triagem, ou um único arquivo. Executar log2timeline.py novamente com o mesmo --storage-file (e a mesma versão do Plaso) adiciona uma nova sessão, de modo que várias fontes podem compartilhar um arquivo de armazenamento. pinfo.py lista cada sessão separadamente.
Formatos e colunas de saída
psort.py -o dynamic grava um CSV com estas colunas padrão (escolha outras com --fields):
| Coluna | Conteúdo |
|---|---|
datetime | Horário do evento em ISO 8601, no fuso horário de saída |
timestamp_desc | O que esse registro de data e hora significa |
source / source_long | Tipo de fonte curto e longo, como FILE ou WEBHIST e uma descrição mais longa |
message | Descrição do evento legível por humanos |
parser | Cadeia de analisadores sintáticos, como mft ou sqlite/chrome_27_history |
display_name | O arquivo de origem do evento, como o Plaso o viu |
tag | Rótulos adicionados por plugins de análise ou pelo analista |
timestamp_desc é a coluna principal. O mesmo arquivo pode produzir eventos de "Horário de criação", "Horário de modificação do conteúdo", "Horário do último acesso" e "Horário de modificação dos metadados". Um histórico de navegador produz "Horário da última visita"; um arquivo Prefetch produz "Horário da última execução". Leia sempre essa coluna antes de afirmar o que um horário comprova.
-o l2tcsv é o formato legado do log2timeline com 17 campos fixos (date,time,timezone,MACB,source,sourcetype,type,user,host,short,desc,version,filename,inode,notes,format,extra). -o json_line grava um objeto JSON por evento, o que é adequado para scripts e plataformas de busca.
Fuso horário. O Plaso armazena os horários em UTC. A saída é em UTC por padrão; --output_time_zone UTC deixa isso explícito nas suas anotações. Algumas fontes armazenam o horário local sem fuso, como os registros de data e hora do FAT; log2timeline.py --timezone informa ao Plaso qual fuso assumir ao extraí-los. A Aula 3.5 aborda os erros de fuso horário em profundidade.
Escala e ruído: formule a pergunta primeiro
Não é possível ler milhões de linhas, e uma planilha do Excel tem um limite de 1.048.576 linhas. Trabalhe nesta ordem:
- Defina a pergunta e a janela de tempo antes de executar
psort.py, por exemplo, "o que aconteceu nas duas horas em torno da conexão USB?" Obtenha o horário de referência a partir de um artefato preciso (Aula 2.6). - Filtre por tempo com um filtro de eventos:
"date > DATETIME('2026-03-14T08:30:00') AND date < DATETIME('2026-03-14T10:30:00')". Escreva os horários do filtro em UTC. - Filtre por fonte com
data_type, por exemplo,"data_type contains 'chrome'", ou extraia apenas com os analisadores sintáticos de que precisa. - Pesquise palavras-chave, como um nome de arquivo ou número de série.
- Revise em um visualizador de CSV, como o Timeline Explorer, em uma planilha para janelas de tempo pequenas ou em uma plataforma colaborativa, como o Timesketch, que importa arquivos
.plasodiretamente.
Duplicatas, como um evento visto em um volume e em sua cópia de sombra, são mescladas por padrão; -a (--include_all) as mantém.
Coletas de triagem: horários de cópia não são evidência
Esta é a ressalva mais importante desta aula. Uma coleta de triagem é um conjunto de arquivos copiados do sistema em execução para uma pasta (ou um contêiner), mantendo seus caminhos originais. Quando o Plaso processa essa pasta, o analisador sintático filestat lê os horários atuais do sistema de arquivos das cópias no disco do analista. A menos que a ferramenta de triagem tenha preservado os horários originais, esses valores registram quando os arquivos foram coletados ou extraídos, não quando o usuário os criou ou alterou. Mesmo as ferramentas que restauram horários não conseguem restaurar os horários de $FN.
Os horários originais do NTFS permanecem no $MFT coletado. Analise-o com o analisador sintático mft e exclua filestat para a pasta de triagem: --parsers 'win7,mft,!filestat'. Use aspas simples, pois muitos shells tratam ! dentro de aspas duplas como um comando de histórico. Além disso, display_name mostra o caminho dentro da coleta, como /data/triage/C/Users/ana/...; mapeie-o de volta para o caminho original C:\ no seu relatório.
Exemplo resolvido: uma linha do tempo, duas fontes
A pasta do caso /cases/c042 contém triage/ (a coleta do Windows, incluindo C/$MFT) e usb.E01 (uma partição FAT32). O fuso horário do sistema, lido no registro na Aula 2.2, é E. South America Standard Time (America/Sao_Paulo, UTC−3). O Plaso é executado na imagem oficial do Docker, com a pasta do caso montada em /data.
| Etapa | Comando |
|---|---|
| Registrar a versão | docker run --rm log2timeline/plaso log2timeline.py --version |
| Extrair a pasta de triagem | docker run --rm -v /cases/c042:/data log2timeline/plaso log2timeline.py --parsers 'win7,mft,!filestat' --storage-file /data/case.plaso /data/triage |
| Adicionar a imagem USB | docker run --rm -v /cases/c042:/data log2timeline/plaso log2timeline.py --partitions all --timezone Europe/Lisbon --storage-file /data/case.plaso /data/usb.E01 |
| Verificar o resultado | docker run --rm -v /cases/c042:/data log2timeline/plaso pinfo.py -v /data/case.plaso |
| Gerar a saída da janela de tempo | docker run --rm -v /cases/c042:/data log2timeline/plaso psort.py --output_time_zone UTC -o dynamic -w /data/window.csv /data/case.plaso "date > '2026-03-14 08:30:00' AND date < '2026-03-14 10:30:00'" |
pinfo.py mostra duas sessões, contagens diferentes de zero para mft, prefetch, chrome_27_history e filestat (apenas da sessão USB), além de quaisquer avisos. Seis linhas de window.csv entre 09:15 e 09:25Z são apresentadas a seguir (mensagens abreviadas; datetime reduzido a segundos e seu +00:00 escrito como Z):
| datetime | timestamp_desc | source | parser | message |
|---|---|---|---|---|
| 2026-03-14T09:15:21Z | Horário da última execução | LOG | prefetch | EXCEL.EXE foi executado |
| 2026-03-14T09:15:58Z | Horário de criação | FILE | mft | \Users\ana\AppData\Roaming\Microsoft\Windows\Recent\budget.xlsx.lnk ($SI) |
| 2026-03-14T09:18:40Z | Horário de modificação do conteúdo | FILE | mft | \Users\ana\Documents\budget.xlsx ($SI) |
| 2026-03-14T09:18:40Z | Horário de modificação do conteúdo | FILE | filestat | FAT:/Plans/budget.xlsx (usb.E01) |
| 2026-03-14T09:21:12Z | Horário de criação | FILE | filestat | FAT:/Plans/budget.xlsx (usb.E01) |
| 2026-03-14T09:23:05Z | Horário da última visita | WEBHIST | sqlite/chrome_27_history | bing.com/search?q=clear+recent+files |
Interpretando as linhas: o Excel foi executado às 09:15:21Z. O arquivo LNK criado às 09:15:58Z marca a primeira abertura de budget.xlsx a partir daquele caminho (Aula 2.4). O documento foi salvo às 09:18:40Z. Na unidade USB, a cópia tem o mesmo horário de modificação, mas um horário de criação posterior, 09:21:12Z: o padrão clássico de um arquivo copiado para uma nova mídia, já que a cópia mantém o horário de modificação e define um novo horário de criação. Às 09:23:05Z, o usuário pesquisou como limpar arquivos recentes. Antes de relatar 09:21:12Z, corrobore esse horário com uma conexão de dispositivo que abranja esse momento (eventos Partition/Diagnostic 1006, setupapi.dev.log ou horários de chegada do USBSTOR) e com o número de série do volume (Aula 2.6); a Aula 3.4 aborda essa correlação.
Documentação para repetibilidade
Registre como a linha do tempo foi produzida: a versão do Plaso (e a tag ou o digest da imagem do Docker), cada linha de comando, a lista de analisadores sintáticos, as configurações de fuso horário, o hash de cada fonte e a saída de pinfo.py. O arquivo de armazenamento mantém cada linha de comando de extração, mas suas anotações também devem abranger os filtros do psort. A ISO/IEC 27041 exige que você demonstre que um método é adequado à pergunta e foi validado. A ISO/IEC 27042 exige que a análise seja repetível e reproduzível. Uma imagem de contêiner com versão fixada permite que outro perito execute novamente os mesmos comandos e obtenha as mesmas linhas.
Foco no exame: Espere ter de informar um horário UTC proveniente de uma linha da linha do tempo; portanto, leiatimestamp_desce o analisador sintático antes de decidir o que o horário comprova. Saiba que os horários do sistema de arquivos dos arquivos em uma coleta de triagem refletem a coleta e que os horários originais do NTFS vêm do$MFTcoletado. Seja capaz de converter um valor de época de um bodyfile e de reconhecer o padrão de cópia em que o horário de criação é posterior ao horário de modificação.
Pontos principais
- Uma linha do tempo do sistema de arquivos contém apenas horários de metadados; uma superlinha do tempo acrescenta horários de dentro dos artefatos e cresce para milhões de eventos.
fls -r -mgrava um bodyfile com horários em segundos desde a época;mactime -b body -d -z UTCo ordena em linhas MACB.log2timeline.pyanalisa as fontes e as grava em um arquivo.plasobaseado em SQLite;pinfo.pyo verifica;psort.pyfiltra, remove duplicatas e gravadynamic,l2tcsvoujson_line.- Em uma pasta de triagem, exclua
filestate analise o$MFTcoletado com o analisador sintáticomft. - Defina primeiro a pergunta e a janela de tempo, filtre em UTC e corrobore as linhas principais com outras fontes.
- Registre versões, linhas de comando, filtros e hashes para que outro perito possa reproduzir a linha do tempo.