Windows Encryption Threat Analysis
Transcription
Windows Encryption Threat Analysis
Windows Encryption Threat Analysis SOC10101: Honors Project Submitted in partial fulfilment of the requirements of Napier University for the degree of Bachelor of Science with Honours in Networked Computing Adrian Vergin 08008480 BSc (Hons) Network Computing Supervisor: Prof. William Buchanan Second Marker: Dr. Robert Ludwiniak April 2010 School of Computing Author: 08008480 11/05/2010 1 Abstract New versions of Windows come equipped with mechanisms, such as EFS and BitLocker, which are capable of encrypting data to an industrial standard on a Personal Computer. This creates problems if the computer in question contains electronic evidence. BitLocker, for instance, provides a secure way for an individual to hide the contents of their entire disk, but as with most technologies, there are bound to be weaknesses and threats to the security of the encrypted data. It is conceivable that this technology, while appearing robust and secure, may contain flaws, which would jeopardize the integrity of the whole system. As more people encrypt their hard drives, it will become harder and harder for forensic investigators to recover data from Personal Computers. By analyzing Windows encryption, the author intends to produce automated tools to aid investigators in gaining access to this data, as well as contribute to the progression of Windows encryption standards. Over the course of this document, the author outlines both encryption systems and points out potential vulnerabilities in them. While presenting his findings, the author also provides tips and suggestions on how to use EFS and BitLocker in order to optimize their efficiency and make the best use of their strengths. This project also delivers software solutions designed to help compromise the integrity of these systems. The ultimate finding of this project is that in order to keep data at rest optimally secure, both EFS and BitLocker should be used in tandem, or they should be used in conjunction with other encryption solutions. Neither of these solutions is completely impenetrable on it's own, but when combined with other forms of encryption, they provide a layer of defense that's sufficiently hard to crack. Author: 08008480 11/05/2010 2 Authorship Declaration I, Adrian Vergin confirm that this dissertation and the work presented in it are my own achievement. Where I have consulted the published work of others this is always clearly attributed; Where I have quoted from the work of others the source is always given. With the exception of such quotations this dissertation is entirely my own work; I have acknowledged all main sources of help; If my research follows on from previous work or is part of a larger collaborative research project I have made clear exactly what was done by others and what I have contributed myself; I have read and understand the penalties associated with Academic Misconduct. I also confirm that I have obtained informed consent from all people I have involved in the work in this dissertation following the School's ethical guidelines. Signed: Date: Matriculation no: PLEASE NOTE that in signing this page you are aware of the consequences of doing this fraudulently as explained at http://www.napier.ac.uk/ed/plagiarism/homepage.htm Author: 08008480 11/05/2010 3 Data Protection Declaration Under the 1998 Data Protection Act, The University cannot disclose your grade to an unauthorised person. However, other students benefit from studying dissertations that have their grades attached. Please sign your name below one of the options below to state your preference. The University may make this dissertation, with indicative grade, available to others. The University may make this dissertation available to others, but the grade may not be disclosed. The University may not make this dissertation available to others. Author: 08008480 11/05/2010 4 Acknowledgments The author would like to extend special thanks to the following people, whithout whom completing this project would not have been possible: To Bill Buchanan for his vital advice, ideas and guidance over the course of this module. To Mike Dickson, who helped brainstorm methodologies for the project software. To Richard Laing for providing sample data required to test the project software. Author: 08008480 11/05/2010 5 Table of Contents Abstract ................................................................................................................................................ 2 1. Project Overview .............................................................................................................................. 8 1.1 Background and Relevance ........................................................................................................... 8 1.2 Objectives .................................................................................................................................... 10 1.3 Report Structure ...........................................................................................................................11 2. Literature Review ........................................................................................................................... 12 2.1 Encrypting File System ............................................................................................................... 12 2.1.1 Overview ................................................................................................................................... 12 2.1.2 How it Works ........................................................................................................................... 13 2.1.3 Potential Vulnerabilities ............................................................................................................ 13 2.2 BitLocker Drive Encryption ........................................................................................................ 15 2.2.1 Overview ................................................................................................................................... 15 2.2.2 How it Works ........................................................................................................................... 17 2.2.3 Potential Vulnerabilities ............................................................................................................ 17 2.3 Section Review ............................................................................................................................ 19 2.4 Best Practice Guidelines for Windows Encryption ..................................................................... 21 3. Vulnerability Exploitations............................................................................................................. 23 3.1 CertCrack ..................................................................................................................................... 23 3.1.1 Introduction ............................................................................................................................... 23 3.1.2 Background ............................................................................................................................... 23 3.1.3 Design ....................................................................................................................................... 24 3.1.4 Methodology ............................................................................................................................. 25 3.1.5 Usage ........................................................................................................................................ 25 3.1.6 Future Work and Shortcomings ................................................................................................ 27 3.1.7 Evaluation ................................................................................................................................. 27 3.1.8 Source Code .............................................................................................................................. 28 3.2 Distributed BitLocker Cracker .................................................................................................... 28 3.2.1 Introduction ............................................................................................................................... 28 3.1.2 Background ............................................................................................................................... 29 3.2.3 Design ....................................................................................................................................... 30 3.2.4 Methodology ............................................................................................................................. 31 3.2.5 Usage ........................................................................................................................................ 32 3.2.6 Future Work and Shortcomings ................................................................................................ 34 3.2.7 Evaluation ................................................................................................................................. 38 3.2.8 Source Code .............................................................................................................................. 39 4. Project Evaluation .......................................................................................................................... 40 4.1 Milestones .................................................................................................................................... 40 4.2 Time Management ....................................................................................................................... 41 4.3 Reflections ................................................................................................................................... 41 Appendix ............................................................................................................................................ 42 1. Initial Project Overview ................................................................................................................. 43 2. Interim Review Form ..................................................................................................................... 45 3. Project Diary .................................................................................................................................. 46 a) Trimester 1 ..................................................................................................................................... 46 b) Trimester 2 ..................................................................................................................................... 58 4. Schedule ........................................................................................................................................ 70 a) Trimester 1 ..................................................................................................................................... 70 b) Trimester 2 ..................................................................................................................................... 70 Author: 08008480 11/05/2010 6 5. CertCrack ...................................................................................................................................... 71 a) Figure 1: Program ......................................................................................................................... 71 b) Figure 1.1: Dictionary .................................................................................................................... 72 c) Figure 1.2: Brute Force .................................................................................................................. 73 d) Source Code: Program .................................................................................................................. 74 e) Screenshots..................................................................................................................................... 92 6. Distributed BitLocker Cracker – Server ....................................................................................... 97 a) Figure 1: Main ............................................................................................................................... 97 b) Figure 1.1: SectorSender................................................................................................................ 98 c) Figure 1.2: Send/Receive Keys ...................................................................................................... 99 d) Source Code: Server .................................................................................................................... 100 e) Source Code: SectorSender .......................................................................................................... 104 f) Source Code: Encrypt .................................................................................................................. 108 g) Screenshots .................................................................................................................................. 109 7. Distributed BitLocker Cracker – Client ...................................................................................... 111 a) Figure 2: Main ............................................................................................................................. 111 b) Figure 2.1: Decrypt ..................................................................................................................... 112 c) Source Code: Program ................................................................................................................ 113 d) Source Code: Decrypt ................................................................................................................. 119 e) Source Code: KeySender ............................................................................................................. 123 f) Screenshots ................................................................................................................................... 124 8. Distributed BitLocker Cracker – Client-Server Protocol............................................................. 125 References ........................................................................................................................................ 126 1. Project Overview 1.1 Background and Relevance In this day and age, encryption is a very important part of everyone's daily life. Any time we buy something online, top up our mobile phones, register with a social networking site, information is stored about us on a remote computer. In order to preserve consumer privacy, data on such a computer should be encrypted. But what happens when a user is working on some bit of sensitive information on their own computer, or a company laptop? Microsoft Windows has adopted different methods of protecting users' private data and implemented them in various versions of the operating system. Since Windows 2000, an encryption mechanism called Encrypting File System (EFS) has enabled users to encrypt files and directories, protecting them from other users of the workstation, Active Directory server, or another remote-encryption enabled machine (Encrypting File System overview, Microsoft Corporation). In EFS for Windows 2000, only DESX was used for encryption services. In Windows XP, the option to use 3DES was added. In Windows XP SP1, AES became the default encryption algorithm, while the other two algorithm options could be selected by changing values in the Windows registry (Encrypting File System (EFS), TopBits.com). In Windows 7, Microsoft have added the use of ECC, and “a "mixed-mode" operation of ECC and RSA algorithms” (Changes in EFS, Microsoft Corporation) for backwards compatibility with algorithms supported in earlier versions of Windows. Another method of encryption, which started with the release of Windows Vista, is called BitLocker. The main difference between BitLocker and EFS is that “BitLocker is full-disk encryption, not per-file encryption.” (Windows Vista Secrets SP1 Edition, Paul Thurrott 2008) When BitLocker is turned on, it encrypts the contents of the entire computer, rather than just specific files selected by the user, effectively eliminating some of the shortcomings EFS had when dealing with an attacker with physical access to the computer. BitLocker, by default, uses AES in CBC mode with a 128-bit key, after first scrambling the plaintext with the Elephant Author: 08008480 11/05/2010 8 Diffuser. Other modes of operation include variations of 128 and 256 bit AES ciphers with the diffuser turned on or off (NVbit: Accessing BitLocker volumes from linux, Kumar Nitin, Kumar Vipin 2008). There are several ways that a user can set a BitLocker volume to be unlocked: TPM, USB, TPM+PIN, TPM+USB, TPM+USB+PIN; where USB is a flash disk containing the encryption key, the TPM is the Trusted Platform Module, and the PIN is a user-defined number passed to the TPM, which then unlocks the encryption key (AES-CBC + Elephant diffuser, Niels Ferguson 2006). Both these systems are very helpful to corporations, but can be extremely detrimental to the pursuit of justice. If a computer acquired for the purpose of retrieving evidence is encrypted, it may be impossible for investigators to obtain any usable data from it. It is very easy to use these Windows encryption systems to mask criminal activity, and obstruct the course of justice by hiding vital evidence in an encrypted file system. The purpose of this project is to find ways to surpass these systems, and provide ways for forensic investigators to access the data. The author would like to point out, that this report aims to expose weaknesses and vulnerabilities in personal-use adaptations of Windows encryption standards. Large-scale or corporate implementations of EFS, for instance, make use of different key management tactics, and sometimes rely on the use of a centralized key management services (Microsoft® Windows® Internals, Fourth Edition: Microsoft Windows Server™ 2003, Windows XP and Windows 2000. Russinovich, Solomon 2005). BitLocker, when used within a corporate network, stores the encryption key in Active Directory (Hacking and Breaking Bitlocker. Morrill 2008). With these centralized key management systems, access to particular folders and files may be gained when possessing different group authorizations. Because of the need for organizations to access their data, certain conditions may require back doors in the key management system, or some sort of administrative override scenario “if the key used to encrypt these records becomes unavailable (e.g., through the accidental death of the key holder).” (Key Management in an Encrypting File System. Blaze 1994) In most cases, however, within a corporate system, access to encrypted data can be Author: 08008480 11/05/2010 9 obtained from the system administrator. A system administrator is defined as: “The individual who has legitimate supervisory rights over a computer system. The administrator maintains the highest access to the system. Also can be known as sysop, sysadmin, and system operator.” (Forensic Examination of Digital Evidence: A Guide for Law Enforcement. National Institute of Justice 2004) These topics are outside the scope of this project. The parties who may benefit from this report include the police and any other government agencies interested in retrieving encrypted content from seized computers, the Microsoft System Integrity Team, who may review these products and devise countermeasures against the attacks proposed in this report, and the Research Community. 1.2 Objectives The most crucial objective of this report is to deliver a list of potential vulnerabilities associated with encryption in modern Windows systems. It is the aim of this project to find weaknesses in BitLocker and EFS by considering the work of others and the documentation produced by Microsoft, mainly to aid forensic examiners in extracting information from systems equipped with such features, but also to contribute to the betterment of future generations of this encryption software. The secondary objective is to take a practical approach to cracking BitLocker by obtaining a copy of any of the keys, key unlockers, or passwords, and to compromise EFS by cracking a digital certificate produced by exporting a user's private and public key in accordance with the Best Practice Guidelines outlined by Microsoft; and achieving all this with focus on delivering results in the least amount of time. The author aspires to design and implement software methods of exploiting some of the weaknesses found over the course of this project. The last objective of this project is to give suggestions to the users of either or both of these encryption technologies as to how best to protect themselves from these vulnerabilities. This will be a small academic contribution of this project. Author: 08008480 11/05/2010 10 1.3 Report Structure In accordance with the stated Objectives (Section 1.2), the Literature Review (Section 2) provides a detailed analysis of the encryption features of Windows, including a general summary, and an elaborate list of potential vulnerabilities. After listing the weaknesses in each of the encryption systems, the report covers software solutions aimed at using some of the outlined weaknesses in order to gain access to a system protected with each of the Windows encryption technologies in turn, in Section 3, Vulnerability Exploitations. Each software solution is contained in a structure resembling a separate report, complete with Introduction, Background, Design, Methodology, Usage, Future Work and Shortcomings, an Evaluation sections focused only on the software solution discussed in each section. Lastly, this report contains and Evaluation section, which is the author's selfassessment and reflections on the project. Author: 08008480 11/05/2010 11 2. Literature Review 2.1 Encrypting File System 2.1.1 Overview The Encrypting File System feature of Windows was created as a measure to increase security within the system past the capabilities of the NTFS user privilege system. EFS protects data from being read by users who do not possess the Public Key associated with the encrypted data, and the only person who can modify the encrypted data is the person possessing the Private Key. According to the Microsoft Corporation, “using EFS is similar to using permissions on files and folders. Both methods can be used to restrict access to data. However, an intruder who gains unauthorized physical access to encrypted files or folders will be prevented from reading them. If the intruder tries to open or copy your encrypted file or folder he receives an access denied message. Permissions on files and folders do not protect against unauthorized physical attacks.“ (Encrypting File System Overview, Microsoft Corporation) Microsoft also boasts that encrypting files using EFS is transparent to the user, and other than clicking a check box, the user does not have to perform any manual tasks in order to use the encrypted data. However, a command line program, called “Cipher”, has been provided to allow users to manually encrypt and decrypt data. Currently, EFS supports industry-standard algorithms, including Advanced Encryption Standard (AES), Secure Hash Algorithm (SHA), Elliptic Curve Cryptography (ECC), and smart-card based encryption. Key sizes in EFS range from 1,024-bit to 16,384-bit RSA, and 256-bit to 521-bit ECC, but key length can only be specified by the user when using self-signed certificates (Changes in EFS, Microsoft Corporation 2009). Self-signed certificates are usually considered untrusted, because they cannot be verified by a trusted third party, such as a Certification Authority. EFS does, however, make it easier to send encrypted interpersonal communications when circumstances are lax enough to allow for self-signed certificates, such as personal email. Author: 08008480 11/05/2010 12 2.1.2 How it Works EFS allows users to encrypt individual files and directories in Windows by ticking the “encrypted” box in the advanced properties of the given file or directory. When a user selects a file or directory for encryption, Windows contacts a trusted authority or creates a self-signed digital certificate containing the user's private key with which the data will be encrypted. The certificate is stored in the user's private X509 Store on the workstation. In Encrypting File System (EFS) files appear corrupted when you open them (Microsoft Corporation 2007) it is described that the EFS standard is able to use 3DES, DESX, and AES as the encryption algorithm for files. Recently, though, changes have been made to EFS to accommodate Elliptic Curve Cryptography, and longer RSA keys up to 16,384 bits (Changes in EFS, Microsoft Corporation). As new technologies become available, and encryption standards are amended, EFS keeps up with the current standards by incorporating new algorithms, while trying to maintain backwards compatibility with older versions and configurations. 2.1.3 Potential Vulnerabilities When looking at the overall robustness of a system, one must consider the realistic ramifications of modern day technology. For instance, it would be extremely difficult to crack a 16,384-bit RSA key fast enough to be of any use. The attacker would have to have a small army of dedicated machines at his or her disposal. It is better and easier to break the chain by attacking it's weakest link, metaphorically speaking. It is the author's belief, that in this case, the weakest link is the use of passwords, which have the ability to unlock an exported certificate or a user's personal X509 store. It is also important to remain aware that, by default, certificates containing only the public key enabling a user to read the encrypted data are exported with no password; only certificates containing a user's private key, which enables them to encrypt the data or modify the data already encrypted are stored with a password. In order to trully compromise EFS, the digital certificate containing the private key must be cracked, unless the intention of the forensic analyst is only to look at the encrypted data. Author: 08008480 11/05/2010 13 In Best practices for the Encrypting File System (Microsoft Corporation 2009) the Microsoft Corporation advises companies using EFS to instruct their employees to keep copies of the digital certificates used to produce the ciphertext exported to .pfx files with a strong password. This in itself creates vulnerabilities, as users tend not to be creative with their strong passwords, and even if a password they have created is particularly strong, chances are they are using it in a number of different applications with varying degrees of security measures against attack. In reality, an attacker might steal a laptop and break the user account password, and find the user's desktop riddled with .pfx certificates with the same password. In fact, since with EFS, the certificates containing encryption keys are stored within the user's X509 Certificate Store, an attacker can gain access to them by simply cracking the user's password, and exporting the certificates to file. According to Encrypting File System overview (Microsoft Corporation), another weakness of EFS is that data can be unexpectedly decrypted without the user's knowledge. When the data is moved from an NTFS volume onto any other file system, or when it is sent across a network, the data will automatically be decrypted and then processed in plaintext. This implies that a user sending files to a remote-encryption enabled server should use an encrypted tunnel (IPSec, SSH) when sending the sensitive information across a network. If users are not tunneling to the server, this becomes a perfect scenario for an attacker simply sniffing sensitive packets, or using a man-in-the-middle attack. If an attacker has physical access to the machine with EFS-encrypted content, there are a number of exploitations that can be performed, which take advantage of various weaknesses in Windows security. In their book, Hacking Exposed: Network Security Secrets and Solutions, authors Kurtz, McClure, and Scambray (2009) explain in detail the weaknesses which allow an attacker to gain access to encrypted data. For example, in order to prevent complete lack of access to files in case of user account files becoming lost or damaged, or the user deleting their certificate from their X509 store, EFS mandates that a Recovery Agent (RA) be appointed so that the files can still be accessed and decrypted. That Recovery Agent, on personal workstations is, by default, the local Administrator account; if Author: 08008480 11/05/2010 14 the workstation is part of a domain, then the domain's administrative account becomes the default Recovery Agent. Based on this information, it becomes apparent, that an attacker is able to gain access to the Administrator account by a method similar to accessing the NTFS volume in a different operating system, and removing the SAM files associated with the Administrator password, as outlined in a paper by James J. Grace and Thomas S. V. Bartlett III (July 25, 1999), which, unfortunately, is no longer available for download. The attacker would then be able to obtain the decryption key from the Data Recovery Field attribute in the files themselves, or could simply remove the password from the account of the user who encrypted the files, giving them access to the digital certificate containing the private and public keys associated with the encrypted files. This supports the claim, that with physical access to a machine, and in-depth knowledge of Windows security features, an attacker is able to gain access to nearly everything within the Windows system. On the other hand, a feature like BitLocker is extremely effective at protecting data at rest, and would render the attack mentioned previously quite useless by preventing an attacker from tampering with the Administrator account. 2.2 BitLocker Drive Encryption 2.2.1 Overview BitLocker is a new feature available in some versions of Windows Vista and 7, which encrypts the entire contents of the system volume it's on, effectively making the hard drive unusable if taken out of it's host machine. As mentioned before, BitLocker prevents a potential attacker from tampering with the system, because the entire hard disk containing the vital system files, which the attacker would have to access, is encrypted. Without the appropriate keys to decrypt the hard disk, the attacker cannot even begin to attempt to circumvent Windows security. In BitLocker™ Drive Encryption Security Policy (Microsoft Corporation 2008), the Microsoft team explain security features of BitLocker used to ensure that no startup files have been tampered with before the system boots up. The paper Author: 08008480 11/05/2010 15 also lists the files checked prior to boot. This is a very important feature, especially that, because of the Elephant Diffuser, an attacker can only alter the plaintext in unpredictable ways; this means that even though the changes made to the ciphertext may not have the desired effect, they could affect system stability by damaging system files. BitLocker will not load altered files. By default, BitLocker uses AES in CBC mode with a 128 bit key, and an Elephant Diffuser, which Niels Ferguson describes in AES-CBC + Elephant diffuser (Ferguson 2006) to increase the risk of doing irreparable and random damage to the plaintext if an attacker attempts to change the ciphertext in an effort to weaken Windows security. Ferguson also describes some key strengths of BitLocker, such as it's ability to encrypt and decrypt with a performance loss of only about 5%, as the encryption process and diffuser work faster than the peak data rate of a hard disk. He also admits, however, that, „as a pure block cipher [their] construction has many weaknesses when analyzed in the standard block cipher attack model.” (Ferguson 2006) Lastly, but most importantly to this project, Ferguson outlines potential attack scenarios and rules them out based on the features of BitLocker. He explains how because of the diffusers, BitLocker makes it impossible to match pairs of plaintext and ciphertext, as one traditionally would when attempting to break code. An attacker attempting to compare plaintext to ciphertext would find, that the plaintext is obstructed by an exlusive or function using a sector key derived from encrypting the sector number with the AES key, and the two diffusers, making the comparison a very time-consuming task. The Elephant Diffuser was developed especially for BitLocker. In AES-CBC + Elephant diffuser (Ferguson 2006) Niels Ferguson goes into detail about the selection process of the encryption algorithm for BitLocker, and why no existing cipher satisfied the requirements, and thus an existing cipher had to be augmented with the functionality of a diffuser. The Elephant Diffuser is actually comprised of two diffusers working similarly in opposite directions, which rotate every other consecutive bit a predefined amount. This system was designed simply to strengthen the already robust AES cipher, and to add an extra layer of security on top of the cipher. Author: 08008480 11/05/2010 16 2.2.2 How it Works In Implementing BitLocker Drive Encryption for forensic analysis (Kornblum 2009), Jesse D. Kornblum talks about where and how BitLocker keys are stored. To the author's surprise, the Full Volume Encryption Key (FVEK) is stored on the protected volume, itself, along with a series of other keys and key unlockers. The number of keys stored in the drive's metadata depends on the number of access mechanisms that can be used to access the drive, such as the Trusted Platform Module (TPM), USB key, recovery password, etc. For each access mechanism, BitLocker creates a copy of the Volume Master Key (VMK) encrypted using AESCCM with the access mechanism's key, along with the reverse, the access mechanism's key encrypted with the VMK. This approach allows an access mechanism to be used to decrypt the VMK, which is then used to encrypt one of the redundant copies of the FVEK encrypted using AES-CCM with the VMK. The whole system operates on the assumption that an attacker cannot get access to any of the keys from any external sources. If an attacker gains access to one of the keys, he or she will in theory be able to decrypt all the others. When encrypting, BitLocker takes each sector of the disk and performs an exclusive-or (XOR) operation on it, using the sector key, derived from two variations of encrypting the sector number with AES-CBC. The product of the XOR operation is then passed through both the clockwise and counterclockwise diffusers. Next, BitLocker computes the Initialization Vector (IV) for the AES-CBC function by mapping the sector number into a unique 16-byte value and encrypting that with AES-CBC. Finally, BitLocker encrypts the sector contents using the IV and the Full Volume Encryption Key. When decrypting, BitLocker performs the same functions in reverse order. (AES-CBC + Elephant diffuser, Ferguson 2006) 2.2.3 Potential Vulnerabilities Obtaining keys from external sources could be as simple as looking around for anything resembling keys or passwords, but could also include things like data scavenging, TPM bus eavesdropping, or a number of other techniques, most of which do not require specialized equipment, but rely heavily on lucky coincidence. Author: 08008480 11/05/2010 17 For example, if the computer's owner wrote down the password to disable BitLocker, and just happened to put it in plain sight; or if the forensic analyst somehow managed to get an unencrypted copy of the computer's hibernation dump file. In a paper called, Analyzing Trusted Platform Communication (n.d.), Kursawe, Schellekens, and Preneel explain a vulnerability found in the Trusted Platform Apparatus. According to their research, the TPM is quite secure and tamper-proof, however the bus that data travels on to and from the TPM is not secure. The explain that it would take a lot of time to make sense of the data gathered by observing this bus, but in theory, the BitLocker keys could be obtained, however, the eavesdropping device would have to be present during a successful boot-up. A few commercial products claim to be able to circumvent BitLocker or to be able to find the keys used in the encryption. In a Windows Security Blog entry named, Windows BitLocker Claims (Cooke, 2009), Paul Cooke explains how these programs work, and the folly in their design. Some of these programs seem to rely on the concepts outlined in Lest We Remember: Cold Boot Attacks on Encryption Keys by Halderman et al (2008), who were able to recover encryption keys from a machine by taking a memory image from the target machine, and finding the keys within it. One such site advertising a program, which allegedly “cracks BitLocker” published an update explaining that their program, like other drive encryption programs, needs “a physical memory image file” of the target computer, which relies completely on the machine continuing to run until the attack was carried out. In his blog, Paul Cooke says that BitLocker is meant to protect data at rest, which means while the computer is off, and says that users are warned of the dangers of leaving a computer on in BitLocker's Best Practice guidelines. Other programs, which claim to be able to break through BitLocker security rely on having physical access to the target machine on several occasions. Paul Cooke describes this as a very unlikely scenario, and dismissing it as a low risk to real-life BitLocker users. He says, “Even with BitLocker's multi-authentication configurations, an attacker could spoof the pre-OS collection of the user's PIN, store this PIN for later retrieval, and then reboot into the authentic collection of the Author: 08008480 11/05/2010 18 user's PIN. The attacker would then be required to gain physical access to the laptop for a second time in order to retrieve the user's PIN and complete the attack scheme. These sorts of targeted threats are not new and are something we've addressed in the past; in 2006 we discussed similar attacks, where we've been straightforward with customers and partners that BitLocker does not protect against these unlikely, targeted attacks.” (Windows BitLocker Claims, Cooke 2009) All these potential methods of circumventing BitLocker are completely circumstantial, in that they rely on conditions outside the attacker's control. For instance, the aforementioned method can only work if the machine in question uses the PIN as an unlocking mechanism; if the machine uses only the TPM and USB key as unlockers, then this method cannot work. There is a method, which could obtain a copy of the target machine's memory image and allow the attacker to harvest the AES keys from it, but it would be practically impossible to maintain transparency with this method because of the security features included in Windows. If an attacker infected the target machine with a program, which would perform a memory dump on the target machine while it's logged in and running, and send the dump file back to the attacker over the network, the attacker would only have to have physical access to the machine once. This attack is still a bit far fetched, because the user of the target machine would have to download and run the program on the target machine, and the program would have to go to great lengths to suppress the Windows Defender warnings, which would undoubtedly pop up during it's operation. Furthermore, Paul Cooke explains in Windows BitLocker Claims (2009) that memory dumps can only be performed with administrative privileges or by using Direct Memory Access. Overall, BitLocker is protected quite strongly against many forms of attack, and a brute force attack on a any part of the system, be it the keys themselves, or the recovery password would take an immensely long time to perform. 2.3 Section Review EFS and BitLocker are both relatively strong encryption systems, and truly Author: 08008480 11/05/2010 19 breaking them would take creativity and effort. It does, however, seem easier to invent ways to bypass the systems by using their own protective features against loss and forgetfulness. EFS seems to be the weaker of the two, as it encourages users to store digital certificates with easily crackable passwords. The keys used in EFS to encrypt the data are very strong and would take a long time to break, so a head-on approach seems a bit futile – an investigator should pay close attention to removable media during forensic acquisition, as it may contain digital certificates related to encrypted data. Also, since the certificates are stored in the user's X509 store, an intruder may gain access to the encrypted data simply by logging onto the user's account or the Administrator account on the target machine. BitLocker is quite a bit more tricky, on account of it's multiple access mechanisms. The keys related to each mechanism, however, are stored on the protected volume, itself, which seems to imply, that with enough time and CPU cycles, the system could be broken. Since checksums derived from running startup code are needed to unlock the key within the TPM (Implementing BitLocker Drive Encryption for Forensic Analysts, Kornblum 2009) and a single change to the running code could result in complete data loss, BitLocker seems to make security a bit more lax when critical system updates are installed on the machine by introducing a password which completely disables the system. Investigators should look for the presence of this password in the volume metadata. The password being present on the volume could imply that the user has also written the plaintext password down somewhere, as the password is too long and complex to remember. Microsoft are aware of the vulnerabilities in both of these encryption systems, and they maintain that neither should be used on it's own (Windows BitLocker Claims, Cooke 2009). Working in unison, however, these systems provide a very robust barrier against intrusion, and make it very difficult for anybody to gain access to the encrypted data. For example, all the weaknesses in EFS related to a user gaining access to the administrative account on the target machine are no longer a threat if the entire disk is encrypted, as access to data at rest is blocked by Author: 08008480 11/05/2010 20 BitLocker. Using both mechanisms in conjunction severely limits the ways in which an intruder might gain access to the data even if they were able to find a key or password written down near the target machine – they would still have to defeat other security measures in order to gain enough access to the machine to make use of their find. It is, therefore, safest to use both encryption methods simultaneously to best protect the data stored on the machine. 2.4 Best Practice Guidelines for Windows Encryption As stated previously, because the effectiveness and reliability of EFS relies on Windows authentication, it is best to use it in conjunction with BitLocker. BitLocker will protect the hard disk, and the operating system settings contained on it while the computer is off. In order to reset the Administrator account password to null, an attacker would have to physically remove the hard disk, mount it in a foreign (non-Windows) system, and remove the SAM files from the disk; BitLocker makes this attack much more difficult by making the hard disk illegible to the foreign machine without the appropriate keys. When using BitLocker, it is advisable to turn the computer off completely each time the machine will be left unattended. BitLocker stores the only plaintext copy of the encryption key in RAM memory while the computer is running, and the only attack scenario, which compromises BitLocker in a timely manner makes use of exactly that weakness. BitLocker is designed to protect data at rest, meaning that even the creators of the encryption software acknowledge that the system is vulnerable if left on. Lastly, a user exporting EFS certificates should store them in a safe place, and ensure, that a strong password is put on files containing that user's private key. EFS encryption can sometimes be used as a method of authentication, because, unless the private key has been attained by an impostor, the owner of the digital certificate should be the only one able to encrypt data with that particular key; because the public key corresponds to only one private key, people holding the public key can ascertain that the data was in fact encrypted by that person. Author: 08008480 11/05/2010 21 Although keeping the private key safe is paramount, if an intruder gains access to the public key, they can still read the encrypted data, rendering the encryption process useless. Author: 08008480 11/05/2010 22 3. Vulnerability Exploitations 3.1 CertCrack Exported EFS Digital Certificate Password Cracker 3.1.1 Introduction CertCrack is a C# solution which tackles the problem of breaking into digital certificates associated with encrypted file system content in Windows machines for forensic purposes. This solution is meant for digital forensic investigators attempting to break into encrypted content on seized computers or removable media. 3.1.2 Background When a digital certificate is exported, the user is asked to give it a password in order to protect the keys stored within. A certificate password has a maximum length of 32 characters. Windows does not attempt to correct the user when they enter a weak password, nor does it impose any minimum length limits on the password – the user is free to enter anything he or she wants. In fact, when tested, the certificate export wizard allows even a one or two character password when exporting a private key certificate; public key certificates are saved with no password at all. Not many average users would enter a strong password for very simple reasons, like not being able to remember it later. A dictionary attack is an attack using a bank of weak passwords that users frequently use, such as the word „password” or the key combination „qwerty”. A dictionary attacks simply tires every weak password in order to try to gain access to something. If a weak password is suspected, this attack strategy is preferable to a brute force attack as it takes less time than brute force. However, the downside of using a dictionary attack may be that the password, however weak, may simply not be included in the pool of weak passwords in the given dictionary. Author: 08008480 11/05/2010 23 A brute force attack is quite time-consuming, but theoretically, a well mounted brute force attack cannot fail as it tires every single possible combination of supplied characters possible until the password is cracked. The main disadvantage of the brute force method is it's time consumption – in a trial, CertCrack took 19 minutes and 31 seconds to crack the password „fred” using a pool of lowercase letters and numbers. This is not an ideal method and should be used as a last resort. Since CertCrack is meant to automatically obtain the password from the digital certificate by brute force, which means it takes an array of characters (which could range from a-z, A-Z, 0-9; and can include non-standard foreign characters such as ą, ę, ó, ż, ź, etc) and strings them together in a loop using every possible permutation of those characters to form a password of up to 32 characters, it's operation could be quite time consuming, and potentially futile if the character set the program is using does not contain the characters used in the password. There is a certain risk in using brute force, as the more characters are in the array, the longer it will take for the program to find the password, but if the password contains special characters not contained in the array, the password will never be discovered. This is why it is important for the analyst using CertCrack to choose a character set wisely – for example, if the computer on which the certificate was found has a French copy of Windows, it might be wise to include French language characters in the character array. 3.1.3 Design The design of this solution progressed through various stages before the looping sequence that generates the password string was perfected. Even though the program still operates using a series of 32 nested loops to reflect the maximum length of the digital certificate password, it now features a system in which, instead of ascending through ASCII values, it now cycles through predefined sets of characters. This allows the user to choose easily between character sets, and even create custom ones. Appendix 5a, shows a basic representation of the program's startup functions and user interaction. The menus which appear in front of the user are a simple design, as the program should stay modest yet functional. The author would also suggest Author: 08008480 11/05/2010 24 removing the visual indicators, which display the current password being tried by the program – displaying things on screen takes up unnecessary processor cycles, which are vital when cracking passwords. Appendix 5b, shows the program flow when using Dictionary mode. A convenient feature of this program is that in the eventuality of not obtaining the password using Dictionary mode, the program will ask the user to start Brute Force mode, shown in Appendix 5c, instead, using the same parameters, so the user does not have to retype the file path. 3.1.4 Methodology This solution assumes a scenario in which the investigator has access to the media containing the encrypted data and a copy of the exported digital certificate created when the data was encrypted. The main weakness of this method of encryption is that the digital certificate is protected by a password; CertCrack is designed to exploit that weakness. CertCrack has can employ two methods to break the password – a dictionary attack, and a brute force attack. The benchmarks for both of those methods depend on the size of the password for the brute force attack, and the existence and placement of the password in the dictionary for the dictionary attack. 3.1.5 Usage When CertCrack is turned on, it asks the user to choose a cracking method, display the information page, or exit. See Appendix 5e, Figure 1. Methods include 1. Dictionary, and 2. Brute force. Each of the aforementioned options responds with the appropriate method, which will be described later on. If successful, each method displays the resulting successful password, the time it took to obtain the password, and prompts the user to add the unlocked certificate to the Personal certificate store on the current machine. Importing the certificate is optional, so the user may quit at that point and import the certificate elsewhere with the obtained password. See Appendix 5e, Figures 2.3 and 3.3. The cracking methods are as follows: Author: 08008480 11/05/2010 25 Dictionary (Appendix 5b) The user is prompted to input the location of the certificate file (see Appendix 5e, Figure 2.1) and then given the choice to either use the embedded dictionary or load up a custom dictionary file (see Appendix 5e, Figure 2.2). The embedded dictionary contains weak alphanumeric passwords in English. The custom dictionary option exists primarily to load more complex dictionaries, or ones more catered to the target system, such as ones compiled based on the certificate creator's birth date, anniversary dates, or kids' birthdays, combined with their favorite sports figures or activities. The native dictionary takes about 30 seconds to work through, and it's a good first line of offense for vulnerability testing. Once both the file location and the dictionary are loaded into memory, the program attempts to open the certificate using each password supplied until a successful password is found or until the end of the pool of passwords is reached. If successful, CertCrack displays the password and the content of the certificate (see Appendix 5e, Figure 2.3), and goes on to ask the user if he or she wants to import it to the current machine. If unsuccessful, the user is prompted to use brute force instead. Brute Force (Appendix 5c) Upon initiating the brute force method, the user is asked for the location of the digital certificate (see Appendix 5e, Figure 3.1) and a menu appears with a series of predefined character sets (or alphabets) and an option to input a custom character set (see Appendix 5e, Figure 3.2). The predefined options are different permutations of English alphanumeric characters with or without numbers and capital letters. The solution then starts a series of 32 loops, which cycle through all the characters in the pool one at a time in order to produce every possible combination of those characters. The first character is blank, which allows the program to create attempted passwords which are less than 32 characters long. Author: 08008480 11/05/2010 26 If successful, CertCrack displays the password and the content of the certificate. and goes on to ask the user if he or she wants to import it to the current machine (see Appendix 5e, Figure 3.3). If unsuccessful, it displays a message to the user to add to the pool of characters, as the certificate password likely contains characters not native to the English alphabet, or not contained in the chosen character set. 3.1.6 Future Work and Shortcomings CertCrack also does not attempt to add characters to the dictionary passwords, such as trying different number combinations. This means that a dictionary would have to include not only text passwords, but also text and number passwords, such as, say „fred1” instead of just „fred.” It would also be advisable to include such a function in the future. Another good feature that the solution should have is to be able to save the digital certificates obtained by cracking the password as exported certificates with no password. This would improve the ease with which the certificates could then be deployed on other machines. This can, however, be done manually by importing the certificate, and then exporting it again with no password. Finally, and most importantly, this solution should have a way to distribute the work among different nodes if such are available. Cracking a 32 character password could take a long time, and this time could be shortened significantly by sharing the necessary processing among different machines. CertCrack should be made to operate in a distributed environment. For the purposes of this demonstration, CertCrack does enough to show its usefulness and versatility. Most of the suggested changes to this solution can be added within a very short time. 3.1.7 Evaluation CertCrack is in all respects a very useful application with much room to grow. Author: 08008480 11/05/2010 27 Although it is meant to aid in digital forensics, it could also be used by persons who simply forgot or misplaced the password needed to decrypt some data. There are many features which could be added to this solution in order to make it better, simpler, and faster, but the project has a good foundation and can be easily modified to include those features. As a tip for EFS users, when exporting a private key laden digital certificate in accordance with Microsoft's Best Practice Guidelines, the user should pay particular attention to the length and complexity of their password. A password with only four lowercase alphanumeric characters can be cracked by CertCrack in about 20 minutes. Adding one extra character extends that time to about 11 hours and 30 minutes on a single machine with a 2GHz processor. 3.1.8 Source Code See Appendix 5d. 3.2 Distributed BitLocker Cracker Multi-client Distributed AES-CBC Brute Forcer 3.2.1 Introduction The Distributed BitLocker Cracker is a C# command line solution utilizing a clientserver architecture to produce parallel computing environment to significantly cut down the time it takes to crack a 128-bit, randomly generated key. The solution is meant to be run on a host machine directly connected to the BitLocker-encrypted hard disk and can potentially support thousands of simultaneous clients which, when combined, have enough processing power to crack a key of that size in a relatively comparatively short amount of time. The author would like to point out that the Distributed BitLocker Cracker is not finished and not ready for industry application. Due to various hardware-related setbacks over the course of this project, this solution currently only emulates a BitLocker-encrypted volume by encrypting an NTFS volume sector with AES in Author: 08008480 11/05/2010 28 CBC mode. The methodology and principles in this demonstration are sound, but the solution has not been tested or adapted for working with a true BitLocker hard disk. 3.1.2 Background In AES-CBC + Elephant diffuser - A Disk Encryption Algorithm for Windows Vista, Niels Ferguson (2006) explains plausible attack scenarios which an intruder might use against the BitLocker system, effectively ruling out most conventional avenues for attack on an encrypted system (such as matching plaintext and ciphertext pairs or attempting to affect system stability by changing ciphertext bits), and demonstrates how a more direct and unfortunately hugely resourceconsuming method is needed to break the encryption. Although actually decrypting a BitLocker volume using this method within our lifetime is not possible even if we were to utilize all the processing power on the planet (128-Bit Versus 256-Bit AES Encryption, Seagate 2008), this solution provides a backbone for a future endeavor to crack the encryption. To realize exactly the computing power required to break a 128-bit AES key, one must take into account just how many key combinations exist within that key space. Accurate to the nearest ten million, the number of unique keys derived from a 128-bit key space, in scientific notation is: 3.4028236692093846346337460743177x1038. In data storage terms, there are 9,903,520,314,283,042,199,192,993,792TB of keys to be tested. Based on this information, to successfully brute-force the 128-bit AES key, the system would need to try 10,783,127,828,133,147,806,075,110,339,701 keys per second to reach the end of the keyspace in one year, or approximately 5,391,563,914,066,573,903,037,555,169,851 keys per second to successfully brute-force they key in one year (since on average half the keyspace has to be tested before finding the correct key). The effectiveness of this method relies heavily on Moore's Law, which states that the processing power of computers doubles every year, as well as the number of client machines working in tandem to crack the encryption. Author: 08008480 11/05/2010 29 On the other hand, earlier this year, the 768-bit RSA cipher has successfully been brute-forced (Researchers crack 768-bit RSA, Halfacree 2010). In Factorization of a 768-bit RSA modulus, Aoki et al (2010) outline their methods of cracking the 768-bit key, which is significantly larger than the 128-bit or 256-bit keys used by BitLocker. According to the report, the sieving process alone took almost two years using “many hundreds of machines”, but the fact that it has been done gives hope to cracking the AES cipher in a timely manner. Realistically, the two encryption methods are, however, quite different – RSA relies on factorization of prime numbers, meaning that not all the keys in it's 768-bit key space will be useful; AES on the other hand does not have such a limitation, making it significantly harder to brute force. 3.2.3 Design This solution is designed to work with one server and multiple clients in close proximity, as it could cause a lot of network traffic. The communication protocol between the client and the server can be seen in Appendix 8. To a certain extent, this application is still in it's design stages. This program can never be applied commercially, until a proper key distribution system is invented. Furthermore, due to technical difficulties (see Time Management), the author was not able to implement all the required mechanisms in order to allow the Server program to read BitLocker volumes. At the moment, the Server can only act like it's reading an encrypted volume by encrypting the first sector of the NTFS volume with AES in CBC mode, in a similar way to BitLocker. These two applications also went through different stages of design. For instance, the key management method in this solution has changed several times, starting from being a Client-side file containing base64 passwords to now being a Serverside randomly dispensing algorithm. Server Appendix 6a, describes the server program's startup functions and interactions Author: 08008480 11/05/2010 30 with the user and the client program. At the moment, other than prompting the user for the location of the encrypted hard disk at the beginning, the server program does not interact with the user. Further interaction happens with client programs, when they ask the server either for a copy of the initialization data or a set of keys to try.. If the client program requests the initialization data, the server starts the SectorSender class and sends the requested information (see Appendix 6e). At this point in time, since the Server cannot actually mount BitLocker volumes, it needs to first encrypt the first sector of the NTFS (see Appendix 6f). The server program is expected to stay on until the end of the key pool is reached. The server does not have any user control that turns it off, and must be turned off using the key combination, CTRL+C. Client Appendix 7c shows the core functions of the Client program. After connecting to the Server, the Client program goes through an incrementing loop, which counts to three, incrementing from the function which gets the sector from the Server program, through the function responsible for decrypting it as well as acquiring more keys, should it run out (see Appendix 7d), until it finally reaches the third and final function, which disconnects it from the Server. 3.2.4 Methodology It is very difficult, if not impossible, to guess a randomly generated AES key or even decrease the key sample size without running extensive tests on the machine it was generated by and knowing in-depth details of the randomizer used; and even then, if a fault exists in the randomizer, a single hardware change may sometimes offset the random values generated. The focus of this solution is to provide an effective solution for cracking the AES cipher that will produce results in the least amount of time. The only way to achieve that is to use as much processing power as possible, and since even the 128-bit key space is too much for a single processor to go through, a distributed system is the only feasible answer; though admittedly, the computing power available to the author is not sufficient to successfully crack AES at this time. Author: 08008480 11/05/2010 31 The Distributed BitLocker Cracker uses a threaded server architecture to allow multiple clients to connect to it and take on a portion of the key space and begin attempting to brute-force it. In order to achieve the benchmark figures discussed in the previous subsection, thousands of clients need to connect to the server at the same time. In theory, with a threaded server, should be able to handle this amount of connections, but in practice the server itself needs to be a very powerful machine with a huge network card buffer that won't overflow causing a potential false negative based on a hardware failure. For the purposes of testing this solution with a small, predefined key sample base, it is sufficient to run the server on a home PC. One of the biggest challenges in using a multiple client architecture is keeping track of the keys which were already checked. Since there's 9,903,520,314,283,042,199,192,993,792TB of keys, they cannot simply be stored in a file and distributed to the clients on demand. The design implemented to date involves the server sending the client 24 bytes of key material, and the client attempting to brute force the remaining bytes. For the purpose of demonstration, the server currently has five hard-coded 24-byte key samples in an array list. Tested key samples are removed from the array list. This is not a good system, however, as if we were working with a real 128-bit key space, then there would be a vast number of keys that the server would have to store in memory; if we don't have the storage capabilities to store these keys on hard drives, a single server's memory modules definitely will not suffice. 3.2.5 Usage The Distributed BitLocker Cracker is an interdependent client-server program, which means that neither program will actually accomplish anything without the other running. In order for both programs to work correctly, the user must first connect the hard drive they intend to test to the machine with the server program, run the server, and point it to the appropriate hard drive (see Appendix 6g, Figure 1). When the server program indicates that it has successfully initialized, client programs may begin to work from other machines on the network. Author: 08008480 11/05/2010 32 The following are the individual program flow descriptions for the client and server. Server (Appendix 6) As mentioned before, the server must be started and initialized first. When the program is started, it queries the operating system to find out what disks are currently plugged into the computer. The program displays a menu asking the user to pick a hard disk based on their hardware descriptions (see Appendix 6g, Figure 1). In case of doubt, the user can check the Storage snap-in in Computer Management to find out which hard disk contains the BitLocker partition. Once a hard disk is selected, the program starts the threaded server and awaits client connections. When a client has connected, the server sends the client the sector size of the chosen hard drive, followed by the first sector directly from the disk, containing raw, unencrypted data (see Appendix 6g, Figure 2). The server then waits for the client to request a sample key range. When it receives the request, the server sends a 24-byte key sample to the client. The server then waits for input from the client, which could be either a key, which the client believes could successfully decrypt the data, or an instruction for what to do next. If the server receives a potential successful key, it stores it in an array list (see Appendix 6g, Figure 4) and to “C:\Successful BitLocker Keys.txt” (see Appendix 6g, Figure 5) for future processing. At the moment, this path is not modifiable, and exists only for testing purposes. In order to avoid server-side storage issues, the program does not accept blank keys (those comprising of all zeros) in case an error occurs and the client sends bad data. The instructions the client could send instead of a key are a request for another key segment, or a notification of the client quitting. The server either sends another 24-byte key segment or doesn't, depending on the instruction sent. If the end of the key pool is reached, the server disconnects from all clients. If the Client unexpectedly quits, the key the Client was currently working on gets added back to the key pool by the server (see Appendix 6g, Figure 3). Author: 08008480 11/05/2010 33 Client (Appendix 7) The client can be turned on either with command line arguments or without. The valid command line arguments are an IP address and port number of the server. If these numbers are not supplied when the program is turned on, it asks for them one by one. When both numbers are obtained, the client attempts to connect to the server. Upon successful connection, the client receives the sector size and instantiates a byte array the size of the sector. Next, it acknowledges success, and receives the raw sector data (see Appendix 7f, Figure 1) . It is important that the data sent by the server and the byte array in the client are the same size, otherwise, an exception could occur, or the byte array would automatically be padded with zeros, which would offset the decryption process and produce incorrect results. The client then requests a key segment, and waits for the server to send the 24byte sample. When the sample is sent, the client extends the key size to 32 bytes, pads the remainder with zeros, and attempts to brute-force the key by cycling through integer values of 0 to 255 on each of the bytes above 24 (see Appendix 7f, Figure 2). If the client program encounters a key which produces a successful comparison value between the decrypted disk data and it's preprogrammed sample, it sends the key to the server. If the client reaches the end of the sample range, it requests more keys from the server. The server also accepts an instruction to disconnect from the client without sending more keys, but this feature is not supported in the client program yet. If the client requests more keys, and the server notifies it that there are no more, the client disconnects and notifies the user that the end of the key pool has been reached. 3.2.6 Future Work and Shortcomings The easiest feature that should be implemented within this solution is the ability for the client program to pause what it's doing, or quit after completing the current key space. Without this feature, each client becomes tied up performing one task until the server notifies the client of the entire 128-bit key space being finished. If Author: 08008480 11/05/2010 34 the client could stop and disconnect from the server after finishing just a segment of the key pool, it would make it easier to allow the host computer to be used for other things, and it would not conflict with the key distribution system, which, at the moment, cannot save a client's progress or add a 24-byte key sample back to the array list unless an exception occurs or the client forcibly quits, and all testing done by that client is lost. It may be necessary to send periodic updates to the server to notify it that the client has completed a certain stage. This way, perhaps, if the client quits, the key could be put into a priority queue, and another client could pick up where the previous client left off. The server program should be able to save it's own state in case it exits. The server may not be able to retain all the client connections, but it should be able to add the unfinished keys back into the pool, and continue on from where it left off. This would help avoid the problem of the server unexpectedly quitting (for instance because of a power outage) and losing all the progress done so far. The most important feature of this solution that still needs work is the key distribution system. Since there is such a vast number of keys to be tested, the program needs to keep track of which keys have already been examined, and which client gets which keys to test. A list of keys cannot be compiled on a single machine, because of it's stellar proportions, without encountering exactly the same bottleneck as with attempting to brute-force the AES cipher with a single machine. It is possible, that a government body would possess enough data storage space, however, a home user would have to purchase almost ten octillion 1TB hard drives in order to contain every single key permutation in the 128-bit key space. The problem of storage space also increases exponentially, when considering client reliability. In order to safeguard against client machines unexpectedly quitting and costing the operation considerable processing time, the server should be able to poll a client to ascertain if it's alive and how far along it's progressed with it's assigned key space, while maintaining exclusivity between the client and the key space. This implies that each key space would have to be assigned a state, such as checked, unchecked, and engaged. This also raises the question of whether the randomizer is a good idea. On one hand brute-forcing the entire key space randomly could potentially be faster, as there is a higher Author: 08008480 11/05/2010 35 likelihood of one of the clients receiving a key segment containing the correct key from the middle or end of the key space early on, but it requires a lot of space, and huge computational effort to achieve. On the other hand, the thorough approach of systematically going through each key permutation one after the other would be far more time consuming, but it may be necessary in order to avoid the storage issue with the random key method – if the keys are fed systematically to the clients, then the server may simply need to store a per cent value representing the progress between key a 128-bit key consisting of all zeros and a key consisting of all ones. This would require heavy mathematical computation on the part of the server, but it would eliminate any need for storage space. It may also be a good idea to allow the user to set a key sample size that will be sent to each of the clients. Larger key ranges will take the client nodes longer to get through and will generate less network traffic. With smaller key sizes, however, each client could be done much faster, and if the pause and quit feature discussed earlier is complete, this could be advantageous to the program's ability to quickly yield the processor to another task. Unfortunately, smaller key sample ranges would generate a lot of network traffic and would slow down the overall performance of the system, because network speed would have to be factored into the overall time it takes the solution to reach success. At the moment, this solution only supports 128-bit encrypted volumes. Theoretically, 256-bit encryption key support should be added, however, the 128bit cipher may be beyond our capabilities to break, so to optimistically think that breaking the 256-bit cipher is attainable would be quite naive. Since this solution was created for demonstrative purposes, a lot of the features necessary for it to perform with tangible systems, rather than experimental virtual machines have been omitted. For instance, the program cannot differentiate between 256- and 128-bit encrypted disks. If a hard disk was pulled out of a foreign computer, the analyst would not be aware of the system's BitLocker configuration. In the future, this solution should be modified to automatically read in the various options related to BitLocker, including whether or not the system Author: 08008480 11/05/2010 36 uses the Elephant Diffuser, which is a vital part of decrypting the disk successfully. Another idea to optimize the process of obtaining the correct key in the least amount of time is to attempt to obtain part of the key from systems where the key is divided and stored in different locations, such as a USB stick and the TPM. In Lest We Remember: Cold Boot Attacks on Encryption Keys, Halderman et al (2008) talk about their software obtaining a complete AES key from the memory of a computer which has had it loaded into memory at the time when it was seized. It is unclear, but certainly seems possible, that if a machine with a split key is booted up and loads half of the key into memory, a modified version of this software could obtain that half of the key from memory. This would drastically decrease the number of total keys and computing power needed to crack the key. A key space of 64 bits contains 18,446,744,073,709,551,616 total keys, which, according to the calculations mentioned in Section 3.1.2, means that there would be only 536,870,912TB of keys to be tested, which is significantly less than before, and that would need to test 584,554,530,873 keys per second to reach the end in one year. These figures are a huge motivating factor to seriously consider implementing this feature. A feasible and viable approach to cracking the AES cipher that this solution should also utilize is the parallel processing power of Graphics Processing Units (GPUs). "GPU architecture [...] currently boasts up to 128 parallel processors." (O. Harrison, J. Waldron, 2007) Thanks to Software Development Kits such as CUDA, programmers to access the GPU directly, and developments in the way GPUs work now give programmers the ability to run defined code directly on these processors (AES Encryption Implementation and Analysis on Commodity Graphics Processing Units. Harrison, Waldron. 2007). Graphics Processing Units are currently used to crack passwords, because they are capable of doing so 25 times faster than a standard CPU – a password that would take a CPU months to crack can usually be cracked within three to five days by a relatively cheap GPU (Inexpensive GPUs Pose Security Problems. Gache 2007). It would be wise to make use of such processing power as a standard feature of this solution. In the future, the client portion of this solution could be written as a screen saver Author: 08008480 11/05/2010 37 or another type of background application, which makes use of spare processor cycles, while not encroaching upon a user's interaction with the host computer. Because of it's distributed nature, this solution could very easily mimic volunteer computing, however, because of the fact that this program cracks encrypted hard drive data, it may be unwise to use processor cycles of machines outside a trusted area, at least not without extensive testing as to how prone to eavesdropping this solution might be. If the solution was turned into, for instance, a screen saver, a lot of planning and effort should go into ensuring continuity of the testing between screen saver start and finish. It would be ideal if the application returned to it's previous state when it was turned on again and continue it's testing. Another area of uncertainty with this approach is how to tell if a client machine is not responding, or if has simply not been idle and never turned on it's screen saver. Finally, the solution needs code to use the potentially successful keys for something once it obtains them. At the moment, the program simply stores them in an array list as well as in a file on the hard disk. This is not ideal, as the BitLocker disk is tied up by the program, and cannot be removed and tested further using the keys obtained from the program. This means, that even if potentially successful keys are found, the program needs to wait till it finishes the entire 128-bit key space before The suggested changes to the Distributed BitLocker Cracker application should be made over a higher level degree course with access to adequate hardware, such as a Beowulf Cluster, or a group of dedicated machines, working for the sole purpose of cracking the encryption. Amont other problems, testing this solution on a single machine is rather futile, and the time constraints produced would be highly speculative. 3.2.7 Evaluation Although the Distributed BitLocker Cracker is not yet ready for it's intended application, it demonstrates that it is a feasible method for cracking the BitLocker AES cipher in the future. If this method is perfected and implemented in a suitable Author: 08008480 11/05/2010 38 setting, there is no doubt that it would eventually achieve success – the problem at hand is minimizing the time it would take to do so. 3.2.8 Source Code Distributed BitLocker Cracker – Server Server: see Appendix 6d SectorSender: see Appendix 6e Encrypt: see Appendix 6f Distributed BitLocker Cracker – Client Program: see Appendix 7c Decrypt: see Appendix 7d KeySender: see Appendix 7e Author: 08008480 11/05/2010 39 4. Project Evaluation 4.1 Milestones The first objective of this report, as listed in Section 1.2, Objectives, is to deliver a list of potential vulnerabilities associated with encryption in modern Windows systems. The objective was achieved successfully, and the findings are stated in Section 2, the Literature Review. The Literature Review covers a wide spectrum of attack scenarios and provides a comprehensive list of what a forensic analyst might need to do when encountering each scenario. The Literature Review also achieves the last objective, by giving tips and strategies for users of Windows encryption to better protect their data. Bearing in mind, that if an intruder gets physical access to a machine, they can usually overcome the security features of that machine, the author is still confident, that the advice provided in this report is sound and valid. The secondary objective outlined in Section 1.2 is to take a practical approach to cracking BitLocker by obtaining a copy of any of the keys, key unlockers, or passwords, and to compromising EFS by cracking a digital certificate produced by exporting a user's private and public key in accordance with the Best Practice Guidelines outlined by Microsoft; and achieving all this with focus on delivering results in the least amount of time. This was the most difficult objective, which met with only partial success. Both solutions produced over the course of this project apply brute-force as a method of cracking their respective targets. This means, that computing the time it would take to crack an encryption key or password depends on the length of the key or password, and the processing power committed to cracking it, and therefore, it is very difficult to estimate with any degree of accuracy how long the process might take. Since the focus of this objective was to deliver solutions, which produced fast results, the author cannot honestly call this a success. It should be taken into account, however, that short of obtaining BitLocker keys from the memory modules of a live machine, as outlined in Lest We Remember: Cold Boot Attacks on Encryption Keys (Halderman, et al 2008), there are no fast solutions, that would crack Windows Author: 08008480 11/05/2010 40 encryption software - BitLocker and EFS are commercial products developed by a team of highly trained professionals with plenty of experience, and both of them use time-tested encryption algorithms with large key sizes. In that respect, the solutions provided in Section 3, Vulnerability Exploitations, are actually quite valid, even though they might not be particularly fast. 4.2 Time Management Due to the technical difficulties experienced over the course of this module, along with the difficulties with acquiring a version of Windows which featured BitLocker, the project followed the original schedule quite loosely. During Trimester 1 (see Appendix 4a), the author was able to keep to the schedule quite well until the laptop used for this project started breaking; however, in terms of productivity, Trimester 2 (see Appendix 4b) was a disaster. At one of the most crucial points in the whole project, the replacement for the laptop which broke during the first trimester also broke, and the author was forced to abandon his course in favor of something more computationally light. 4.3 Reflections Given another chance, the author would attempt to compromise BitLocker by developing an application, which preemptively searched the target computer's memory for a key before the forensic acquisition of the target machine was ever made. This is an unlikely scenario, as the forensic analyst would have to have prior knowledge of BitLocker's existence within the target system, and the application would have to be downloaded and opened on the target computer without arousing suspicion. However, the results could technically be achieved a lot quicker using this method than attempting to brute-force a 128-bit key space. Author: 08008480 11/05/2010 41 Appendix 1. Initial Project Overview Initial Project Overview SOC10101 Honours Project (40 Credits) Project Title: Disk Encryption Threat Analysis Abstract: BitLocker provides a secure way for an individual to hide the contents of their entire disk, but as with most technologies, there are bound to be weaknesses and threats to the security of the encrypted data. It is conceivable, that this technology, while appearing robust and secure, may contain flaws, which would jeopardize the integrity of the whole system. Overview of Project Content and Milestones: Over the course of this this module, I will attempt to discover and analyse weaknesses in the BitLocker Disk Encryption technology introduced with Windows Vista and available with Windows 7 by conducting research on work already undertaken in this field. After analysing the published works on the topic, I will form strategies to break the encryption and gain access to the data, and I will rigorously test these strategies and record my results. In the end, I will create a method of cracking the security measures in the form of a programming solution. I will also deliver some suggestions of new directions this technology could take in order to be more secure. The Main Deliverables: • Literature Review on disk encryption standards, and associated weaknesses/threats. • Design of automated implementation of encryption methods, and of evaluation tools. • Implementation of test/evaluation tools for disk encryption analysis, with associated scripts/interface. • Evaluation of threats on disk encryption. The Target Audience for the Deliverables: The police, and any other government agencies interested in retrieving encrypted content from seized computers, the Microsoft System Integrity Team, and the Research Community. The Work to be Undertaken: • Research the technologies involved, the documentation and white papers from the creators of BitLocker, the previous work in the field, and detailed documentation of encryption technology. • Analytical chapters of the report containing a summary of the findings along with theories and potential weaknesses in the BitLocker infrastructure. (Preferably before the Interim Review Meeting) • Design of a solution to extract an encryption key, or to decrypt the disk. • Implementation and documentation of said solution. • Chapters of the report evaluating the impact in the integrity of Disk Encryption based on the findings in the analytical portion. Additional Information / Knowledge Required: I will need information on the Trusted Platform Module, as most new computers will rely on this for storage of digital certificates and other data relating to trust and security. I should also find out how the encrypted data is structured – whether everything is scrambled randomly from start to finish, or whether there is some form of encapsulation around the cypherstream pointing to the start, finish, and the locations of individual files within the encrypted data. I will have to find ways to crack each individual security feature BitLocker has, such as the TPM, the digital certificate contained on the USB key, and the 4-20 digit PIN; and I will need to know how long it would take to break the encryption on the disk without trying to crack the smaller barriers – if the disk is protected by the TPM, the USB key, and a 20 digit PIN simultaneously, it may be faster to attack the disk itself by trying to decrypt it using different AES keys until successful. Finally, I will need to extend my knowledge of cryptographic programming with Visual C# .NET. Information Sources that Provide a Context for the Project: The most concise technical information related to the encryption standards used by BitLocker can be extracted form the documentation produced by Niels Ferguson of Microsoft. To gain insight into breaking this encryption, I will need to analyse reports of other students, who have undertaken similar projects. Information explaining how each particular technology related to disk encryption works can be attained from the United States Patent Office. The Importance of the Project: This project will first and foremost strive to assist the legal system in recovering valuable information from encrypted disks on computers seized from suspects. If successful, it could assist in the prosecution of criminals by allowing the police access to otherwise unobtainable data. This project could also aid in the development of stronger encryption techniques by shedding light on the shortcomings of the existing system. It could help the BitLocker development team patch up the security threats, and make the system more robust; as well as guide them in creating the next generation of disk encryption solutions. The Key Challenge(s) to be Overcome: • Finding weaknesses in the BitLocker technology. • Analysing and exploiting those weaknesses. • Writing an automated application to exploit those weaknesses and gain access to decrypted data. 2. Interim Review Form - Not Available - 3. Project Diary a) Trimester 1 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 23.09.2009 Last diary date: n/a Objectives: put together a comprehensive reading list including published articles by students write the Initial Project Overview extend the reading list by scanning bibliographies of articles for relevant information start reading establish a rough schedule with events and deadlines relating to the project install windows 7; encrypt windows 7 partition using bitlocker compare journal and report data from the reading materials with the actual bitlocker system on an ongoing basis Progress: • • • • • an initial reading list has been put together IPO has been submitted to the school office (23.09.2009) I'm reading several documents pertaining to the topic the schedule is roughly established, but contains only tangible dates such as deadlines windows 7 has been installed, but I have yet to configure bitlocker Supervisor’s Comments: EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 01.10.2009 Last diary date: 23.09.2009 Objectives: extend the reading list by scanning bibliographies of articles for relevant information continue reading establish a schedule with events and deadlines relating to the project (ongoing) encrypt windows 7 partition using bitlocker compare journal and report data from the reading materials with the actual bitlocker system on an ongoing basis Progress: • • • • Before extending the list, I want to get more acquainted with the subject I'm continuing on with reading, and will address questions to supervisor Schedule has been updated I'm having some laptop problems, so the practical section of the project will wait until after the lit review Supervisor’s Comments: Author: 08008480 11/05/2010 47 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 09.10.2009 Last diary date: 01.10.2009 Objectives: Currently reading: Jesse D. Kornblum, Implementing BitLocker Drive Encryption for forensic analysis, 2009 from ScienceDirect Must-get list: Microsoft Corporation. Bitlocker drive encryption technical overview. Technical report. Microsoft Corporation, http://technet2.microsoft.com/WindowsVista/en/library/ce4d5a2e59a5-4742-89cc-ef9f5908b4731033.mspx?mfr=true; May 2008a. Kumar Nitin, Kumar Vipin. Bitlocker and Windows Vista, http://www.nvlabs.in/node/9; May 2008 Progress: • • I'm currently reading some interesting stuff about how BitLocker keeps it's keys in the Volume Header, encrypted with the Volume Master Key, and vice versa. I struck gold with the journal I'm currently reading. There is lots of good information there. I need to get a hold of all the sources referred to in the current text – most are from Microsoft, and one (Kumar, Kumar) contains source code for a version of bitlocker devised on the basis of reverse engineering and reading spec papers. Supervisor’s Comments: Author: 08008480 11/05/2010 48 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 15.10.2009 Last diary date: 09.10.2009 Objectives: • • • • Read through the lit review list Apply for a student grant for a tester machine that could run a 3-OS bootloader with winXP, win7, and Linux (see NVLabs paper and Princeton students’ paper and use the same Linux they did) Find a program capable of viewing the BitLocker volume metadata as described in Implementing BitLocker for Digital Forensics. Start writing draft chapters of the report Progress: • • • • • • Got items from last week: Microsoft Corporation. Bitlocker drive encryption technical overview. Technical report. Microsoft Corporation, http://technet2.microsoft.com/WindowsVista/en/library/ce4d5a2e59a5-4742-89cc-ef9f5908b4731033.mspx?mfr=true; May 2008a. Kumar Nitin, Kumar Vipin. Bitlocker and Windows Vista, http://www.nvlabs.in/node/9; May 2008 I’m continuing reading through the lit review list I need a HEX viewer for BitLocker volume metadata in order to analyze the encrypted keys. I will ask uni instructors to see if they can provide one instead of sifting through potentially useless junk online. I got the application form for the student grant, and I’m in the process of submitting it. Supervisor’s Comments: Author: 08008480 11/05/2010 49 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 22.10.2009 Last diary date: 15.10.2009 Objectives: • • • • • • Continue reading Design and implement certificate cracker Write chapters Encrypt disk Get volume information viewer Apply for student grant – need help Progress: Read: Kumar Nitin, Kumar Vipin. Bitlocker and Windows Vista, http://www.nvlabs.in/node/9; May 2008 I’m continuing reading through the lit review list I need a HEX viewer for BitLocker volume metadata in order to analyze the encrypted keys. I will ask uni instructors to see if they can provide one instead of sifting through potentially useless junk online. I got the application form for the student grant, and I’m in the process of submitting it. I've put together a certificate cracker that uses a predefined dictionary but I need to add brute force functionality and fully document it. Right now the design is literally on a napkin. Supervisor’s Comments: Author: 08008480 11/05/2010 50 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 30.10.2009 Last diary date: 22.10.2009 Objectives: • • • • • • Continue finding ideas Document certificate cracker Write interim review document – get template from Bill Get volume information viewer Apply for student grant – need help Find a copy of windows with BitLocker – ask Gordon Russell Progress: Still need a HEX viewer for BitLocker volume metadata in order to analyze the encrypted keys. I will ask uni instructors to see if they can provide one instead of sifting through potentially useless junk online. Application deadline for student grants was October – need to find other funding. Documentation for CertCrack started – program still needs a few features Supervisor’s Comments: Author: 08008480 11/05/2010 51 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 05.11.2009 Last diary date: 30.10.2009 Objectives: • • • • • • Write interim document Get a date for the interim review meeting Continue writing dissertation – can interim document chapters be re-used? Continue looking for Win7 Ultimate or Vista Get volume information viewer Find other funding Progress: Not sure how to put the interim review document together – but started writing Still no hex viewer Napier has no access to Win7 Ultimate – project hangs on funding at the moment Need to ask student affairs about project funding Supervisor’s Comments: Author: 08008480 11/05/2010 52 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 12.11.2009 Last diary date: 05.11.2009 Objectives: • • • • • Continue reading Write interim review document Extend literature review to incorporate all references Continue to find ways to acquire BitLocker for testing Get volume information viewer Progress: Still a few documents left to read Interim review document completed, just finishing up references; in-text referencing needs a bit of work. Extended lit review will go into the dissertation – review document will contain an abridged version. Supervisor’s Comments: Author: 08008480 11/05/2010 53 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 19.11.2009 Last diary date: 12.11.2009 Objectives: • • • • Submit Interim Review Document Extend literature review to incorporate all references Continue to find ways to acquire BitLocker for testing Test information viewers Progress: Finished interim review document needs to be submitted; turns out some aesthetic work doesn't translate from OpenOffice to Microsoft Office – submit in .pdf format. Several HEX viewers downloaded, but not sure if any of them will show volume information the way it was visible in the lit review papers. Try Windows Vista Enterprise available from the MSDN Alliance Supervisor’s Comments: Author: 08008480 11/05/2010 54 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 26.11.2009 Last diary date: 19.11.2009 Objectives: • • • • • Submit Interim Review Document Extend literature review and continue to look for new references Continue to find ways to acquire BitLocker for testing Test information viewers New laptop will come for Christmas Progress: Windows Vista Enterprise download didn't work – need to try again from the JKCC onto a USB stick. Will be done over Christmas break. Still need to test HEX viewers. Try Windows Vista Enterprise available from the MSDN Alliance Waiting on new laptop to arrive as a Christmas gift. Not sure if it has a TPM or what the exact specs are, but it will be better than the current one. And, if nothing else, it will give me a chance to take the current one apart and clean it so it doesn't make so much noise. Supervisor’s Comments: Author: 08008480 11/05/2010 55 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 03.12.2009 Last diary date: 26.11.2009 Objectives: • • • • • Set up Interim Review Meeting Extend literature review and continue to look for new references Continue to find ways to acquire BitLocker for testing Test information viewers New laptop will come for Christmas Progress: Interim meeting needs to be set up as soon as possible – already weeks overdue Waiting on new laptop to download the new software and operating systems onto it directly Still need to test HEX viewers. BitLocker will be accessible through Windows Vista Enterprise and Windows Server 2008 VMWare image. Windows 7 Ultimate not necessary, though would be nice to have. At the moment still waiting for the new laptop before any tests can be done. Supervisor’s Comments: Author: 08008480 11/05/2010 56 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 10.12.2009 Last diary date: 03.12.2009 Objectives: • • • • Attend Interim Review Meeting Acquire Windows with BitLocker Test information viewers Wait for laptop Progress: Interim Review Meeting next week Settled on getting Windows Vista Enterprise from the MSDN Alliance. Once the operating system is downloaded, the next phase of the project will begin. Still need to have a look at the HEX viewers, though not sure if the drive needs to be encrypted before it's looked at with the software. Supervisor’s Comments: Author: 08008480 11/05/2010 57 b) Trimester 2 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 01.02.2010 Last diary date: 25.01.2010 Objectives: Install bitlocker on the new laptop; encrypt partition and examine raw data structure design key distribution system for bitlocker application redesign character array for brute force loop in digital certificate application; allow user to input custom character lists Progress: • • • Getting errors from BitLocker saying I need to repartition the disk; Have made several attempts, but not having any success. Can't find any documentation explaining how the disk should be partitioned. BitLocker has quite a big key space, so putting together a list of keys on a single machine would take almost as long as brute-forcing itself; I'm trying to find a pre-made list. At the moment, to add extra characters to the brute-force loop, the entire program needs to be recompiled. There should be a way to add characters from within the program. Supervisor’s Comments: Author: 08008480 11/05/2010 58 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 08.02.2010 Last diary date: 01.02.2010 Objectives: Find alternate option to Windows Vista Enterprise that has BitLocker; ask around uni to see if the school would give me a Windows 7 Ultimate license Use MS Visio to turn paper diagrams into technical drawings; produce professional designs Test CertCrack with certificates generated by other people Tune CertCrack character lists; document changes Progress: • • • • Still no luck with new laptop's BitLocker settings. According to documentation, Ultimate version comes with “BitLocker Drive Preparation Tool” Designs for the first, most basic version of CertCrack is a pencil and paper drawing – I need to convert it into something I can add to the appendix. Also need to add newest changes to the designs I've tested the digital certificate program with certificates I've created, but I've never tried one where I didn't already know the password. Need to test the application with external input. CertCrack still needs a way to modify the character lists for brute force without recompiling the program. I've added 3 alphabet options (alphanumeric, CAPS alphanumeric, or lowercase letters) but the application needs something custom Supervisor’s Comments: Author: 08008480 11/05/2010 59 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 15.02.2010 Last diary date: 08.02.2010 Objectives: Finish up custom character lists for brute force in CertCrack design proper menus in the programs; the current ones look unprofessional continue with more lit review and start writing dissertation chapters finish designs for bitlocker application – use brute-force Progress: • • • • I've managed to come up with a way to create user-defined character lists using String.Split(). As long as the user is forewarned that they must use a certain delimiter and that the program will only cycle through the characters the user supplies, it should work fine. The menus made of hash signs don't look too good – must find unicode character codes for DOS-style menus in command line applications. My reference list still looks a bit short; granted there don't seem to be very many academic papers on cracking BitLocker or EFS, but I should dig around for something. Also, I need to start putting together a dissertation draft. Because I can't get BitLocker to work, I need to start designing something that should work based on the information supplied in the Lit Review. Hopefully by the time I design it, I'll get a functioning copy of the software. Supervisor’s Comments: Author: 08008480 11/05/2010 60 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 22.02.2010 Last diary date: 15.02.2010 Objectives: Find alternate option to Windows Vista Enterprise that has BitLocker; or attempt to emulate it based on specs in Lit Review Start putting BitLocker designs together in Visio Implement native dictionary in CertCrack; add menu to choose from external or native Document changes Progress: • • • While I can't get BitLocker to work, why not put together an encrypting function, that will basically do the same thing, but with a static sector key if we're only working with one sector (use random numbers for a start) I'm slowly starting to implement some of the Future Work and Shortcomings points from the Interim Review Document. One of those was to put a basic weak password dictionary into the program in case the user can't get one. The program now features a dictionary that contains a few weak passwords, and takes the program 30 seconds to get through on the current (1.5GHz single core) laptop. As always, amend the designs to reflect the current state of the CertCrack program. Supervisor’s Comments: Author: 08008480 11/05/2010 61 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 01.03.2010 Last diary date: 22.02.2010 Objectives: • • • • Finish coding the Encrypt and Decrypt functions in the BitLocker programs. Debug send and receive code. Come up with a better way to distribute AES keys. Continue writing dissertation chapters, using interim review document for a starting place. Find more Lit Review describing EFS weaknesses Progress: I'm having a problem with the code, because it seems to send the encrypted sector, and then floods the buffer with zeros. Need to find a way to flush the buffer between sends. At the moment, I've come up with a series of test AES keys in base64 stored in a file on the client side. I want the server to distribute keys to clients, but I need a list of all the keys, and a way for the server to read in a few thousand keys from the file, and then send it to a connecting client. I spoke with Jim Jackson, and he said to focus on the learning outcomes outlined at the beginning of the module, so I'm completely revising the document. BitLocker is pretty well documented in the report so far, but I don't really seem to have any outsiders' opinions on EFS – so far, all I have are Microsoft technical documents. I need to find more information from people who have successfully broken it. Supervisor’s Comments: Author: 08008480 11/05/2010 62 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 08.03.2010 Last diary date: 01.03.2010 Objectives: • • • • Catch up on documentation of BitLocker solution Implement command line argument interpreters in the client program Start producing screen shots of CertCrack utility Set up Windows Server 2008 image and install BitLocker on it Progress: I'm deviating quite a lot from the original design of the BitLocker solution, so I need to modify the designs to match what the program currently does. At the moment, the client BitLocker program asks for IP address and port number on start, but it's quite annoying to have to put it in each time the program starts – the program should be able to run with the IP address and port number as command line arguments. I've got a general idea of how to do it, just need to work out the bugs. CertCrack needs to be well documented for the dissertation – I'll be filling the appendix with screen shots of it working. Just got the VM image of Server 2008, and installed the BitLocker function on it. Unfortunately, I'm not sure if I can use the current solution with a virtual hard disk. So far it's only configured to look for what's plugged into the machine the server program is running on, and I think if I attempt to read the disk using my program, BitLocker will automatically decrypt the hard drive sector i'm trying to send. Supervisor’s Comments: Author: 08008480 11/05/2010 63 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 15.03.2010 Last diary date: 08.03.2010 Objectives: • • • • Attempt to isolate the hard disk file from the VM image and mount it onto the computer with the server program. Rewrite the SectorSender class in the BitLocker solution so it doesn't encrypt the sector Implement authentic BitLocker functions in the decrypting class in the client Document changes. Progress: New laptop just broke – backlight or backlight inverter just burned out. I will have to find an alternate computer while I get it fixed. I also lost access to VMWare and the Windows Server 2008 image along with the software to mount virtual disks. I will most likely have to make do with the encryption emulator version I have backed up. Supervisor’s Comments: Author: 08008480 11/05/2010 64 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 22.03.2010 Last diary date: 15.03.2010 Objectives: • • • Recover backup code version Bring recovered version to the state outlined in the technical drawings and flowcharts based on the previous version. Attempt to fix laptop containing current version Progress: The backup code version is quite a bit older than what I was working on before the laptop died. I need to try to get it back to the state that I had the code on the other computer. At the moment, the CertCrack program hasn't been affected, but I need to bring the BitLocker utility back up to spec. This is a bit difficult as well, because apparently, the computer I'm working on right now doesn't have much hard disk space and generally isn't very fast. Will do my best, though. Supervisor’s Comments: Author: 08008480 11/05/2010 65 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 29.03.2010 Last diary date: 22.03.2010 Objectives: • • • Continue writing dissertation; abandon VM testing for now, but focus on extending Lit Review and documenting software solutions to date Try to come up with a good key distribution design If possible, implement a demo version of this design Progress: Due to the laptop being out of action, I can't continue with the plan to test BitLocker with a VM hard disk. Unfortunately, this laptop is excruciatingly slow when running it's own operating system, and I can only imagine what it would be like if it tried running Server 2008 as well. The BitLocker functions needed to mount the disk with the appropriate key are described in the report, and, in more detail, in the Niels Ferguson paper from 2006. I've actually checked the numbers, and there is more key material to deal with than I could possibly deal with. No wonder a 'file containing all possible combinations' doesn't exist – that's not remotely realistic. I terribly underestimated the amount of keys there was. The storage requirements for even keeping track of which keys were checked are immense, so I'm struggling to provide a working solution. Supervisor’s Comments: Author: 08008480 11/05/2010 66 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 05.04.2010 Last diary date: 29.03.2010 Objectives: • • • • Implement a temporary key handling strategy, and add the problem to Future Work and Shortcomings. Document changes. Continue working on report; make sure there are no outdated statements or inaccurate assumptions. Work on testing the code and finalizing everything. Progress: The key handling strategy for demonstrative purposes only will be one where the server sends a 24-byte key fragment to each client, and each client will brute force the rest of the key space. There will be five key fragments hard-coded into the server program, and one of the key fragments will correspond with the key used to encrypt the sector. I'm making sure that the descriptions of the programs in the report match the newest changes. So far, it looks like with 8 bytes to brute force, the client program is taking a really long time to finish even one key fragment. It may be wise to decrease it to 6 or 7 bytes, though it's not necessary. Supervisor’s Comments: Author: 08008480 11/05/2010 67 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 12.04.2010 Last diary date: 05.04.2010 Objectives: • • • Design and implement a feature that returns unfinished keys back to the key pool in the BitLocker application. Start working on project evaluation and start finishing up the report. Design the poster for the presentation. Progress: Before the key return feature, when a client would unexpectedly disconnect from the server, the key would be lost, and whatever portion of the key space was not tested would be lost. With this feature in place, instead of discarding the key, the program puts the key back into the key pool. I got the email with the poster guidelines. Will start working on the poster, but this means I need new screen shots for the poster. Supervisor’s Comments: Author: 08008480 11/05/2010 68 EDINBURGH NAPIER UNIVERSITY SCHOOL OF COMPUTING PROJECT DIARY Student: Adrian Vergin Supervisor: Bill Buchanan Date: 19.04.2010 Last diary date: 12.04.2010 Objectives: • • • Sign up for poster session Finish report Print poster and bind dissertation Progress: Making sure everything is done and ready to be turned in. Supervisor’s Comments: Author: 08008480 11/05/2010 69 4. Schedule a) Trimester 1 b) Trimester 2 Author: 08008480 11/05/2010 70 5. CertCrack a) Figure 1: Program Author: 08008480 11/05/2010 71 b) Figure 1.1: Dictionary Author: 08008480 11/05/2010 72 c) Figure 1.2: Brute Force Author: 08008480 11/05/2010 73 d) Source Code: Program using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography.X509Certificates; using System.IO; using System.Collections; namespace CertCrack { class Program { static void Main(string[] args) { int menu = 0; string filePath; string dictPath; string result = ""; do { Console.WriteLine("\r\n\r\n╔═════════════════════════╗"); Console.WriteLine("║ Choose cracking option: ║"); Console.WriteLine("╠═════════════════════════╣"); Console.WriteLine("║ 1. Dictionary ║"); Console.WriteLine("║ 2. Brute Force ║"); Console.WriteLine("║ ║"); Console.WriteLine("║ 9. Exit ║"); Console.WriteLine("║ ║"); Console.WriteLine("║ 0. Information ║"); Console.WriteLine("╚═════════════════════════╝"); bool success = false; do { try { Console.Write("Option: "); menu = int.Parse(Console.ReadLine()); success = true; } catch { Console.Write ("Not a valid number. Try again: "); } } while (success != true); switch (menu) { case 0: Console.WriteLine("\r\n\r\nCertCrack v1.0\r\n---------------\r\n"); Console.WriteLine("\r\nAbout:\t\tCertCrack is a forensic tool which cracks X509 certificates\r\n\t\t" + "used in EFS encryption. This program works with .PFX\r\n\t\t" + "certificates as they contain both the public and private\r\n\t\t" + "keys. The program can has two modes of operation, Dictionary\r\n\t\t" + "and Brute Force.\r\n\r\nModes:\t\tBrute Force mode depends solely on the length of the password\r\n\t\t" + "used and the characters used in the password. Dictionary mode\r\n\t\t" + "is requires the user to provide a dictionary file containing\r\n\t\t" + Author: 08008480 11/05/2010 74 "weak password samples, formatted one password per line. After\r\n\t\t" + "successfully determining the password, the program displays the\r\n\t\t" + "certificate contents and can import the certificate into the\r\n\t\t" + "X509 store.\r\n\r\n"); result = "!"; break; case 1: Console.WriteLine("DICTIONARY"); do { Console.WriteLine("Where is the certificate?"); filePath = Console.ReadLine(); } while (!System.IO.File.Exists(filePath)); int menuDict = 0; Console.WriteLine("\r\n\r\n╔════════════════════════════════════╗"); Console.WriteLine("║ Choose dictionary: ║"); Console.WriteLine("╠════════════════════════════════════╣"); Console.WriteLine("║ 1. Native (Embedded) ║"); Console.WriteLine("║ 2. External (Text File) ║"); Console.WriteLine("╚════════════════════════════════════╝"); bool dictSuccess = false; do { try { Console.Write("Option: "); menuDict = int.Parse(Console.ReadLine()); dictSuccess = true; } catch { Console.Write("Not a valid number. Try again: "); } } while (dictSuccess != true && (menuDict == 1 || menuDict == 2)); switch (menuDict) { case 1: // special thanks to: http://www.openwall.com/passwords/wordlists/password.lst ArrayList dictionaryNative = new ArrayList { "12345", "abc123", "computer", "123456", "tigger", "1234", "a1b2c3", "qwerty", "123", "xxx", "money", "test", "password1", "carmen", "mickey", "secret", "summer", "internet", "service", "canada", "hello", "ranger", "shadow", "baseball", "donald", "harley", "hockey", "letmein", "maggie", "mike", "mustang", "snoopy", "buster", "dragon", "jordan", "michael", "michelle", "mindy", "patrick", "123abc", "andrew", "bear", "calvin", "changeme", "diamond", "fuckme", "fuckyou", "matthew", "miller", "ou812", "tiger", "trustno1", "12345678", "123456789", "alex", "apple", "avalon", "brandy", "chelsea", "coffee", "dave", "falcon", "freedom", "gandalf", "golf", "green", "helpme", "linda", "magic", "merlin", "molson", "newyork", "soccer", "thomas", "wizard", "Monday", "asdfgh", "bandit", "batman", "boris", "butthead", "dorothy", "eeyore", "fishing", "football", "george", "happy", "iloveyou", "jennifer", "jonathan", "love", "marina", "master", "missy", "monday", "monkey", "natasha", "ncc1701", "newpass", "pamela", "pepper", "piglet", "poohbear", "pookie", "rabbit", "rachel", "rocket", "rose", "smile", "sparky", "spring", "steven", "success", "sunshine", "thx1138", "victoria", "whatever", "zapata", "1", "8675309", "Internet", "amanda", "andy", "angel", "august", "barney", "biteme", "boomer", "brian", "casey", "coke", "cowboy", "delta", "doctor", "fisher", "foobar", "island", "john", "joshua", Author: 08008480 11/05/2010 75 "karen", "marley", "orange", "please", "rascal", "richard", "sarah", "scooter", "shalom", "silver", "skippy", "stanley", "taylor", "welcome", "zephyr", "111111", "1928", "aaaaaa", "abc", "access", "albert", "alexander", "andrea", "anna", "anthony", "asdfjkl;", "ashley", "basf", "basketball", "beavis", "black", "bob", "booboo", "bradley", "brandon", "buddy", "caitlin", "camaro", "charlie", "chicken", "chris", "cindy", "cricket", "dakota", "dallas", "daniel", "david", "debbie", "dolphin", "elephant", "emily", "fish", "fred", "friend", "fucker", "ginger", "goodluck", "hammer", "heather", "help", "iceman", "jason", "jessica", "jesus", "joseph", "jupiter", "justin", "kevin", "knight", "lacrosse", "lakers", "lizard", "madison", "mary", "mother", "muffin", "murphy", "ncc1701d", "newuser", "nirvana", "none", "paris", "pat", "pentium", "phoenix", "picture", "rainbow", "sandy", "saturn", "scott", "shannon", "shithead", "skeeter", "sophie", "special", "stephanie", "stephen", "steve", "sweetie", "teacher", "tennis", "test123", "tommy", "topgun", "tristan", "wally", "william", "wilson", "1q2w3e", "654321", "666666", "777", "a12345", "a1b2c3d4", "alpha", "amber", "angela", "angie", "archie", "asdf", "blazer", "bond007", "booger", "charles", "christin", "claire", "control", "danny", "david1", "dennis", "digital", "disney", "dog", "duck", "duke", "edward", "elvis", "felix", "flipper", "floyd", "franklin", "frodo", "guest", "honda", "horses", "hunter", "indigo", "info", "james", "jasper", "jeremy", "joe", "julian", "kelsey", "killer", "kingfish", "lauren", "marie", "maryjane", "matrix", "maverick", "mayday", "mercury", "micro", "mitchell", "morgan", "mountain", "niners", "nothing", "oliver", "peace", "peanut", "pearljam", "phantom", "popcorn", "princess", "psycho", "pumpkin", "purple", "randy", "rebecca", "reddog", "robert", "rocky", "roses", "salmon", "sam", "samson", "sharon", "sierra", "smokey", "startrek", "steelers", "stimpy", "sunflower", "superman", "support", "sydney", "techno", "telecom", "test1", "walter", "willie", "willow", "winner", "ziggy", "zxcvbnm", "7777", "OU812", "a", "absolut", "alaska", "alexis", "alice", "animal", "apples", "babylon5", "backup", "barbara", "benjamin", "bill", "billy", "bird33", "blue", "bluebird", "bobby", "bonnie", "bubba", "camera", "chocolate", "clark", "claudia", "cocacola", "compton", "connect", "cookie", "cruise", "deliver", "douglas", "dreamer", "dreams", "duckie", "eagles", "eddie", "einstein", "enter", "explorer", "faith", "family", "ferrari", "fire", "flamingo", "flip", "flower", "foxtrot", "francis", "freddy", "friday", "froggy", "galileo", "giants", "gizmo", "global", "goofy", "gopher", "hansolo", "happy1", "hendrix", "henry", "herman", "homer", "honey", "house", "houston", "iguana", "indiana", "insane", "inside", "irish", "ironman", "jake", "jane", "jasmin", "jeanne", "jerry", "jim", "joey", "justice", "katherine", "kermit", "kitty", "koala", "larry", "leslie", "logan", "lucky", "mark", "martin", "matt", "minnie", "misty", "mitch", "mom", "mouse", "nancy", "nascar", "nelson", "netware", "pantera", "parker", "passwd", "penguin", "peter", "phil", "phish", "piano", "pizza", "porsche911", "prince", "punkin", "pyramid", "rain", "raymond", "red", "robin", "roger", "rosebud", "route66", "royal", "running", "sadie", "sasha", "security", "sergei", "sheena", "sheila", "skiing", "snapple", "snowball", "sparrow", "spencer", "spike", "star", "stealth", "student", "sun", "sunny", "sylvia", "tamara", "taurus", "tech", "teresa", "theresa", "thunderbird", "tigers", "tony", "toyota", "training", "travel", "truck", "tuesday", "victory", "video", "viper1", "volvo", "wesley", "whisky", "winnie", "winter", "wolves", "xyz123", "zorro", "!@#$%", "007", "123123", "1234567", "1969", "5683", "696969", "888888", "Anthony", "Bond007", "Friday", "Hendrix", "Joshua", "Matthew", "October", "Taurus", "Tigger", "aaa", "aaron", "abby", "abcdef", "adidas", "adrian", "alexandr", "alfred", "arthur", "athena", "austin", "awesome", "badger", "bamboo", "beagle", "bears", "beatles", "beautiful", "beaver", "benny", "bigmac", "bingo", "bitch", "blonde", "boogie", "boston", "brenda", "bright", "bubba1", "bubbles", "buffy", "button", "buttons", "cactus", "candy", "captain", "carlos", "caroline", "carrie", "casper", "catalog", Author: 08008480 11/05/2010 76 "catch22", "challenge", "chance", "charity", "charlotte", "cheese", "cheryl", "chloe", "chris1", "clancy", "clipper", "coltrane", "compaq", "conrad", "cooper", "cooter", "copper", "cosmos", "cougar", "cracker", "crawford", "crystal", "curtis", "cyclone", "cyrano", "dan", "dance", "dawn", "dean", "deutsch", "diablo", "dilbert", "dollars", "dookie", "doom", "dumbass", "dundee", "e-mail", "elizabeth", "eric", "europe", "export", "farmer", "firebird", "fletcher", "fluffy", "ford", "fountain", "fox", "france", "freak1", "friends", "frog", "fuckoff", "gabriel", "gabriell", "galaxy", "gambit", "garden", "garfield", "garlic", "garnet", "genesis", "genius", "godzilla", "goforit", "golfer", "goober", "grace", "grateful", "greenday", "groovy", "grover", "guitar", "hacker", "harry", "hazel", "hector", "herbert", "hoops", "horizon", "hornet", "howard", "icecream", "imagine", "impala", "informix", "jack", "janice", "jasmine", "jason1", "jeanette", "jeffrey", "jenifer", "jenni", "jesus1", "jewels", "joker", "password", "julie", "julie1", "junior", "justin1", "kathleen", "keith", "kelly", "kelly1", "kennedy", "kevin1", "knicks", "lady", "larry1", "ledzep", "lee", "leonard", "lestat", "library", "lincoln", "lionking", "london", "louise", "lucky1", "lucy", "maddog", "mailman", "majordomo", "mantra", "margaret", "mariposa", "market", "marlboro", "martin1", "marty", "master1", "mazda1", "mensuck", "mercedes", "metal", "metallic", "midori", "mikey", "millie", "mirage", "mmm", "molly", "monet", "money1", "monica", "monopoly", "mookie", "moose", "moroni", "music", "naomi", "nathan", "ncc1701e", "nesbitt", "news", "nguyen", "nicholas", "nicole", "nimrod", "october", "olive", "olivia", "one", "online", "open", "oscar", "oxford", "pacific", "painter", "peaches", "penelope", "pepsi", "pete", "petunia", "philip", "phoenix1", "photo", "pickle", "player", "poiuyt", "porsche", "porter", "ppp", "puppy", "python", "quality", "quest", "raquel", "raven", "remember", "republic", "research", "robbie", "robert1", "roman", "rugby", "runner", "russell", "ryan", "sailing", "sailor", "samantha", "savage", "sbdc", "scarlett", "school", "sean", "seven", "shadow1", "sheba", "shelby", "shit", "shoes", "simba", "simple", "skipper", "smiley", "snake", "snickers", "sniper", "snoopdog", "snowman", "sonic", "spitfire", "sprite", "spunky", "starwars", "station", "stella", "stingray", "storm", "stormy", "stupid", "sumuinen", "sunny1", "sunrise", "supra", "surfer", "susan", "tammy", "tango", "tanya", "tara", "teddy1", "temp", "testing", "theboss", "theking", "thumper", "tina", "tintin", "tomcat", "trebor", "trek", "trevor", "tweety", "unicorn", "valentine", "valerie", "vanilla", "veronica", "victor", "vincent", "viper", "warrior", "warriors", "weasel", "wheels", "wilbur", "winston", "wisdom", "wombat", "xanadu", "xavier", "xxxx", "yellow", "zaphod", "zeppelin", "zeus", "!@#$%^", "!@#$%^&*", "*", "0007", "1022", "10sne1", "1111", "1212", "1911", "1948", "1973", "1978", "1996", "1p2o3i", "2000", "2222", "3bears", "5252", "Andrew", "Broadway", "Champs", "Family", "Fisher", "Friends", "Jeanne", "Killer", "Knight", "Master", "Michael", "Michelle", "Pentium", "Pepper", "Raistlin", "Sierra", "Snoopy", "Tennis", "Tuesday", "abacab", "abcd", "abcd1234", "abcdefg", "abigail", "account", "ace", "acropolis", "adam", "adi", "alex1", "alice1", "allison", "alpine", "amy", "anders", "andre1", "andrea1", "angel1", "anita", "annette", "antares", "apache", "apollo", "aragorn", "arizona", "arnold", "arsenal", "asdfasdf", "asdfg", "asdfghjk", "avenger", "avenir", "baby", "babydoll", "bach", "bailey", "banana", "barry", "basil", "basket", "bass", "batman1", "beaner", "beast", "beatrice", "beer", "bella", "ben", "bertha", "bigben", "bigdog", "biggles", "bigman", "binky", "biology", "bishop", "bliss", "blondie", "blowfish", "bluefish", "bmw", "bobcat", "bosco", "boss", "braves", "brazil", "bridges", "bruce", "bruno", "brutus", "buck", "buffalo", "bugsy", "bull", "bulldog", "bullet", "bullshit", "bunny", "business", "butch", "butler", "butter", "california", "cannondale", "canon", "carebear", "carol", "carol1", "carole", "cassie", "castle", "catalina", "catherine", "catnip", "cccccc", "celine", "center", "champion", "chanel", "chaos", "chelsea1", "chester1", "chicago", "chico", "chip", "christian", "christy", "church", "cinder", "civil", "colleen", "colorado", "columbia", Author: 08008480 11/05/2010 77 "commander", "connie", "content", "cook", "cookies", "cooking", "cordelia", "corona", "cowboys", "coyote", "crack1", "craig", "creative", "crow", "cuddles", "cuervo", "cutie", "cyber", "daddy", "daisie", "daisy", "daniel1", "danielle", "dark1", "database", "davids", "deadhead", "death", "denali", "denis", "depeche", "derek", "design", "destiny", "diana", "diane", "dickens", "dickhead", "digger", "dodger", "don", "donna", "dougie", "draft", "dragonfly", "dylan", "eagle", "eclipse", "electric", "emerald", "emmitt", "entropy", "etoile", "excalibur", "express", "farout", "farside", "feedback", "fender", "fidel", "fiona", "fireman", "firenze", "fish1", "flash", "fletch", "florida", "flowers", "fool", "foster", "fozzie", "francesco", "francine", "francois", "frank", "french", "fuckface", "fun", "gargoyle", "gasman", "gemini", "general", "gerald", "germany", "gilbert", "goaway", "gold", "golden", "goldfish", "goose", "gordon", "graham", "grant", "graphic", "gregory", "gretchen", "gunner", "hal9000", "hannah", "harold", "harrison", "harvey", "hawkeye", "heaven", "heidi", "helen", "helena", "hell", "herzog", "hithere", "hobbit", "huey", "ibanez", "idontknow", "image", "integra", "intern", "intrepid", "ireland", "irene", "isaac", "isabel", "jackie", "jackson", "jaguar", "jamaica", "japan", "jeff", "jenny1", "jessie", "jethrotull", "jkl123", "joel", "johan", "johanna1", "johnny", "joker1", "jordan23", "judith", "julia", "jumanji", "jussi", "kangaroo", "karen1", "kathy", "keepout", "keith1", "kenneth", "kidder", "kim", "kimberly", "king", "kingdom", "kirk", "kitkat", "kramer", "kris", "kristen", "lambda", "laura", "laurie", "law", "lawrence", "lawyer", "legend", "leon", "liberty", "light", "lindsay", "lindsey", "lisa", "liverpool", "logical", "lola", "lonely", "lorrie", "louis", "lovely", "loveme", "lucas", "m", "madonna", "mail", "major", "malcolm", "malibu", "marathon", "marcel", "maria1", "mariah", "mariah1", "marilyn", "mariner", "mario", "mark1", "marvin", "maurice", "max", "maxine", "maxwell", "me", "media", "meggie", "melanie", "melissa", "melody", "merlot", "mexico", "michael1", "michele", "midnight", "midway", "mike1", "miki", "mine", "miracle", "misha", "mishka", "mmouse", "molly1", "monique", "montreal", "moocow", "moon", "moore", "mopar", "morris", "mort", "mortimer", "mouse1", "mulder", "nautica", "nellie", "nermal", "new", "newton", "nicarao", "nick", "nina", "nirvana1", "nissan", "norman", "notebook", "ocean", "olivier", "ollie", "olsen", "opera", "opus", "oranges", "oregon", "orion", "overkill", "pacers", "packer", "panda", "pandora", "panther", "passion", "patricia", "pearl", "peewee", "pencil", "penny", "people", "percy", "person", "peter1", "petey", "picard", "picasso", "pierre", "pinkfloyd", "pit", "plus", "polar", "polaris", "police", "polo", "pookie1", "poppy", "power", "predator", "preston", "primus", "prometheus", "public", "q1w2e3", "queen", "queenie", "quentin", "radio", "ralph", "random", "rangers", "raptor", "rastafarian", "reality", "redrum", "remote", "reptile", "reynolds", "rhonda", "ricardo", "ricardo1", "ricky", "river", "roadrunner", "rob", "robinhood", "robotech", "rocknroll", "rocky1", "rodeo", "rolex", "ronald", "rouge", "roxy", "roy", "ruby", "ruthie", "sabrina", "sakura", "salasana", "sally", "sampson", "samuel", "sandra", "santa", "sapphire", "scarecrow", "scarlet", "scorpio", "scott1", "scottie", "scout", "scruffy", "scuba1", "seattle", "serena", "sergey", "shanti", "shark", "shogun", "simon", "singer", "skibum", "skull", "skunk", "skywalker", "slacker", "smashing", "smiles", "snowflake", "snowski", "snuffy", "soccer1", "soleil", "sonny", "sound", "spanky", "speedy", "spider", "spooky", "stacey", "star69", "start", "starter", "steven1", "sting1", "stinky", "strawberry", "stuart", "sugar", "sunbird", "sundance", "superfly", "suzanne", "suzuki", "swimmer", "swimming", "system", "taffy", "tarzan", "tbird", "teddy", "teddybear", "teflon", "temporal", "terminal", "terry", "the", "theatre", "thejudge", "thunder", "thursday", "time", "tinker", "toby", "today", "tokyo", "tootsie", "tornado", "tracy", "tree", "tricia", "trident", "trojan", "trout", "truman", "trumpet", "tucker", "turtle", "tyler", "utopia", "vader", "val", "valhalla", "visa", "voyager", "warcraft", "warlock", "warren", "water", "wayne", "wendy", "williams", "willy", "win95", Author: 08008480 11/05/2010 78 "windsurf", "winona", "wolf", "wolf1", "woody", "woofwoof", "wrangler", "wright", "www", "xcountry", "xfiles", "xxxxxx", "y", "yankees", "yoda", "yukon", "yvonne", "zebra", "zenith", "zigzag", "zombie", "zxc123", "zxcvb", "zzz", "000000", "007007", "11111", "11111111", "1213", "1214", "1225", "123321", "1313", "1316", "1332", "1412", "1430", "171717", "1818", "181818", "1950", "1952", "1953", "1955", "1956", "1960", "1964", "1975", "1977", "1991", "1a2b3c", "1chris", "1kitty", "1qw23e", "2001", "2020", "2112", "22", "2200", "2252", "2kids", "3010", "3112", "3141", "333", "3533", "4055", "4444", "4788", "4854", "4runner", "5050", "5121", "54321", "55555", "57chevy", "6262", "6301", "6969", "7777777", "789456", "7dwarfs", "88888888", "Abcdefg", "Alexis", "Alpha", "Animals", "Ariel", "BOSS", "Bailey", "Bastard", "Beavis", "Bismillah", "Bonzo", "Booboo", "Boston", "Canucks", "Cardinal", "Carol", "Celtics", "ChangeMe", "Charlie", "Chris", "Computer", "Cougar", "Creative", "Curtis", "Daniel", "Darkman", "Denise", "Dragon", "Eagles", "Elizabeth", "Esther", "Figaro", "Fishing", "Fortune", "Freddy", "Front242", "Gandalf", "Geronimo", "Gingers", "Golden", "Goober", "Gretel", "HARLEY", "Hacker", "Hammer", "Harley", "Heather", "Henry", "Hershey", "Homer", "Jackson", "Janet", "Jennifer", "Jersey", "Jessica", "Joanna", "Johnson", "Jordan", "KILLER", "Katie", "Kitten", "Liberty", "Lindsay", "Lizard", "Madeline", "Margaret", "Maxwell", "Mellon", "Merlot", "Metallic", "Michel1", "Money", "Monster", "Montreal", "Newton", "Nicholas", "Noriko", "Paladin", "Pamela", "Password", "Peaches", "Peanuts", "Peter", "Phoenix", "Piglet", "Pookie", "Princess", "Purple", "Rabbit", "Raiders", "Random", "Rebecca", "Robert", "Russell", "Sammy", "Saturn", "Service", "Shadow", "Sidekick", "Skeeter", "Smokey", "Sparky", "Speedy", "Sterling", "Steven", "Summer", "Sunshine", "Superman", "Sverige", "Swoosh", "Taylor", "Theresa", "Thomas", "Thunder", "Vernon", "Victoria", "Vincent", "Waterloo", "Webster", "Willow", "Winnie", "Wolverine", "Woodrow", "World", "aa", "aaaa", "aardvark", "abbott", "abcd123", "abcde", "accord", "active", "acura", "adg", "admin", "admin1", "adrock", "aerobics", "africa", "agent", "airborne", "airwolf", "aki123", "alfaro", "ali", "alicia", "alien", "aliens", "alina", "aline", "alison", "allegro", "allen", "allstate", "aloha", "alpha1", "altamira", "althea", "altima", "altima1", "amanda1", "amazing", "america", "amour", "anderson", "andre", "andrew!", "andrew1", "andromed", "angels", "angie1", "ann", "anne", "anneli", "annie", "anything", "apple1", "apple2", "applepie", "april", "aptiva", "aqua", "aquarius", "ariane", "ariel", "arlene", "arrow", "artemis", "asdf1234", "asdf;lkj", "asdfjkl", "ashley1", "ashraf", "ashton", "assmunch", "asterix", "attila", "autumn", "avatar", "ayelet", "aylmer", "babes", "bambi", "baraka", "barbie", "barn", "barney1", "barnyard", "barrett", "bart", "bartman", "bball", "beaches", "beanie", "beans", "beasty", "beauty", "beavis1", "bebe", "becca", "belgium", "belize", "belle", "belmont", "benji", "benson", "beowulf", "bernardo", "berry", "beryl", "best", "beta", "betacam", "betsy", "betty", "bharat", "bichon", "bigal", "bigboss", "bigred", "biker", "bilbo", "bills", "billy1", "bimmer", "bioboy", "biochem", "birdie", "birdy", "birthday", "biscuit", "bitter", "biz", "blackjack", "blah", "blanche", "blinds", "blitz", "blood", "blowjob", "blowme", "blueeyes", "bluejean", "blues", "boat", "bogart", "bogey", "bogus", "bombay", "boobie", "boots", "bootsie", "boulder", "bourbon", "boxer", "boxers", "bozo", "brain", "branch", "brandi", "brent", "brewster", "bridge", "britain", "broker", "bronco", "bronte", "brooke", "brother", "bryan", "bubble", "bucks", "buddha", "budgie", "buffett", "bugs", "bulls", "burns", "burton", "butterfly", "buzz", "byron", "c00per", "calendar", "calgary", "calvin1", "camay", "camel", "camille", "campbell", "camping", "cancer", "canela", "cannon", "car", "carbon", "carl", "carnage", "carolyn", "carrot", "cascade", "cat", "catfish", "cathy", "catwoman", "cecile", "celica", "cement", "cessna", "chad", "chainsaw", "chameleon", "chang", "change", "chantal", "charger", "chat", "cherry", "chess", "chiara", Author: 08008480 11/05/2010 79 "chiefs", "china", "chinacat", "chinook", "chouette", "chris123", "christ1", "christmas", "christopher", "chronos", "chuck", "cicero", "cindy1", "cinema", "circuit", "cirque", "cirrus", "civic", "clapton", "clarkson", "class", "claude", "claudel", "cleo", "cliff", "clock", "clueless", "cobain", "cobra", "cody", "colette", "college", "color", "colors", "colt45", "comet", "concept", "concorde", "confused", "cool", "coolbean", "cora", "corky", "cornflake", "corvette", "corwin", "cosmo", "country", "courier", "cows", "crescent", "cross", "crowley", "crusader", "cthulhu", "cuda", "cunningham", "cunt", "cupcake", "current", "cutlass", "cynthia", "daedalus", "dagger", "dagger1", "daily", "dale", "dammit", "damogran", "dana", "dancer", "daphne", "darkstar", "darren", "darryl", "darwin", "data1", "datatrain", "daytek", "dead", "deborah", "december", "decker", "deedee", "deeznuts", "def", "delano", "delete", "demon", "denise", "denny", "desert", "deskjet", "detroit", "devil", "devine", "devon", "dexter", "dharma", "dianne", "diesel", "dillweed", "dim", "dipper", "director", "disco", "dixie", "dixon", "doc", "dodgers", "dogbert", "doggy", "doitnow", "dollar", "dolly", "dominique", "domino", "dontknow", "doogie", "doors", "dork", "doudou", "doug", "downtown", "dragon1", "driver", "dude", "dudley", "dutch", "dutchess", "dwight", "eagle1", "easter", "eastern", "edith", "edmund", "effie", "eieio", "eight", "element", "elina1", "elissa", "ella", "ellen", "elliot", "elsie", "empire", "engage", "enigma", "enterprise", "eric1", "erin", "ernie1", "escort", "escort1", "estelle", "eugene", "evelyn", "excel", "explore", "eyal", "faculty", "fairview", "family1", "fatboy", "faust", "felipe", "fenris", "ferguson", "ferret", "ferris", "finance", "fireball", "first", "fishes", "fishhead", "fishie", "flanders", "fleurs", "flight", "florida1", "flowerpot", "flute", "fly", "flyboy", "flyer", "forward", "franka", "freddie", "frederic", "free", "freebird", "freeman", "frisco", "fritz", "froggie", "froggies", "frogs", "front242", "frontier", "fucku", "fugazi", "funguy", "funtime", "future", "fuzz", "gabby", "gaby", "gaelic", "gambler", "games", "gammaphi", "garcia", "garfunkel", "garth", "gary", "gaston", "gateway", "gateway2", "gator1", "george1", "georgia", "german", "germany1", "getout", "ggeorge", "ghost", "gibbons", "gibson", "gigi", "gilgamesh", "giselle", "glider1", "gmoney", "goat", "goblin", "goblue", "godiva", "goethe", "gofish", "gollum", "gone", "good", "gramps", "grandma", "gravis", "gray", "greed", "greg", "greg1", "gremlin", "greta", "gretzky", "grizzly", "grumpy", "guess", "guido", "guitar1", "gumby", "gustavo", "h2opolo", "haggis", "haha", "hailey", "hal", "halloween", "hallowell", "hamid", "hamilton", "hamlet", "hank", "hanna", "hanson", "happy123", "happyday", "hardcore", "harley1", "haro", "harriet", "harris", "harvard", "hawk", "hawkeye1", "health", "health1", "heart", "heather1", "heather2", "hedgehog", "heikki", "helene", "hello1", "hello123", "hello8", "hellohello", "help123", "helper", "hermes", "heythere", "highland", "hilda", "hillary", "histoire", "history", "hitler", "hobbes", "holiday", "holly", "homerj", "honda1", "hongkong", "hoosier", "hootie", "hope", "horse", "hosehead", "hotrod", "huang", "hudson", "hugh", "hugo", "hummer", "huskies", "hydrogen", "i", "ib6ub9", "idiot", "if6was9", "iforget", "ilmari", "iloveu", "impact", "indonesia", "ingvar", "insight", "instruct", "integral", "iomega", "irina", "iris", "irmeli", "isabelle", "israel", "italia", "italy", "izzy", "j0ker", "j1l2t3", "jackie1", "jacob", "jakey", "james1", "jamesbond", "jamie", "jamjam", "jan", "jazz", "jean", "jedi", "jeepster", "jeffrey1", "jennie", "jenny", "jensen", "jer", "jesse", "jesse1", "jester", "jethro", "jetta1", "jimbob", "jimi", "jimmy", "joanie", "joanna", "joelle", "john316", "jordie", "jorge", "josee", "josh", "journey", "joy", "joyce", "jubilee", "juhani", "jules", "julia2", "julien", "juliet", "jumbo", "jump", "junebug", "juniper", "justdoit", "justice4", "kalamazo", "kali", "karin", "karine", "karma", "kat", "kate", "katerina", "katie", "katie1", "kayla", "kcin", "keeper", "keller", "kendall", "kenny", "kerala", "kerrya", "ketchup", "khan", "kids", "kings", "kissa2", "kissme", "kitten", "kittycat", "kiwi", "kkkkkk", "kleenex", "kombat", "kristi", "kristine", "lab1", "labtec", "laddie", "ladybug", "lamer", "lance", "laser", Author: 08008480 11/05/2010 80 "laserjet", "lassie1", "laurel", "lawson", "leader", "leaf", "leblanc", "legal", "leland", "lemon", "leo", "lester", "letter", "letters", "lev", "lexus1", "libra", "life", "lights", "lima", "lionel", "lions", "lissabon", "little", "liz", "lizzy", "logger", "logos", "loislane", "loki", "lolita", "lonestar", "longer", "longhorn", "looney", "loren", "lori", "lorna", "loser", "lost", "lotus", "lou", "lovers", "loveyou", "lucia", "lucifer", "lucky14", "macha", "macross", "macse30", "maddie", "madmax", "madoka", "magic1", "magnum", "maiden", "maine", "makeitso", "mallard", "manageme", "manson", "manuel", "marc", "marcus", "maria", "marielle", "marine", "marino", "marshall", "mart", "martha", "math", "matti1", "mattingly", "maxmax", "meatloaf", "mech", "mechanic", "medical", "megan", "meister", "melina", "memphis", "mercer", "merde", "mermaid", "merrill", "miami", "michal", "michel", "michigan", "michou", "mickel", "mickey1", "microsoft", "midvale", "mikael", "milano", "miles", "millenium", "million", "minou", "miranda", "miriam", "mission", "mmmmmm", "mobile", "mobydick", "modem", "mojo", "monkey1", "monroe", "montana", "montana3", "montrose", "monty", "moomoo", "moonbeam", "morecats", "morpheus", "motor", "motorola", "movies", "mowgli", "mozart", "mulder1", "munchkin", "murray", "muscle", "mustang1", "nadia", "nadine", "napoleon", "nation", "national", "neil", "neko", "nesbit", "nestle", "neutrino", "newaccount", "newlife", "newyork1", "nexus6", "nichole", "nicklaus", "nightshadow", "nightwind", "nike", "nikita", "nikki", "nintendo", "nisse", "nokia", "nomore", "none1", "nopass", "normal", "norton", "notta1", "nouveau", "novell", "noway", "nugget", "number9", "numbers", "nurse", "nutmeg", "oaxaca", "obiwan", "obsession", "ohshit", "oicu812", "omega", "openup", "orchid", "oreo", "orlando", "orville", "otter", "ozzy", "paagal", "packard", "packers", "packrat", "paint", "paloma", "pam", "pancake", "panic", "papa", "paradigm", "park", "parola", "parrot", "partner", "pascal", "pass", "patches", "patriots", "paula", "pauline", "pavel", "payton", "peach", "peanuts", "pedro1", "peggy", "pekka", "perfect", "performa", "perry", "peterk", "peterpan", "phialpha", "philips", "phillips", "phishy", "phone", "piano1", "pianoman", "pianos", "pierce", "pigeon", "pink", "pioneer", "pipeline", "piper1", "pirate", "pisces", "plato", "play", "playboy", "pluto", "poetic", "poetry", "pole", "pontiac", "pookey", "pope", "popeye", "prayer", "precious", "prelude", "premier", "print", "printing", "prof", "provider", "puddin", "pulsar", "pussy", "pussy1", "pyro", "qqq111", "quebec", "qwer", "qwert", "qwerty12", "qwertyui", "r0ger", "rabbit1", "racer", "racerx", "rachelle", "racoon", "radar", "rafiki", "raleigh", "ram", "rambo", "randy1", "rasta1", "ratio", "ravens", "redcloud", "redfish", "redman", "redskins", "redwing", "redwood", "reed", "reggae", "reggie", "reliant", "rene", "renee", "renegade", "rescue", "revolution", "rex", "reznor", "rhino", "rhjrjlbk", "richard1", "richards", "richmond", "riley", "ripper", "ripple", "rita", "robby", "roberts", "robocop", "robotics", "roche", "rock", "rocket1", "rockie", "rockon", "roger1", "rogers", "roland", "rommel", "roni", "rookie", "rootbeer", "rosie", "rossigno", "rufus", "rugger", "rush", "rusty", "ruthless", "sabbath", "sabina", "safety", "safety1", "saigon", "saint", "samIam", "samiam", "sammie", "sammy", "samsam", "sandi", "sanjose", "saphire", "sarah1", "saskia", "sassy", "satori", "saturday", "saturn5", "schnapps", "science", "scooby", "scoobydoo", "scooter1", "scorpion", "scotch", "scotty", "scouts", "scuba", "search", "secret3", "seeker", "seoul", "september", "server", "services", "seven7", "sex", "sexy", "shaggy", "shanghai", "shanny", "shaolin", "shasta", "shayne", "shazam", "shelly", "shelter", "sherry", "ship", "shirley", "shorty", "shotgun", "sidney", "sigmachi", "signal", "signature", "simba1", "simsim", "sinatra", "sirius", "skate", "skip", "skipper1", "skydive", "skyler", "slayer", "sleepy", "slick", "slider", "slip", "smegma", "smile1", "smiths", "smitty", "smoke", "smurfy", "snakes", "snapper", "snoop", "snow", "sober1", "solomon", "sonics", "sony", "sophia", "space", "sparks", "spartan", "spazz", "sphynx", "spike1", "spock", "sponge", "spoon", "spot", "sprocket", "spurs", Author: 08008480 11/05/2010 81 "squash", "stan", "starbuck", "stargate", "starlight", "stars", "steel", "steph1", "stephi", "steve1", "stevens", "stewart", "sting", "stivers", "stocks", "stone", "storage", "stranger", "strat", "strato", "stretch", "strong", "stud", "student2", "studio", "stumpy", "sucker", "suckme", "sue", "sultan", "summit", "sunfire", "sunset", "super", "superstar", "surfing", "susan1", "susanna", "sutton", "suzy", "swanson", "sweden", "sweetpea", "sweety", "swim", "switzer", "swordfish", "system5", "t-bone", "tab", "tabatha", "tacobell", "taiwan", "talon", "tamtam", "tanner", "tapani", "targas", "target", "tarheel", "tasha", "tata", "tattoo", "tazdevil", "tequila", "terry1", "test2", "test3", "tester", "testi", "testtest", "texas", "thankyou", "theend", "thelorax", "thisisit", "thompson", "thorne", "thrasher", "tiger2", "tightend", "tika", "tim", "timber", "timothy", "tinkerbell", "tnt", "tom", "tool", "topcat", "topher", "toshiba", "total", "toto1", "tototo", "toucan", "transfer", "transit", "transport", "trapper", "trash", "travis", "tre", "treasure", "trees", "tricky", "trish", "triton", "trombone", "trophy", "trouble", "trucker", "tucson", "tula", "turbo", "turbo2", "twins", "tyler1", "ultimate", "unique", "united", "unity", "unix", "upsilon", "ursula", "user1", "vacation", "valley", "vampire", "vanessa", "vedder", "velo", "venice", "venus", "vermont", "vette", "vicki", "vicky", "victor1", "vikram", "vincent1", "violet", "violin", "virago", "virgil", "virginia", "vision", "visual", "volcano", "volley", "voodoo", "vortex", "waiting", "walden", "waldo", "walleye", "wanker", "warner", "water1", "wayne1", "webmaster", "webster", "wedge", "weezer", "wendy1", "western", "whale1", "whit", "white", "whitney", "whocares", "whoville", "wibble", "wildcat", "will", "william1", "wilma", "wind", "window", "winniethepooh", "wolfgang", "wolverine", "wombat1", "wonder", "word", "world", "x-files", "x-men", "xanth", "xxx123", "xxxxxxxx", "xyz", "yamaha", "yankee", "yogibear", "yolanda", "yomama", "yvette", "zachary", "zack", "zebras", "zepplin", "zoltan", "zoomer", "zxc", "zxcvbn", "!@#$%^&", "00000000", "121212", "1234qwer", "123go", "131313", "13579", "1701d", "21122112", "369", "5555", "80486", "90210", "911", "99999999", "@#$%^&", "ABC123", "Abcdef", "Asdfgh", "Casio", "Changeme", "FuckYou", "Fuckyou", "Gizmo", "Hello", "JSBach", "Michel", "NCC1701", "PPP", "Qwert", "Qwerty", "Windows", "Zxcvb", "Zxcvbnm", "action", "advil", "allo", "amelie", "anaconda", "angus", "apollo13", "artist", "aspen", "ass", "asshole", "ath", "benoit", "bernard", "bernie", "bigbird", "bird", "blizzard", "bluesky", "bonjour", "booster", "byteme", "caesar", "cardinal", "carolina", "cats", "cedic", "cesar", "chandler", "changeit", "chapman", "charlie1", "chevy", "chiquita", "chocolat", "christia", "christoph", "classroom", "cloclo", "coco", "corrado", "cougars", "courtney", "dasha", "demo", "dirk", "dolphins", "dominic", "donkey", "doom2", "dusty", "e", "eminem", "energy", "fearless", "fiction", "forest", "forever", "french1", "fubar", "gator", "gilles", "glenn", "go", "gocougs", "good-luck", "graymail", "guinness", "hilbert", "hola", "home", "homebrew", "hotdog", "indian", "jared", "jimbo", "jkm", "johnson", "jojo", "josie", "judy", "koko", "kristin", "lloyd", "lorraine", "lulu", "lynn", "m1911a1", "mac", "macintosh", "mailer", "mars", "maxime", "memory", "meow", "mimi", "mirror", "nat", "ne1410s", "ne1469", "ne14a69", "nebraska", "nemesis", "network", "newcourt", "nigel", "niki", "nite", "notused", "oatmeal", "patton", "paul", "pedro", "planet", "players", "politics", "pomme", "portland", "praise", "property", "protel", "psalms", "qwaszx", "raiders", "rambo1", "rancid", "ruth", "sales", "salut", "scrooge", "shawn", "shelley", "skidoo", "softball", "spain", "speedo", "sports", "sss", "ssssss", "steele", "steph", "stephani", "sunday", "surf", "sylvie", "symbol", "tiffany", "tigre", "toronto", "trixie", "undead", "valentin", "velvet", "viking", "walker", "watson", "young", "zhongguo", "babygirl", "1234567890", "pretty", "hottie", "teamo", "987654321", "naruto", "spongebob", "daniela", "princesa", "christ", "blessed", "single", "qazwsx", "pokemon", "iloveyou1", "iloveyou2", "fuckyou1", "hahaha", "poop", "blessing", Author: 08008480 11/05/2010 82 "blahblah", "forum", "blink182", "123qwe", "trinity", "passw0rd", "google", "looking", "spirit", "iloveyou!", "qwerty1", "rotimi", "onelove", "mylove", "god", "222222", "ilovegod", "football1", "loving", "emmanuel", "1q2w3e4r", "red123", "blabla", "saved", "112233", "hallo", "" }; result = crackUsingDictionary(filePath, dictionaryNative); break; case 2: do { Console.WriteLine("The dictionary can be any text file with one password per line.\r\nWhere is the dictionary?"); dictPath = Console.ReadLine(); } while (!System.IO.File.Exists(dictPath)); ArrayList dictionaryExternal = new ArrayList(); using (StreamReader sr = new StreamReader(dictPath)) { string line; try { while ((line = sr.ReadLine().ToLower()) != null) { dictionaryExternal.Add(line); } } catch (Exception exDict) { Console.WriteLine("Error:\r\n-------------------\r\n" + exDict.Message); } } result = crackUsingDictionary(filePath, dictionaryExternal); break; } if (result == "") goto fail; Console.WriteLine("RESULT: " + result + "\r\n\r\n"); try { Console.WriteLine("\r\nDisplay certificate information:"); printCertificateInfo(openCertificate(filePath, result)); Console.WriteLine("\r\n\r\n"); Console.Write("Import? [y/n] "); string import = Console.ReadLine(); if (import == "y" || import == "yes" || import == "Y" || import == "YES") { Console.Write("Importing certificate: "); bool importSuccess = ImportCertificate(openCertificate(filePath, result), StoreName.My, StoreLocation.CurrentUser); if (importSuccess == true) Console.WriteLine("SUCCESS!"); if (importSuccess == false) Console.WriteLine("FAILED!"); } } catch (Exception ex) { Console.WriteLine(ex.Message); Author: 08008480 11/05/2010 83 } Console.WriteLine("Done!\r\n\r\n"); Console.ReadLine(); break; case 2: Console.WriteLine("BRUTE FORCE"); do { Console.WriteLine("Enter file location:"); filePath = Console.ReadLine(); } while (!System.IO.File.Exists(filePath)); result = crackUsingBruteForce(filePath); if (result == "") goto fail; Console.WriteLine("RESULT: " + result + "\r\n\r\n"); try { Console.WriteLine("\r\nDisplay certificate information:"); printCertificateInfo(openCertificate(filePath, result)); Console.WriteLine("\r\n\r\n"); Console.Write("Import? [y/n] "); string import = Console.ReadLine(); if (import == "y" || import == "yes" || import == "Y" || import == "YES") { Console.Write("Importing certificate: "); bool importSuccess = ImportCertificate(openCertificate(filePath, result), StoreName.My, StoreLocation.CurrentUser); if (importSuccess == true) Console.WriteLine("SUCCESS!"); if (importSuccess == false) Console.WriteLine("FAILED!"); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.WriteLine("Done!\r\n\r\n"); Console.ReadLine(); break; case 9: break; default: Console.WriteLine("Invalid option - try again"); break; } fail: if (result == "") Console.WriteLine("Unable to obtain password!\r\n\r\n"); result = ""; } while (menu != 9); } public static string crackUsingDictionary(string fileLocation, ArrayList dict) { DateTime start = DateTime.Now; string result = ""; bool success = false; int counter = 0; Author: 08008480 11/05/2010 84 while (success == false && counter < dict.Count) { try { X509Certificate2 cert = new X509Certificate2(fileLocation, dict[counter].ToString()); Console.WriteLine("password \"" + dict[counter].ToString() + "\" - success!"); result = dict[counter].ToString(); success = true; } catch { Console.WriteLine("password \"" + dict[counter].ToString() + "\" - fail!"); } counter++; } // http://www.codersource.net/csharp_measure_execution_time.aspx DateTime finish = DateTime.Now; TimeSpan span = finish - start; Console.WriteLine("\r\n\r\nFinished in {0}:{1}:{2}.{3}", span.Hours.ToString(), span.Minutes.ToString().PadLeft(2, '0'), span.Seconds.ToString().PadLeft(2, '0'), span.Milliseconds.ToString()); if (success == false && result == "") { Console.WriteLine("\r\n\r\nDictionary did not contain the password.\r\nWould you like to use Brute Force? [y/n]"); if (Console.ReadLine().ToLower() == "y" || Console.ReadLine().ToLower() == "yes") { result = crackUsingBruteForce(fileLocation); } } return result; } public static string crackUsingBruteForce(string fileLocation) { int menu = 0; string[] characterPool = new string[0]; Console.WriteLine("\r\n\r\n╔════════════════════════════════════╗"); Console.WriteLine("║ Choose alphabet: ║"); Console.WriteLine("╠════════════════════════════════════╣"); Console.WriteLine("║ 1. Alphanumeric Lowercase ║"); Console.WriteLine("║ 2. Alphanumeric with CAPS ║"); Console.WriteLine("║ 3. No Numbers Lowercase Only ║"); Console.WriteLine("║ 4. No Numbers with CAPS ║"); Console.WriteLine("║ 5. Custom ║"); Console.WriteLine("╚════════════════════════════════════╝"); bool optionSuccess = false; do { try { Console.Write("Option: "); menu = int.Parse(Console.ReadLine()); optionSuccess = true; Author: 08008480 11/05/2010 85 } catch { Console.Write("Not a valid number. Try again: "); } } while (optionSuccess != true); switch (menu) { case 1: characterPool = new string[] { "", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; break; case 2: characterPool = new string[] { "", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; break; case 3: characterPool = new string[] { "", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" }; break; case 4: characterPool = new string[] { "", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; break; case 5: Console.WriteLine("Enter each character to be used in the sample alphabet separated by commas (,) and press ENTER."); string[] blank = new string[] { "" }; string userSamples = Console.ReadLine(); string[] samples = userSamples.Split(','); int length = samples.Length + 1; characterPool = new string[length]; blank.CopyTo(characterPool, 0); samples.CopyTo(characterPool, 1); break; } DateTime start = DateTime.Now; string[] passArray = new string[32]; bool success = false; bool end = false; string result = ""; do { for (int c31 = 0; c31 < characterPool.Length; c31++) { passArray[31] = characterPool[c31]; for (int c30 = 0; c30 < characterPool.Length; c30++) { if (c30 == 0 && c31 != 0) c30++; passArray[30] = characterPool[c30]; for (int c29 = 0; c29 < characterPool.Length; c29++) { if (c29 == 0 && c30 != 0) c29++; passArray[29] = characterPool[c29]; Author: 08008480 11/05/2010 86 for (int c28 = 0; c28 < characterPool.Length; c28++) { if (c28 == 0 && c29 != 0) c28++; passArray[28] = characterPool[c28]; for (int c27 = 0; c27 < characterPool.Length; c27++) { if (c27 == 0 && c28 != 0) c27++; passArray[27] = characterPool[c27]; for (int c26 = 0; c26 < characterPool.Length; c26++) { if (c26 == 0 && c27 != 0) c26++; passArray[26] = characterPool[c26]; for (int c25 = 0; c25 < characterPool.Length; c25++) { if (c25 == 0 && c26 != 0) c25++; passArray[25] = characterPool[c25]; for (int c24 = 0; c24 < characterPool.Length; c24++) { if (c24 == 0 && c25 != 0) c24++; passArray[24] = characterPool[c24]; for (int c23 = 0; c23 < characterPool.Length; c23++) { if (c23 == 0 && c24 != 0) c23++; passArray[23] = characterPool[c23]; for (int c22 = 0; c22 < characterPool.Length; c22++) { if (c22 == 0 && c23 != 0) c22++; passArray[22] = characterPool[c22]; for (int c21 = 0; c21 < characterPool.Length; c21++) { if (c21 == 0 && c22 != 0) c21++; passArray[21] = characterPool[c21]; for (int c20 = 0; c20 < characterPool.Length; c20++) { if (c20 == 0 && c21 != 0) c20++; passArray[20] = characterPool[c20]; for (int c19 = 0; c19 < characterPool.Length; c19++) { if (c19 == 0 && c20 != 0) c19++; passArray[19] = characterPool[c19]; for (int c18 = 0; c18 < characterPool.Length; c18++) { if (c18 == 0 && c19 != 0) c18++; passArray[18] = characterPool[c18]; for (int c17 = 0; c17 < characterPool.Length; c17++) { if (c17 == 0 && c18 != 0) c17++; passArray[17] = characterPool[c17]; Author: 08008480 11/05/2010 87 for (int c16 = 0; c16 < characterPool.Length; c16++) { if (c16 == 0 && c17 != 0) c16++; passArray[16] = characterPool[c16]; for (int c15 = 0; c15 < characterPool.Length; c15++) { if (c15 == 0 && c16 != 0) c15++; passArray[15] = characterPool[c15]; for (int c14 = 0; c14 < characterPool.Length; c14++) { if (c14 == 0 && c15 != 0) c14++; passArray[14] = characterPool[c14]; for (int c13 = 0; c13 < characterPool.Length; c13++) { if (c13 == 0 && c14 != 0) c13++; passArray[13] = characterPool[c13]; for (int c12 = 0; c12 < characterPool.Length; c12++) { if (c12 == 0 && c13 != 0) c12++; passArray[12] = characterPool[c12]; for (int c11 = 0; c11 < characterPool.Length; c11++) { if (c11 == 0 && c12 != 0) c11++; passArray[11] = characterPool[c11]; for (int c10 = 0; c10 < characterPool.Length; c10++) { if (c10 == 0 && c11 != 0) c10++; passArray[10] = characterPool[c10]; for (int c9 = 0; c9 < characterPool.Length; c9++) { if (c9 == 0 && c10 != 0) c9++; passArray[9] = characterPool[c9]; for (int c8 = 0; c8 < characterPool.Length; c8++) { if (c8 == 0 && c9 != 0) c8++; passArray[8] = characterPool[c8]; for (int c7 = 0; c7 < characterPool.Length; c7++) { if (c7 == 0 && c8 != 0) c7++; passArray[7] = characterPool[c7]; for (int c6 = 0; c6 < characterPool.Length; c6++) { if (c6 == 0 && c7 != 0) c6++; passArray[6] = characterPool[c6]; for (int c5 = 0; c5 < characterPool.Length; c5++) { if (c5 == 0 && c6 != 0) c5++; Author: 08008480 11/05/2010 88 passArray[5] = characterPool[c5]; for (int c4 = 0; c4 < characterPool.Length; c4++) { if (c4 == 0 && c5 != 0) c4++; passArray[4] = characterPool[c4]; for (int c3 = 0; c3 < characterPool.Length; c3++) { if (c3 == 0 && c4 != 0) c3++; passArray[3] = characterPool[c3]; for (int c2 = 0; c2 < characterPool.Length; c2++) { if (c2 == 0 && c3 != 0) c2++; passArray[2] = characterPool[c2]; for (int c1 = 0; c1 < characterPool.Length; c1++) { if (c1 == 0 && c2 != 0) c1++; passArray[1] = characterPool[c1]; for (int c0 = 0; c0 < characterPool.Length; c0++) { if (c0 == 0 && c1 != 0) c0++; passArray[0] = characterPool[c0]; string passAttempt = string.Join("", passArray, 0, 32); try { X509Certificate2 cert = new X509Certificate2(fileLocatio n, passAttempt); Console.WriteLine("passwor d \"" + passAttempt + "\" success!"); result = passAttempt; success = true; goto exit; } catch { Console.WriteLine("passwor d \"" + passAttempt + "\" fail!"); if (c31 == characterPool.Length - 1 && Author: 08008480 11/05/2010 89 success == false) end = true; } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } while (end == false); exit: ; if (success == false) Console.WriteLine("\r\n\r\nPassword not found! The password uses characters which are not in your selected dictionary.\r\n\r\n"); DateTime finish = DateTime.Now; TimeSpan span = finish - start; Console.WriteLine("\r\n\r\nFinished in {0}:{1}:{2}.{3}", span.Hours.ToString(), span.Minutes.ToString().PadLeft(2, '0'), span.Seconds.ToString().PadLeft(2, '0'), span.Milliseconds.ToString()); return result; } //http://www.codeguru.com/csharp/csharp/cs_misc/security/article.php/c16491 public static X509Certificate2 openCertificate(string path, string password) { X509Certificate2 cert = new X509Certificate2(path, password); return cert; } public static bool ImportCertificate(X509Certificate2 certificate, StoreName name, StoreLocation location) { Author: 08008480 11/05/2010 90 bool success = false; X509Store store = new X509Store(name, location); try { store.Open(OpenFlags.ReadWrite); store.Add(certificate); success = true; } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { store.Close(); } return success; } public static void printCertificateInfo(X509Certificate2 certificate) { Console.WriteLine("Name: {0}", certificate.FriendlyName); Console.WriteLine("Issuer: {0}", certificate.IssuerName.Name); Console.WriteLine("Subject: {0}", certificate.SubjectName.Name); Console.WriteLine("Version: {0}", certificate.Version); Console.WriteLine("Valid from: {0}", certificate.NotBefore); Console.WriteLine("Valid until: {0}", certificate.NotAfter); Console.WriteLine("Serial number: {0}", certificate.SerialNumber); Console.WriteLine("Signature Algorithm: {0}", certificate.SignatureAlgorithm.FriendlyName); Console.WriteLine("Thumbprint: {0}", certificate.Thumbprint); // http://msdn.microsoft.com/enus/library/system.security.cryptography.x509certificates.x509certificate2.p rivatekey.aspx Console.WriteLine("Private Key: {0}", certificate.PublicKey.Key.ToXmlString(false).Substring(22, 172)); } } } Author: 08008480 11/05/2010 91 e) Screenshots Figure 1: Main Menu Figure 2.1: Dictionary Input Author: 08008480 11/05/2010 92 Figure 2.2: Dictionary Menu Author: 08008480 11/05/2010 93 Figure 2.3: Dictionary Output Author: 08008480 11/05/2010 94 Figure 3.1: Brute Force Input Figure 3.2: Brute Force Menu Author: 08008480 11/05/2010 95 Figure 3.3: Brute Force Output Author: 08008480 11/05/2010 96 6. Distributed BitLocker Cracker – Server a) Figure 1: Main Author: 08008480 11/05/2010 97 b) Figure 1.1: SectorSender Author: 08008480 11/05/2010 98 c) Figure 1.2: Send/Receive Keys Author: 08008480 11/05/2010 99 d) Source Code: Server using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using System.Collections; using System.IO; //http://www.webtropy.com/articles/art9-1.asp?f=SetFilePointer //http://www.codeproject.com/KB/IP/tcpclientserver.aspx //http://gsthomas.spaces.live.com/blog/cns!52BD865959B69D24!139.entry //http://msdn.microsoft.com/en-us/library/aa288474%28VS.71%29.aspx //http://www.codeguru.com/cpp/w-p/system/misc/article.php/c5765/ //http://codemaverick.blogspot.com/2007/02/how-to-retrieve-management-information.html //http://www.java2s.com/Code/CSharp/Thread/ThreadPoolTcpServer.htm namespace DACsever { public class ThreadPoolTcpSrvr { private TcpListener client; public static string DeviceID; public static ArrayList keySamples = new ArrayList { Convert.FromBase64String("MTIzNDU2Nzg5MDEyMzQ1NjEyMzQ1Njc5"), Convert.FromBase64String("MTIzNDU2Nzg5MDEyMzQ1NjEyMzQ1Njc4"), Convert.FromBase64String("MTIzNDU2Nzg5MDEyMzQ1NjEyMzQ1Njc3"), Convert.FromBase64String("MTIzNDU2Nzg5MDEyMzQ1NjEyMzQ1Njc2"), Convert.FromBase64String("MTIzNDU2Nzg5MDEyMzQ1NjEyMzQ1Njc1") }; public ThreadPoolTcpSrvr() { client = new TcpListener(8001); client.Start(); Console.WriteLine("Server is up.\r\nPress CTRL+C to exit.\r\n\r\nWaiting for clients..."); while (true) { while (!client.Pending()) { Thread.Sleep(1000); } ConnectionThread newconnection = new ConnectionThread(); newconnection.threadListener = this.client; ThreadPool.QueueUserWorkItem(new WaitCallback(newconnection.HandleConnection)); } } public static void Main() { SectorSender ss = new SectorSender(); DeviceID = ss.selectDisk(); ThreadPoolTcpSrvr tpts = new ThreadPoolTcpSrvr(); } } class ConnectionThread { Author: 08008480 11/05/2010 100 ArrayList successKeyPool = new ArrayList(); public TcpListener threadListener; private static int connections = 0; Random rnd = new Random(); public void HandleConnection(object state) { TcpClient client = threadListener.AcceptTcpClient(); NetworkStream ns = client.GetStream(); connections++; Console.WriteLine("New client accepted: {0} active connections", connections); // remember key sample currently worked on byte[] currentlyWorking = new byte[24]; bool stopLoop = false; do { // receive command string command = ""; try { byte[] b = new byte[1024]; int k = ns.Read(b, 0, b.Length); for (int i = 0; i < k; i++) command += Convert.ToChar(b[i]); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); break; } switch (command) { case "start": // send a sector to the client SectorSender ss = new SectorSender(); ss.runServer(ns, ThreadPoolTcpSrvr.DeviceID); break; case "keys": // send more keys try { if (ThreadPoolTcpSrvr.keySamples.Count != 0) { int index = rnd.Next(0, ThreadPoolTcpSrvr.keySamples.Count - 1); currentlyWorking = (byte[])ThreadPoolTcpSrvr.keySamples[index]; ns.Write((byte[])ThreadPoolTcpSrvr.keySamples[index], 0, 24); //ThreadPoolTcpSrvr.length ThreadPoolTcpSrvr.keySamples.RemoveAt(index); } else { ASCIIEncoding asen = new ASCIIEncoding(); ns.Write(asen.GetBytes("endKeyPool"), 0, asen.GetBytes("endKeyPool").Length); } } catch (Exception ex) Author: 08008480 11/05/2010 101 { Console.WriteLine("Error: " + ex.Message); if (Convert.ToBase64String(currentlyWorking) != "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") { ThreadPoolTcpSrvr.keySamples.Add(currentlyWorking); Console.WriteLine("Key " + Convert.ToBase64String(currentlyWorking) + "added back to key pool."); } goto case "quit"; } string receiveFromClient = ""; do { try { byte[] successKey = new byte[32]; int k = ns.Read(successKey, 0, successKey.Length); receiveFromClient = ""; for (int i = 0; i < k; i++) receiveFromClient += Convert.ToChar(successKey[i]); // for debug only //Console.WriteLine(receiveFromClient); //Console.ReadLine(); if (receiveFromClient == "endOfKeyPool") { // do nothing } else if (receiveFromClient == "keys") { currentlyWorking = new byte[24]; goto case "keys";//loop; } else if (receiveFromClient == "quit") { goto case "quit"; } else { // save the key for future processing if (Convert.ToBase64String(successKey) != "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") { successKeyPool.Add(successKey); using (StreamWriter sw = new StreamWriter(@"c:\Successful BitLocker Keys.txt")) { sw.WriteLine(Convert.ToBase64String(successKey)); } Console.WriteLine("Successful key added: {0}", Convert.ToBase64String(successKey)); } else { Console.WriteLine("Something went wrong and the key received was blank! Disregarding key!"); } } Author: 08008480 11/05/2010 102 } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); if (Convert.ToBase64String(currentlyWorking) != "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") { ThreadPoolTcpSrvr.keySamples.Add(currentlyWorking); Console.WriteLine("Key sample " + Convert.ToBase64String(currentlyWorking) + " added back to key pool."); } goto case "quit"; } } while (receiveFromClient != "endOfKeyPool"); try { ASCIIEncoding asen2 = new ASCIIEncoding(); ns.Write(asen2.GetBytes("endKeyPool"), 0, asen2.GetBytes("endKeyPool").Length); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); goto case "quit"; } break; case "quit": // disconnect client stopLoop = true; break; case "kill": Console.WriteLine("The following keys were obtained during this process:\r\n"); foreach (byte[] key in successKeyPool) { Console.WriteLine(Convert.ToBase64String(key)); } Console.WriteLine("\r\n\r\nTo exit, press ENTER."); Console.ReadLine(); Environment.Exit(0); break; default: Console.WriteLine("Server did not understand command: " + command.ToString()); Console.WriteLine("Disconnecting client."); goto case "quit"; break; } } while (stopLoop == false); // clean up ns.Close(); client.Close(); connections--; Console.WriteLine("Client disconnected: {0} active connections", connections); } } } Author: 08008480 11/05/2010 103 e) Source Code: SectorSender using System; using System.IO; using System.Runtime.InteropServices; using System.Management; using System.Net; using System.Net.Sockets; using System.Threading; using System.Text; using System.Collections; // note that this code still retains a lot of commented out code // snippets for debug purposes. all of this code should remain // in until the project is completed. namespace DACsever { public class SectorSender { [DllImport("kernel32", SetLastError = true)] static extern unsafe IntPtr CreateFile( string FileName, // file name FileAccess DesiredAccess, // access mode FileShare ShareMode, // share mode uint SecurityAttributes, // Security Attributes FileMode CreationDisposition, // how to create uint FlagsAndAttributes, // file attributes int hTemplateFile // handle to template file ); [DllImport("kernel32", SetLastError = true)] static extern unsafe bool ReadFile( IntPtr hFile, // handle to file void* pBuffer, // data buffer int NumberOfBytesToRead, // number of bytes to read int* pNumberOfBytesRead, // number of bytes read int Overlapped // overlapped buffer ); [DllImport("kernel32.dll", SetLastError = true)] static extern int SetFilePointer( IntPtr hFile, long lDistanceToMove, ref int lpDistanceToMoveHigh, int dwMoveMethod ); [DllImport("kernel32", SetLastError = true)] static extern unsafe bool CloseHandle( IntPtr hObject // handle to object ); public void runServer(NetworkStream ns, string hddDeviceID) { try { // send sector size ASCIIEncoding asen = new ASCIIEncoding(); string bytesPerSector = diskBytesPerSector(hddDeviceID); Author: 08008480 11/05/2010 104 ns.Write(asen.GetBytes(bytesPerSector), 0, asen.GetBytes(bytesPerSector).Length); // receive sector size acknowledgement byte[] b = new byte[1024]; int k = ns.Read(b, 0, b.Length); for (int i = 0; i < k; i++) Console.Write(Convert.ToChar(b[i])); Console.WriteLine(); // prepare sector contents byte[] sector = new byte[Convert.ToInt32(bytesPerSector)]; sector = ReadSector('c', 0, 1); // encrypt sector contents /!!!!!!!!!!TEMPORARY!!!!!!!!!! byte[] encryptedSector = new byte[Convert.ToInt32(bytesPerSector)]; Encrypt enc = new Encrypt(); encryptedSector = enc.encrypt(sector); // send sector contents ns.Write(sector, 0, Convert.ToInt32(bytesPerSector)); //Console.WriteLine("Plaintext sector length: " + sector.Length.ToString()); // send encrypted sector ns.Write(encryptedSector, 0, Convert.ToInt32(bytesPerSector));//encryptedSector.Length); //Console.WriteLine("Ciphertext sector length: " + encryptedSector.Length.ToString()); Console.WriteLine("Sector has been sent successfully!"); } catch (Exception e) { Console.WriteLine("Error:\r\n " + e.Message); } } public string selectDisk() { while (true) { try { // pulling in info on all hard disks ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); // displaying menu Console.WriteLine("Available disks:\r\n--------------------"); ArrayList disks = new ArrayList(); int count = 0; foreach (ManagementObject moDisk in mosDisks.Get()) { disks.Add(moDisk["DeviceID"].ToString()); Console.Write(count.ToString() + "\t"); Console.Write(moDisk["DeviceID"].ToString() + "\t"); Console.WriteLine(moDisk["Model"].ToString()); count++; } Console.Write("--------------------\r\nPlease select the BitLocker-encrypted disk: "); Author: 08008480 11/05/2010 105 // changing string to work with SQL statements string modify = disks[Convert.ToInt32(Console.ReadLine())].ToString(); string result = ""; foreach (char character in modify) { result += character.ToString(); if (character == '\\') { result += "\\"; } } // notifying user Console.WriteLine("Selected: {0}", modify); // returning result return result; } catch (Exception ex) { Console.WriteLine(ex.Message); } } } private string diskBytesPerSector(string DeviceID) { try { // pulling in valid DeviceID ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE DeviceID = '" + DeviceID + "'"); // format must be: \\\\\\\\.\\\\PHYSICALDRIVE0 // getting bytes per sector of chosen disk string BPS = "0"; foreach (ManagementObject moDisk in mosDisks.Get()) { BPS = moDisk["BytesPerSector"].ToString(); } // notifying user Console.WriteLine("Disk has {0} bytes per sector. Sending...", BPS); // returning result return BPS; } catch (Exception ex) { Console.WriteLine(ex.Message); return "Invalid value!"; } } public static unsafe byte[] ReadSector(char drive, long startingsector, int numberofsectors) { IntPtr handle; Author: 08008480 11/05/2010 106 byte[] buffer; int bytesread = 0; //create a handle to the device handle = CreateFile("\\\\.\\" + drive + ":", FileAccess.Read, FileShare.ReadWrite, 0, FileMode.Open, 0, 0); if (handle == IntPtr.Zero) return null; //setting the pointer to point to the start of the sector to read int LPDISTANCETOMOVE = 0; SetFilePointer(handle, (startingsector * 512), ref LPDISTANCETOMOVE, 0); //allocate buffer length in a managed context buffer = new byte[512 * numberofsectors]; fixed (byte* p = buffer) { //attempt to read file contents into buffer if (!ReadFile(handle, p, 512 * numberofsectors, &bytesread, 0)) { CloseHandle(handle); return null; } } CloseHandle(handle); return buffer; } } } Author: 08008480 11/05/2010 107 f) Source Code: Encrypt using System; using System.Text; using System.Security.Cryptography; using System.IO; // note that this is a temporary measure meant to emulate // bitlocker drive encryption for the purposes of developing // this application. // http://www.chilkatsoft.com/p/p_459.asp namespace DACsever { class Encrypt { public byte[] encrypt(byte[] plainTextToEncrypt) { byte[] initVectorBytes = Encoding.ASCII.GetBytes("1234567890123456"); byte[] plainTextBytes = plainTextToEncrypt; byte[] keyBytes = Encoding.ASCII.GetBytes("12345678901234561234567890123456"); RijndaelManaged symmetricKey = new RijndaelManaged(); symmetricKey.Mode = CipherMode.CBC; ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes); MemoryStream memoryStream = new MemoryStream(); CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write); cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); cryptoStream.FlushFinalBlock(); byte[] cipherTextBytes = memoryStream.ToArray(); memoryStream.Close(); cryptoStream.Close(); // check encrypted sector //string cipherText = Convert.ToBase64String(cipherTextBytes); //Console.WriteLine(cipherText); return cipherTextBytes; } } } Author: 08008480 11/05/2010 108 g) Screenshots Figure 1: Disk Selected Figure 2: Client Connected Author: 08008480 11/05/2010 109 Figure 3: Client Disconnected (Error) Figure 4: Successful Key Added Figure 5: Successful Key File Author: 08008480 11/05/2010 110 7. Distributed BitLocker Cracker – Client a) Figure 2: Main Author: 08008480 11/05/2010 111 b) Figure 2.1: Decrypt Author: 08008480 11/05/2010 112 c) Source Code: Program using System; using System.IO; using System.Net; using System.Text; using System.Net.Sockets; using System.Collections; // note that this program contains commented out code // meant for debug purposes, especially to check the // server's encryption emulator. //http://www.geekpedia.com/tutorial233_Getting-Disk-Drive-Information-using-WMI-and-Csharp.html //http://www.codeproject.com/KB/recipes/hexencoding.aspx namespace DACclient { class Program { static string serverIPAddress; static int serverPortNumber; static void Main(string[] args) { Console.WriteLine(args[0] + " - " + args[1]); // accept server IP address and port number // either through command line arguments or // manual input. if (args.Length == 2) { try { if (IPAddress.Parse(args[0]) is IPAddress && Convert.ToInt32(args[1]) is int) { try { serverIPAddress = IPAddress.Parse(args[0]).ToString(); serverPortNumber = Convert.ToInt32(args[1]); Console.WriteLine("Server address is {0}:{1}", serverIPAddress, serverPortNumber.ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message); try { string input = ""; bool success = false; do { try { Console.Write("Please provide server IP Address: "); input = Console.ReadLine(); serverIPAddress = IPAddress.Parse(input).ToString(); Console.WriteLine("Using {0}", serverIPAddress); success = true; } Author: 08008480 11/05/2010 113 catch (Exception ex2) { Console.WriteLine(ex2.Message); } } while (success == false); string input2 = ""; bool success2 = false; do { try { Console.Write("Please provide server Port Number: "); input2 = Console.ReadLine(); serverPortNumber = Convert.ToInt32(input2); Console.WriteLine("Using {0}", serverPortNumber.ToString()); success2 = true; } catch (Exception ex2) { Console.WriteLine(ex2.Message); } } while (success2 == false); } catch (Exception ex2) { Console.WriteLine(ex2.Message); } } } else if (IPAddress.Parse(args[1]) is IPAddress && Convert.ToInt32(args[0]) is int) { try { serverIPAddress = IPAddress.Parse(args[1]).ToString(); serverPortNumber = Convert.ToInt32(args[0]); Console.WriteLine("Server address is {0}:{1}", serverIPAddress, serverPortNumber.ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message); try { string input = ""; bool success = false; do { try { Console.Write("Please provide server IP Address: "); input = Console.ReadLine(); serverIPAddress = IPAddress.Parse(input).ToString(); Console.WriteLine("Using {0}", serverIPAddress); success = true; } catch (Exception ex2) { Console.WriteLine(ex2.Message); Author: 08008480 11/05/2010 114 } } while (success == false); string input2 = ""; bool success2 = false; do { try { Console.Write("Please provide server Port Number: "); input2 = Console.ReadLine(); serverPortNumber = Convert.ToInt32(input2); Console.WriteLine("Using {0}", serverPortNumber.ToString()); success2 = true; } catch (Exception ex2) { Console.WriteLine(ex2.Message); } } while (success2 == false); } catch (Exception ex2) { Console.WriteLine(ex2.Message); } } } else { Console.WriteLine("Invalid arguments! Please provide the IP Address and Port Number of the server."); goto exit; } } catch (Exception e) { Console.WriteLine("Error: " + e.Message); } } else if (args.Length == 0) { try { string input = ""; bool success = false; do { try { Console.Write("Please provide server IP Address: "); input = Console.ReadLine(); serverIPAddress = IPAddress.Parse(input).ToString(); Console.WriteLine("Using {0}", serverIPAddress); success = true; } catch (Exception ex) { Console.WriteLine(ex.Message); } } while (success == false); Author: 08008480 11/05/2010 115 string input2 = ""; bool success2 = false; do { try { Console.Write("Please provide server Port Number: "); input2 = Console.ReadLine(); serverPortNumber = Convert.ToInt32(input2); Console.WriteLine("Using {0}", serverPortNumber.ToString()); success2 = true; } catch (Exception ex) { Console.WriteLine(ex.Message); } } while (success2 == false); } catch (Exception ex) { Console.WriteLine(ex.Message); } } else { Console.WriteLine("Invalid arguments! Please provide the IP Address and Port Number of the server."); goto exit; } int passNumber = 0; bool finished = false; byte[] encSector = new byte[0]; try { TcpClient tcpclnt = new TcpClient(); Console.Write("Connecting......"); // use the IP address of the server program tcpclnt.Connect(serverIPAddress, serverPortNumber); Console.WriteLine("Done!"); Stream stm = tcpclnt.GetStream(); do { switch (passNumber) { case 0: ASCIIEncoding asen = new ASCIIEncoding(); stm.Write(asen.GetBytes("start"), 0, asen.GetBytes("start").Length); byte[] sectorSize = new byte[1024]; int k = stm.Read(sectorSize, 0, sectorSize.Length); int arraySize = 0; string size = ""; for (int i = 0; i < k; i++) size += Convert.ToChar(sectorSize[i]); arraySize = Convert.ToInt32(size); Author: 08008480 11/05/2010 116 byte[] temp = asen.GetBytes("Size acknowledged by client..."); Console.WriteLine("Size acknowledged: {0} bytes per sector", size); stm.Write(temp, 0, temp.Length); // receive unencrypted sector !! WILL BE REPLACED BY ENCRYPTED SECTOR !! byte[] sector = new byte[arraySize]; int readCount = stm.Read(sector, 0, arraySize); // display sector contents - not actually necessary to the program //Console.Write("\r\nDisplaying sector contents. Press ENTER."); //Console.ReadLine(); //Console.WriteLine(Convert.ToBase64String(sector)); // receive encrypted sector !! REMOVE FOR FINAL VERSION !! encSector = new byte[arraySize]; stm.Read(encSector, 0, encSector.Length); // display encrypted sector !! REMOVE FOR FINAL VERSION !! //Console.Write("\r\nDisplaying encrypted sector contents. Press ENTER."); //Console.ReadLine(); //Console.WriteLine(Convert.ToBase64String(encSector)); passNumber++; break; case 1: string receiveFromServer = ""; ASCIIEncoding asen2 = new ASCIIEncoding(); stm.Write(asen2.GetBytes("keys"), 0, asen2.GetBytes("keys").Length); do { byte[] receive = new byte[24]; k = stm.Read(receive, 0, receive.Length); for (int i = 0; i < k; i++) receiveFromServer += Convert.ToChar(receive[i]); switch (receiveFromServer) { case "endKeyPool": receiveFromServer = "endKeyPool"; break; default: /*ArrayList KeyPool = new ArrayList(); using (StreamReader sr = new StreamReader(@"c:\keyBase64.txt")) { while (!sr.EndOfStream) { byte[] key = Convert.FromBase64String(sr.ReadLine()); KeyPool.Add(key); } } */ byte[] keyBytes24 = new byte[24]; receive.CopyTo(keyBytes24, 0); // decrypt sector using key pool Decrypt dec = new Decrypt(); dec.startDecryptionLoop(encSector, keyBytes24, stm); Author: 08008480 11/05/2010 117 // alert the server to send more keys KeySender ks = new KeySender(); ks.sendString("keys", stm); receiveFromServer = ""; break; } } while (receiveFromServer != "endKeyPool"); passNumber++; break; case 2: ASCIIEncoding asen3 = new ASCIIEncoding(); stm.Write(asen3.GetBytes("quit"), 0, asen3.GetBytes("quit").Length); finished = true; break; } } while (finished == false); // clean up tcpclnt.Close(); } catch (Exception e) { Console.WriteLine("Error:\r\n " + e.Message); } exit:; Console.WriteLine("Client is disconnected and closing. Press ENTER to quit."); Console.ReadLine(); } } } Author: 08008480 11/05/2010 118 d) Source Code: Decrypt using System; using System.Text; using System.IO; using System.Security.Cryptography; using System.Collections; using System.Net.Sockets; // http://deusty.blogspot.com/2009/04/decrypting-openssl-aes-files-in-c.html namespace DACclient { class Decrypt { public byte[] successKey; public bool decrypt(byte[] cipherTextBytes, byte[] keyBytes) { // bitlocker initialization vector is calculated by mapping each // sector number into a unique 16-byte and encrypting that value // with the AES key. For the purpose of this program, the sector // number will always be 0. byte[] initVectorBytes = Encoding.ASCII.GetBytes("1234567890123456"); byte[] plainTextBytes; bool success = false; string plainText = ""; try { RijndaelManaged symmetricKey = new RijndaelManaged(); symmetricKey.Mode = CipherMode.CBC; symmetricKey.Padding = PaddingMode.None; ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes); MemoryStream memoryStream = new MemoryStream(); CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write); cryptoStream.Write(cipherTextBytes, 0, cipherTextBytes.Length); cryptoStream.FlushFinalBlock(); plainTextBytes = memoryStream.ToArray(); plainText = Convert.ToBase64String(plainTextBytes); memoryStream.Close(); cryptoStream.Close(); // determine success // the comparison for bitlocker volume will be based on // the first 8 bits of the first disk sector. the contents // of the first 8 bits on a bitlocker volume are // "-FVE-FS-" in ASCII. // An NTFS volume starts with "ëR?NTFS" in ASCII or // {0xEB, 0x52, 0x90, 0x4E, 0x54, 0x46, 0x53, 0x20} // in Hexadecimal. byte[] compareSample = new byte[8]; for (int i = 0; i < compareSample.Length; i++) compareSample[i] = plainTextBytes[i]; Author: 08008480 11/05/2010 119 string diskSample = ""; string diskHex = ""; for (int j = 0; j < compareSample.Length; j++) diskSample += Convert.ToChar(compareSample[j]); for (int x = 0; x < compareSample.Length; x++) diskHex += string.Format("{0:X2}", compareSample[x]); Console.WriteLine("Disk - "/* + diskSample + " : "*/ + diskHex); byte[] sector2 = {0xEB, 0x52, 0x90, 0x4E, 0x54, 0x46, 0x53, 0x20}; //Convert.FromBase64String("61KQTlRGUyAgIC=="); string unencryptedSample = ""; string unencryptedHex = ""; for (int l = 0; l < sector2.Length; l++) unencryptedSample += Convert.ToChar(sector2[l]); for (int y = 0; y < sector2.Length; y++) unencryptedHex += string.Format("{0:X2}", sector2[y]); Console.WriteLine("Decr - "/* + unencryptedSample + " : "*/ + unencryptedHex); //Console.ReadLine(); if (diskSample == unencryptedSample) { success = true; successKey = keyBytes; } } catch (Exception ex) { Console.WriteLine(ex.Message); } if (success == true) { Console.WriteLine("Success achieved with key {0}", Convert.ToBase64String(successKey)); // without pausing for user input, this will happen too fast for the user to notice //Console.Write("Displaying decrypted sector contents.");// Press ENTER."); //Console.ReadLine(); //Console.WriteLine(plainText); } return success; } public void startDecryptionLoop(byte[] cipherTextToDecrypt, byte[] beginningKeyBytes, Stream ns) { // extend key byte array byte[] fullKeyBytes = new byte[32]; beginningKeyBytes.CopyTo(fullKeyBytes, 0); for (int c24 = 0; c24 < 256; c24++) { fullKeyBytes[24] = Convert.ToByte(c24); for (int c25 = 0; c25 < 256; c25++) { fullKeyBytes[25] = Convert.ToByte(c25); for (int c26 = 0; c26 < 256; c26++) { fullKeyBytes[26] = Convert.ToByte(c26); for (int c27 = 0; c27 < 256; c27++) { fullKeyBytes[27] = Convert.ToByte(c27); Author: 08008480 11/05/2010 120 for (int c28 = 0; c28 < 256; c28++) { fullKeyBytes[28] = Convert.ToByte(c28); for (int c29 = 0; c29 < 256; c29++) { fullKeyBytes[29] = Convert.ToByte(c29); for (int c30 = 0; c30 < 256; c30++) { fullKeyBytes[30] = Convert.ToByte(c30); for (int c31 = 0; c31 < 256; c31++) { fullKeyBytes[31] = Convert.ToByte(c31); bool success = decrypt(cipherTextToDecrypt, fullKeyBytes); if (success == false) { Console.WriteLine("Key {0} failed. Trying next...", Convert.ToBase64String(fullKeyBytes)); } else { // send successful key back to the server KeySender ks = new KeySender(); ks.sendKey(successKey, ns); } } } } } } } } } } public void startDecryptionLoop(byte[] cipherTextToDecrypt, ArrayList KeyPool, Stream ns) { // for debug only !! REMOVE FOR FINAL VERSION !! //Console.WriteLine("Starting decryption loop... Press ENTER."); //Console.ReadLine(); // decrypt with each key in key pool foreach (byte[] key in KeyPool) { bool success = decrypt(cipherTextToDecrypt, key); if (success == false) { Console.WriteLine("Key {0} failed. Trying next...", Convert.ToBase64String(key)); } else { // send successful key back to the server KeySender ks = new KeySender(); ks.sendKey(successKey, ns); Author: 08008480 11/05/2010 121 } } } } } Author: 08008480 11/05/2010 122 e) Source Code: KeySender using System; using System.IO; using System.Net; using System.Text; using System.Net.Sockets; namespace DACclient { class KeySender { public void sendKey(byte[] key, Stream ns) { // ensure that for 256-bit keys, this number gets adequately increased // the key length for a 128-bit key is 32, while for a 256-bit key it is 64 if (key.Length == 32) { ns.Write(key, 0, key.Length); } } public void sendString(string command, Stream ns) { ASCIIEncoding asen = new ASCIIEncoding(); ns.Write(asen.GetBytes(command),0,asen.GetBytes(command).Length); } } } Author: 08008480 11/05/2010 123 f) Screenshots Figure 1: Connecting Figure 2: Working Author: 08008480 11/05/2010 124 8. Distributed BitLocker Cracker – Client-Server Protocol Author: 08008480 11/05/2010 125 References Aoki, Kazumaro; Franke, Jens; Lenstra, Arjen K.; Thomé, Emmanuel; Bos, Joppe W.; Gaudry, Pierrick; Kruppa, Alexander; Montgomery, Peter L.; Osvik, Dag Arne; te Riele, Herman; Timofeev, Andrey; Zimmermann, Paul (February 18, 2010). Factorization of a 768-bit RSA modulus. Retrieved March 25, 2010 from: http://eprint.iacr.org/2010/006.pdf Blaze, Matt (1994). Key Management in an Encrypting File System. AT&T Bell Laboratories. Retrieved February 1, 2010 from: https://www.usenix.org/publications/library/proceedings/bos94/full_papers/blaze.a Casey, E. (2008). The Impact of Full Disk Encryption on Digital Forensics. Inspec (Ei Village2). Cooke, Paul (December 07, 2009) Windows BitLocker Claims. The Windows Security Blog. Retrieved February 20, 2010 from: http://windowsteamblog.com/blogs/windowssecurity/archive/2009/12/07/windowsbitlocker-claims.aspx El-Futouh, Mohamed Abo (2008). The Analysis of Windows Vista Disk Encryption Algorithm. Compendex (Ei Village2). Ferguson, Niels (Aug 2006). AES-CBC + Elephant diffuser - A Disk Encryption Algorithm for Windows Vista. Microsoft. Ferguson, Niels (Mar 02, 2006 17:10) Back-door nonsense. Retrieved September 10, 2009 from http://blogs.msdn.com/si_team/archive/2006/03/02/542590.aspx Gache, Gabriel (October 26, 2007). Inexpensive GPUs Pose Security Problems. Retrieved March 10, 2010 from: http://news.softpedia.com/news/Inexpensive-GPU-039-s-Pose-SecurityProblems-69260.shtml Grace, James J.; Bartlett, Thomas S. V. III (July 25, 1999) http://www.deepquest.pf/win32/win2k_efs.txt. This paper is no longer available. Halderman, J. Alex; Schoen, Seth D.; Heninger, Nadia; Clarkson, William; Paul, William; Calandrino, Joseph A.; Feldman, Ariel J.; Appelbaum, Jacob; and Felten Edward W. (February 21, 2008). Lest We Remember: Cold Boot Attacks on Encryption Keys. Princeton University. Retrieved September 10, 2009 from http://citp.princeton.edu/memory/. Halfacree, Gareth (January 13th, 2010). Researchers crack 768-bit RSA. Retrieved March 02, 2010 from http://www.bit-tech.net/news/bits/2010/01/13/researchers-crack-768-bit-rsa/1 Hargreaves, Christopher (2008). Windows Vista and Digital Investigations. Compendex (Ei Village2), ScienceDirect (Elsevier). Harrison, Owen; Waldron, John (2007). AES Encryption Implementation and Analysis on Commodity Graphics Processing Units. Computer Architecture Group, Trinity College. Retrieved March 22, 2010 from: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.149.7643&rep=rep1&type=pdf Jennings, Charles W., Tycksen, Frank A., Jr. (Feb 13, 2001). Digital Certificate. United States Patent. US6,189,097 B1 Kornblum, Jesse D. (2009).Implementing BitLocker Drive Encryption for Forensic Analysts. Inspec (Ei Village2). Kumar Nitin, Kumar Vipin (May 19. 2008). NVbit : Accessing Bitlocker volumes from linux. Retrieved Spetember 11, 2009 from http://www.nvlabs.in/node/9. Kursawe, K., Schellekens, D., Preneel, B. (n.d.). Analyzing Trusted Platform Communication. Katholieke Universiteit Leuven. Kurtz, George; McClure, Stuart; Scambray, Joel (January 5, 2009) Hacking Exposed: Network Security Secrets and Solutions. McGraw-Hill Osborne Media. Sixth Edition. ISBN: 9780071613743 Microsoft Corporation (2008). Bitlocker drive encryption technical overview. Microsoft Corporation. Retrieved September 5, 2009 from Author: 08008480 11/05/2010 126 http://technet2.microsoft.com/WindowsVista/en/library/ce4d5a2e-59a5-4742-89ccef9f5908b4731033.mspx?mfr=true; May 2008a. Microsoft Corporation (2008). BitLocker™ Drive Encryption Security Policy. Retrieved March 12, 2010 from: csrc.nist.gov/groups/STM/cmvp/documents/140-1/140sp/140sp947.pdf Microsoft Corporation (January 15, 2009). Best practices for the Encrypting File System. Retrieved September 15, 2009 from http://support.microsoft.com/kb/223316. Revision: 13.1. Microsoft Corporation (March 27, 2009). Changes in EFS. Retrieved September 15, 2009 from http://technet.microsoft.com/en-us/library/dd630631(WS.10).aspx Microsoft Corporation (n.d.). Encrypting File System Overview. Retrieved September 16, 2009 from http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/enus/encrypt_overview.mspx?mfr=true Microsoft Corporation (September 14, 2007). Encrypting File System (EFS) files appear corrupted when you open them. Retrieved September 15, 2009 from http://support.microsoft.com/kb/329741. Revision: 10.9 Morrill, Dan (August 5, 2008). Hacking and Breaking Bitlocker. Toolbox for IT. Retrieved March 3, 2010 from: http://it.toolbox.com/blogs/managing-infosec/hacking-and-breaking-bitlocker24253 National Institute of Justice (April 2004). Forensic Examination of Digital Evidence: A Guide for Law Enforcement. National Institute of Justice. Retrieved February 11, 2010 from: http://www.ncjrs.gov/txtfiles1/nij/199408.txt Protalinski, Emil (December 4, 2009) First commercial tool to crack BitLocker arrives (Updated). Retrieved February 20, 2010 from: http://arstechnica.com/microsoft/news/2009/12/firstcommercial-tool-cracks-bitlocker.ars RSA Laboratories (June 14, 2002). RSA Security Inc. Public-Key Cryptography Standards (PKCS) Retrieved March 02, 2010 from ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf Russinovich, Mark E.; Solomon, David A. (January 5, 2005). Microsoft® Windows® Internals, Fourth Edition: Microsoft Windows Server™ 2003, Windows XP and Windows 2000. Microsoft Press; Fourth Edition. ISBN: 0735619174 Seagate (2008). 128-Bit Versus 256-Bit AES Encryption. Retrieved March 2, 2010 from http://www.seagate.com/staticfiles/docs/pdf/whitepaper/tp596_128-bit_versus_256_bit.pdf TCG Confidential (26 October 2006). TPM Main Part 2 TPM Structures. Thurrott, Paul. (2008). Windows Vista Secrets: SP1 Edition. Wiley. ISBN: 978-0470242001 TopBits.com (n.d.) Encrypting File System (EFS). Retrieved November 5, 2009 from http://www.topbits.com/encrypting-file-system-efs.html Trusted Computing Group (2009) Trusted Platform Module (TPM) Summary. Retrieved September 2, 2009 from http://www.trustedcomputinggroup.org/resources/trusted_platform_module_tpm_summary. Trusted Computing Group (2009). How to Use the TPM: A Guide to Hardware-Based Endpoint Security. Retrieved September 2, 2009 from http://www.trustedcomputinggroup.org/resources/how_to_use_the_tpm_a_guide_to_hardwa rebased_endpoint_security Trusted Computing Group (n.d.). TPM Main Specification. Retrieved September 16, 2009 from http://www.trustedcomputinggroup.org/resources/tpm_main_specification Turpe, S. (2009). Attacking the BitLocker Boot Process. ScienceDirect (Elsevier). Wiseman, Willard M.; Grawrock, David W. (May 8, 2007). Trusted Platform Apparatus: System, and Method. United States Patent. US7,216,369 B2 Zhu, Yuandong (2009). A Comparative Methodology for the Reconstruction of Digital Events Using Windows Restore Points. ScienceDirect (Elsevier). Author: 08008480 11/05/2010 127