Shell items are data structures used to identify various elements within the Windows folder hierarchy. Where a simple ASCII listing the path to a folder or file would suffice, we instead have shell items, and paths reconstructed by parsing shell item ID lists. Some of these shell items are 22 bytes in length, and contain just a GUID, which needs to be translated into something that the analyst can recognize, such as "My Computer" or "Control Panel". Other shell items refer to other resources, including folders, and need to be parsed differently. More on that later.
Shell items have been part of Windows systems well before talk of shellbags first came up. Shell items are included in Windows shortcut/LNK files, which have been available on Windows systems for quite some time. However, it's only been within the passed 12 to 18 months that there's been much real recognition of the fact that LNK files contain shell items, and this recognition has been due, in part, to some of the popular tools used to parse LNK files actually parsing this information. Even today, there are a number of tools available and in common use for parsing LNK files that do not parse the shell items. In just the passed year along, I've examined a number of Windows systems on which LNK files were created for devices (in most cases, digital cameras) that consisted solely of a header and a shell item ID list, and did not contain a LinkInfo block. What this means is that many of the commonly used tools simply show nothing in the output. Why does this matter at all? Well, take a look at this blog post regarding what we're doing wrong with respect to LNK parsing, and when you're done, read the follow-up blog post, found here.
Do I expect to see intruders manipulating LNK files in a manner similar to what is described here? No, I don't...that doesn't mean that it won't happen, however. What I have seen when it comes to LNK files is the use of LNK files that are comprised solely of a header and a shell item ID list, but no LinkInfo block, which means that most of the tools in common use within the community will not show data.
A while back, Sophos released a tool to help protect users from the exploitation of the CVE-2010-2568 vulnerability. Given that this vulnerability is almost three years old, it makes me wonder who often the analysis of shell item ID lists within LNK files is missed.
Many of the shell item structures include DOSDate format time stamps, which correlate to the modified, accessed, and created dates of the object resource (usually, a file or a folder). A couple of things to keep in mind with respect to these times, particularly when the platform you're analyzing is formatted NTFS:
- The DOSDate time stamps within the shell items, particularly for resources located on the system itself, were originally stored within the MFT as FILETIME objects. What this means is that we have a significant loss in granularity, going from 64-bits based on 100-nanosecond intervals, to 32-bits with the seconds multiplied times 2. If the seconds value for the original FILETIME time stamp is 5, then what's stored in the DOSDate format is 10...and a difference of 5 seconds can be significant, particularly in timeline analysis, and if you don't know enough about the data structures to explain it.
- Systems from Vista on up do not, by default, update last accessed times through normal user activity, such as opening files.
- Target resources listed in shellbags can be modified by activity and processes outside the purview of the shellbags artifacts.
Many types of shell items also include a good deal of embedded information within the structure itself. Some include file sizes, and can be used to demonstrate changes in file size over time (on Vista and Windows 7 systems, you may be able to demonstrate the changes in contents via analysis of the files in VSCs). I've also seen some shell items that contain a lot of information, which each section marked by an individual GUID that I needed to look up on the MS site to determine what it meant...in one case, one of the embedded GUIDs marked the last modification time of the resource, while another marked the creation date.
Where are shell items used?
Artifacts that include shell items include:
- LNK files
- Jump Lists (both auto* and custom*, on both Win7 and 8)
- MeunOrder subkeys
- ComDlg32 subkey values (Vista+)
- Windows 8 USRCLASS.DAT (Photos artifacts)
Overall, what is the usefulness of understanding these artifacts? One of the things that I've seen throughout my time as an analyst is that if we don't know about something, we're not likely to incorporate it into our analysis process. The purpose of this blog post is to raise awareness of these artifacts, and get folks looking at them in more than just training courses.
With respect to shellbags artifacts, things changed drastically between XP and Win7. With XP, the shellbags artifacts are located in the NTUSER.DAT, and the NodeSlot value within each BagMRU subkey points to a Bag\Shell subkey, which may have an ItemPos* value (i.e., a value whose name starts with "ItemPos", followed by what looks like it might be a screen resolution setting). If so, very often this value contains a number of concatenated shell items that provide a directory listing...yes, that's exactly right, the contents of the folder. I know of one analyst who has used this information to demonstrate the contents of encrypted volumes.
With Vista (and subsequently, Win7), these artifacts were moved to the USRCLASS.DAT hive, and no longer make use of the NodeSlot value to correlate additional information from the hive. However, there are an ItemPos* values in the NTUSER.DAT hive that can provide you with an indication of the files on a user's Desktop at a specific point in time.
And now for the Ugly...
While Microsoft provides documentation of a number of formats, shell items is not one of them. It has taken the work of a small number of dedicated folks within the community, sometimes with support from a small number of other folks who have provided sample data, to put together initial documentation and subsequent tools for parsing these artifacts.
As of now, there are very few tools for parsing LNK files that will parse the shell item ID list (SHITEMIDLIST). And at this point, we're only talking about parsing the information, not including it into other analysis methodologies.
There are a few tools available that parse shellbags, and of those, most do not parse all of the available shell items. In particular, many of the available tools do not parse shell item structures that point to devices. For some of those tools, this can be verified through the source code, while for others, you would need to run those tools and compare the output with other resources. IMHO, I'd think that something like this would be a significant issue, not just in cases involving illicit images (may show production over possession or distribution), but also in cases of IP theft, harassment, etc. But this illustrates why it's so important for analysts to understand the underlying data structures that are being parsed.
For example, here is the output of a script for parsing LNK files, including the shell item ID list, run against a Google Chrome LNK file on my desktop:
C:\Perl\jl>lnk.pl "c:\users\harlan\desktop\Google Chrome.lnk"
File: c:\users\harlan\desktop\Google Chrome.lnk
mtime Fri May 17 21:35:44 2013 UTC
atime Wed May 22 11:33:48 2013 UTC
ctime Wed Apr 13 19:37:47 2011 UTC
description Access the Internet
vol_type Fixed Disk
Here's the output of the same script, run against a completely legit LNK file taken from another system (extension changed):
shitemidlist My Computer/DROID2/Removable Storage/dcim/Camera
That's it...there's nothing else to display, no LinkInfo block, no string data, nothing beyond the header and the shell item ID list. In fact, the flags in the header specifically state that there is no LinkInfo block. Again, it is critical to understand here that the LNK file was not specifically crafted as an exercise; rather, it was created through the normal, legitimate use of the operating system. However, there are few tools available that will parse the shell item ID lists, and those tools will provide no output for this file.
ForensicsWiki: Shell Item
Special thanks to Joachim Metz for correlating and providing a great deal of format information when it comes to a variety of data structures on Windows systems. I have to say that I fully agree with his philosophy on analysis, as listed in his ForensicsWiki bio. I also want to thank Kevin Moore for his work in supporting Andrew Case, et al, by writing the shellbag parsing code for Registry Decoder. Finally, I would like to thank all of those who have provided sample data for me to use in developing some parsing tools.