- •Exploiting Software How to Break Code
- •Table of Contents
- •Copyright
- •Praise for Exploiting Software
- •Attack Patterns
- •Foreword
- •Preface
- •What This Book Is About
- •How to Use This Book
- •But Isn't This Too Dangerous?
- •Acknowledgments
- •Greg's Acknowledgments
- •Gary's Acknowledgments
- •Bad Software Is Ubiquitous
- •The Trinity of Trouble
- •The Future of Software
- •What Is Software Security?
- •Conclusion
- •Chapter 2. Attack Patterns
- •A Taxonomy
- •An Open-Systems View
- •Tour of an Exploit
- •Attack Patterns: Blueprints for Disaster
- •An Example Exploit: Microsoft's Broken C++ Compiler
- •Applying Attack Patterns
- •Attack Pattern Boxes
- •Conclusion
- •Into the House of Logic
- •Should Reverse Engineering Be Illegal?
- •Reverse Engineering Tools and Concepts
- •Approaches to Reverse Engineering
- •Methods of the Reverser
- •Writing Interactive Disassembler (IDA) Plugins
- •Decompiling and Disassembling Software
- •Decompilation in Practice: Reversing helpctr.exe
- •Automatic, Bulk Auditing for Vulnerabilities
- •Writing Your Own Cracking Tools
- •Building a Basic Code Coverage Tool
- •Conclusion
- •Chapter 4. Exploiting Server Software
- •The Trusted Input Problem
- •The Privilege Escalation Problem
- •Finding Injection Points
- •Input Path Tracing
- •Exploiting Trust through Configuration
- •Specific Techniques and Attacks for Server Software
- •Conclusion
- •Chapter 5. Exploiting Client Software
- •Client-side Programs as Attack Targets
- •In-band Signals
- •Cross-site Scripting (XSS)
- •Client Scripts and Malicious Code
- •Content-Based Attacks
- •Conclusion
- •Chapter 6. Crafting (Malicious) Input
- •The Defender's Dilemma
- •Intrusion Detection (Not)
- •Partition Analysis
- •Tracing Code
- •Reversing Parser Code
- •Misclassification
- •Audit Poisoning
- •Conclusion
- •Chapter 7. Buffer Overflow
- •Buffer Overflow 101
- •Injection Vectors: Input Rides Again
- •Buffer Overflows and Embedded Systems
- •Database Buffer Overflows
- •Buffer Overflows and Java?!
- •Content-Based Buffer Overflow
- •Audit Truncation and Filters with Buffer Overflow
- •Causing Overflow with Environment Variables
- •The Multiple Operation Problem
- •Finding Potential Buffer Overflows
- •Stack Overflow
- •Arithmetic Errors in Memory Management
- •Format String Vulnerabilities
- •Heap Overflows
- •Buffer Overflows and C++
- •Payloads
- •Payloads on RISC Architectures
- •Multiplatform Payloads
- •Prolog/Epilog Code to Protect Functions
- •Conclusion
- •Chapter 8. Rootkits
- •Subversive Programs
- •A Simple Windows XP Kernel Rootkit
- •Call Hooking
- •Trojan Executable Redirection
- •Hiding Files and Directories
- •Patching Binary Code
- •The Hardware Virus
- •Low-Level Disk Access
- •Adding Network Support to a Driver
- •Interrupts
- •Key Logging
- •Advanced Rootkit Topics
- •Conclusion
- •References
- •Index
Approaches to Reverse Engineering
As we said earlier, sometimes source code is available for a reverse engineer and sometimes it is not. White box and black box testing and analysis methods both attempt to understand the software, but they use different approaches depending on whether the analyst has access
• Table of Contents to source code.
•Index
RegardlessExploiting SoftwaretheHowmethod,BreakthereCodeare several key areas that an attacker should examine to
find vulnerabilities in software:
ByGreg Hoglund,Gary McGraw
Publisher: Addison Wesley
Functions that do improper (or no) bounds checking
Pub Date: February 17, 2004
Functions that pass through or consume user-supplied data in a format string
ISBN: 0-201-78695-8
Pages: 512
Functions meant to enforce bounds checking in a format string (such as %20s)
Routines that get user input using a loop
Low-level byte copy operations
How does software break? How do attackers make software break on purpose? Why are
Routines that use pointer arithmetic on user-supplied buffers
firewalls, intrusion detection systems, and antivirus software not keeping out the bad guys?
What tools can be used to break software? This book provides the answers. "Trusted" system calls that take dynamic input
Exploiting Softwareis loaded with examples of real attacks, attack patterns, tools, and
This somewhat tactical list is useful when you are "in the weeds" with binary code. techniques used by bad guys to break software. If you want to protect your software from
attack, you must first learn how real attacks are really carried out.
ThisWhitemustBox-haveAnalysisbook may shock you—and it will certainly educate you.Getting beyond the script kiddie treatment found in many hacking books, you will learn about
White box analysis involves analyzing and understanding source code. Sometimes only
binary code is available, but if you decompile a binary to get source code and then study the Why software exploit will continue to be a serious problem
code, this can be considered a kind of white box analysis as well. White box testing is typicallyWhenverynetworkeffectivesecurityin findingmechanismsprogrammingdo noterrorsworkand implementation errors in software. In some cases this activity amounts to pattern matching and can even be automated with a
[4]
staticAttackanalyzerpatterns. One drawback to this kind of whitebox testing is that it may report a
potential vulnerability where none actually exists (called a false positive). Nevertheless, using
Reverse engineering
static analysis methods on source code is a good approach to exploiting some kinds of
software.
Classic attacks against server software
[4] Cigital's tool SourceScope, for example, can be used to find potential security flaws in a piece of Surprisingsoftware givenattacksits sourceagainstcode (http://wwwclient software.cigital.com).
ThereTechniquesare two typesfor craftingof whitemaliciousbox analysisinputtools, those that require source code and those that automatically decompile the binary code and continue from there. One powerful and commerciallyThe technicalavailabledetailswhiteof bufferbox analysisoverflowsplatform, called IDA-Pro, does not require source
code access. SourceScope, which includes an extensive database of source code-related
Rootkits
problems and issues commonly encountered in Java, C, and C++, does require source code.
The knowledge encapsulated in these tools is extremely useful in security analysis (and, of
Exploiting Softwareis filled with the tools, concepts, and knowledge necessary to break course, in exploiting software).
software.
Black Box Analysis
Black box analysis refers to analyzing a running program by probing it with various inputs. This kind of testing requires only a running program and does not make use of source code analysis of any kind. In the security paradigm, malicious input can be supplied to the program in an effort to cause it to break. If the program does break during a particular test,
then a security problem may have been discovered.
Note that black box testing is possible even without access to binary code. That is, a program can be tested remotely over a network. All that is required is a program running somewhere that is accepting input. If the tester can supply input that the program consumes (and can observe the effect of the test), then black box testing is possible. This is one reason that real attackers often resort to black box techniques.
• |
Table of Contents |
Black box testing is not as effective as white box testing in obtaining knowledge of the code |
|
• |
Index |
and its behavior, but black box testing is much easier to accomplish and usually requires
Exploiting Software How to Break Code
much less expertise than white box testing. During black box testing, an analyst attempts to evaluateByGreg Hoglundas manymeaningful,Gary McGraw internal code paths as can be directly influenced and observed from outside the system. Black box testing cannot exhaustively search a real program's input
space for problems because of theoretical constraints, but a black box test does act more like
Publisher: Addison Wesley
an actual attack on target software in a real operational environment than a white box test
Pub Date: February 17, 2004
usually can.
ISBN: 0-201-78695-8
Pages: 512
Because black box testing happens on a live system, it is often an effective way of understanding and evaluating denial-of-service problems. And because black box testing can validate an application within its runtime environment (if possible), it can be used to determine whether a potential problem area is actually vulnerable in a real production system.[5] Sometimes problems that are discovered in a white box analysis may not be
exploitablesoftwarein real, deployed system. A firewall may block the attack, for example.[6] How does break? How do attackers make software break on purpose? Why are
firewalls, intrusion detection systems, and antivirus software not keeping out the bad guys?
[5] The problem with testing live production systems should be obvious. A successful denial-of-service test
What tools can be used to break software? This book provides the answers.
will take down a production system just as effectively as a real attack. Companies are not very receptive to
this sort of testing, in our experience.
Exploiting Softwareis loaded with examples of real attacks, attack patterns, tools, and techniques[6] However,usednoteby badthat whiteguysboxto breakanalysissoftwareis useful.forIftestingyou wanthow atopieceprotectof softwareyour softwarewill behavefromacross
attack,multipleyou mustenvironmentsfirst learn. Forhowcode realthat isattackswidely deployed,are reallythiscarriedkind of testingout. is essential.
Cenzic's Hailstorm is a commercially available black box testing platform for networked This must-have book may shock you—and it will certainly educate you.Getting beyond the
software. It can be used to probe live systems for security problems. For testing network script kiddie treatment found in many hacking books, you will learn about
routers and switches, special hardware devices are available, such as SmartBits and IXIA. A
freeware tool called ISICS can be used to probe TCP/IP stack integrity. Protocol attack
systemsWhythatsoftwareuse blackexploitboxwilltechniquescontinueincludeto be aPROTOSserious problemand Spike.
When network security mechanisms do not work
Gray Box Analysis
Attack patterns
Reverse engineering
Gray box analysis combines white box techniques with black box input testing. Gray box
approaches usually require using several tools together. A good example of a simple gray box
Classic attacks against server software
analysis is running a target program within a debugger and then supplying particular sets of
inputs to the program. In this way, the program is exercised while the debugger is used to
Surprising attacks against client software
detect any failures or faulty behavior. Rational's Purify is a commercial tool that can provide
detailed runtime analysis focused on memory use and consumption. This is particularly
Techniques for crafting malicious input
important for C and C++ programs (in which memory problems are rampant). A freeware
debugger that provides runtime analysis for Linux is called Valgrind. The technical details of buffer overflows
All testing methods can reveal possible software risks and potential exploits. White box
Rootkits
analysis directly identifies more bugs, but the actual risk of exploit is hard to measure. Black
box analysis identifies real problems that are known to be exploitable. The use of gray box Exploiting Softwareis filled with the tools, concepts, and knowledge necessary to break
techniques combines both methods in a powerful way. Black box tests can scan programs software.
across networks. White box tests require source code or binaries to analyze statically. In a
typical case, white box analysis is used to find potential problem areas, and black box testing
is then used to develop working attacks against these areas.
Black Box |
|
|
White Box |
|
|
|
|
Audit software runtime |
|
Audit software code |
|
environment |
|
Programming errors |
|
|
|
|
|
External threats |
|
Central code repository required |
|
• |
Table of Contents |
|
|
|
|
||
Denial of service |
|
|
|
• |
Index |
|
Valuable to developers and testers |
|
|
|
Exploiting Software How to Break Code
Cascade failure
ByGreg Hoglund,Gary McGraw
Security policy and
filters
Publisher: Addison Wesley
Pub Date: February 17, 2004
Scales and runs
ISBN: 0-201-78695-8
across enterprise
Pages:network512
Valuable to security/systems administrators
How does software break? How do attackers make software break on purpose? Why are firewalls, intrusion detection systems, and antivirus software not keeping out the bad guys?
What tools can be used to break software? This book provides the answers.
One problem with almost all kinds security testing (regardless of whether such testing is
black box or white box) is that there really isn't any. That is, most QA organizations concern
Exploiting Softwareis loaded with examples of real attacks, attack patterns, tools, and themselves with functional testing and spend very little time understanding or probing for
techniques used by bad guys to break software. If you want to protect your software from security risks. The QA process is almost always broken in most commercial software houses
attack, you must first learn how real attacks are really carried out.
anyway because of time and budget constraints and the belief that QA is not an essential part
of software development.
This must-have book may shock you—and it will certainly educate you.Getting beyond the
script kiddie treatment found in many hacking books, you will learn about
As software becomes more important, more emphasis is being placed on software quality
management—a unified approach to testing and analysis that encompasses security,
reliability, and performance. Software quality management uses both white box and black
Why software exploit will continue to be a serious problem
box techniques to identify and manage software risks as early as possible in the software
development life cycle.
When network security mechanisms do not work
Attack patterns
Using Gray Box Techniques to Find Vulnerabilities in Microsoft SQL
Reverse engineering
Server 7
Classic attacks against server software
Gray box techniques usually leverage several tools. We provide an example using runtime
Surprising attacks against client software
debugging tools combined with a black box input generator. Using runtime error detection
and debugging tools is a powerful way of finding problem software. When combined with
Techniques for crafting malicious input
black box injection tools, debuggers help catch software faults. In many cases, disassembly
of the program can determine the exact nature of a software bug like the one we will show The technical details of buffer overflows
you.
Rootkits
One very powerful tool that examines software dynamically as it runs is Rational's Purify. In
this example, we perform black box injection against Microsoft's SQL Server 7 using Exploiting Softwareis filled with the tools, concepts, and knowledge necessary to break
Hailstorm, while monitoring the target instrumented under Purify. By combining Purify and software.
Hailstorm, the test is able to uncover a memory corruption problem occurring in the SQL server as a result of malformed protocol input. The corruption results in a software exception and subsequent failure.
To start, a remote input point is identified in the SQL server. The server listens for connections on TCP port 1433. The protocol used over this port is undocumented for the most part. Instead of reverse engineering the protocol, a simple test is constructed that supplies random inputs interspersed with numerical sequences. These data are played against the TCP port. The result is the generation of many possible "quasilegal" inputs to the port, which thus
covers a wide range of input values. The inputs are injected for several minutes at a rate of around 20 per second.
The data injected pass through a number of different code paths inside the SQL server software. These locations, in essence, read the protocol header. After a short time, the test causes a fault, and Purify notes that memory corruption has occurred.
The screen shot in Figure 3-2 illustrates the SQL server failure, the Purify dump, and the
• |
Table of Contents |
Hailstorm testing platform all in one place. The memory corruption noted by Purify occurs |
|
• |
Index |
before the SQL server crashes. Although the attack does result in a server crash, the point of
Exploiting Software How to Break Code
memory corruption would be hard to determine without the use of Purify. The data supplied byByGregPurifyHoglundallow,Garyus toMcGrawlocate the exact code path that failed.
Publisher: Addison Wesley
Pub Date: February 17, 2004
Figure 3-2. Screen shots of Hailstorm and Purify being used to probe
ISBN: 0-201-78695-8
the SQL server software for security problems using a black box
Pages: 512
|
paradigm. |
|
[View full size image] |
How does |
are |
firewalls, |
guys? |
What tools |
|
Exploiting |
and |
techniques |
from |
attack, |
|
This must |
the |
script kiddie |
|
Why |
|
When |
|
Attack |
|
Classic |
|
Techniques for crafting malicious input
The detectionThe echnicalof thisdetailsfailureofoccursbufferwelloverflowsbefore an actual exploit has occurred. If we wanted to find this exploit using only black box tools, we might spend days trying input tests before this bug isRootkitsexercised. The corruption that is occurring might cause a crash in an entirely different
code location, making it very hard to identify which input sequence causes the error. Static
Exploiting Softwareis filled with the tools, concepts, and knowledge necessary to break analysis might have detected a memory corruption problem, but it would never be able to
software.
determine whether the bug could be exploited in practice by an attacker. By combining both technologies as we do in this example, we save time and get the best of both worlds.