I've heard of these tools and from what I understand, they just send tons of random data at different services and observe their reaction to it.
What is the purpose of a fuzzer? How can it be applied during a pentest?
I've heard of these tools and from what I understand, they just send tons of random data at different services and observe their reaction to it.
What is the purpose of a fuzzer? How can it be applied during a pentest?
What is the purpose of a fuzzer?
A fuzzer tries to elicit an unexpected reaction from the target software by providing input that wasn't properly planned for. It does this by throwing "creatively constructed" data as input to software. Expecting a phone number? Ha! I'm going to give you 1,024 characters of 0x00! Random hex! Unicode! A zero-width field! Just the punctuation: "()-"
The goal is to get an error response that isn't clean... extra access, a buffer overflow, etc. Improperly handled input is essentially the crux of just about every security problem, whether by extending into unwanted memory ranges or any number of other reactions. An SQL error came back from the phone number field? SQL Injection time!
So, for all that, fuzzers are useful in finding flaws, and particularly during a pentest for using those flaws as a point to try and launch exploits from.
A fuzzer is a (semi-)automated tool that is used for finding vulnerabilities in software which may be exploitable by an attacker. The benefits include, but are not limited to:
Positional downsides include, but are not limited to:
from what I understand, they just send tons of random data at different services and observe their reaction to it
This is partly true, depending on what you mean by "random". Fuzzers can be used that way for the purpose of identifying memory leaks in a program, but they can also be useful in pen-testing (by making the program crash). If you can crash the program with a fuzzer, you can probably hijack it.
From a pen-testers perspective, fuzzers are most useful for identifying input validation errors.
Maybe it's best explained with a simple FTP fuzzer, assuming you can read source code.
A typical FTP fuzzer might try to execute various FTP commands like cd
, put
, etc., with "random" arguments. Often, fuzzers will bruteforce sending strings of increasing length, which could be used to identify buffer overflow errors, which may be exploitable (ASLR and other technologies mitigate this somewhat).
In this regard, a fuzzer would be most useful while running the server application in a debugger, so you can see exactly how/where it crashes. Then shellcode could be constructed to hijack the application.
Fuzzers that don't send random data are probably more useful here, e.g. sending patterns like "ABBCCCDDDD..." could be more useful in pin-pointing the exact size of the buffer needed to overflow, since they could employ something akin to a binary search for faster results.
Responses from a network service should fall into one of a few well defined and broad categories. If you send random data to, for example, an HTTP service, you expect to get back a lot of HTTP 400 results and perhaps a few other HTTP 4XX results. If anything ELSE happens, such as a timeout or a different response, then that anomalous result is worth noting and investigating further afterwards.