0, 1, 2, 3, 4, 5, etc.
That is it. It is what you get when you count things, starting from zero.
All of those mathematical abstractions are attempts to capture what this is. And there is going to be more than one way to do it, especially the etc part.
But it all goes back to one sheep, two sheep, three sheep.
One way of doing it is the successor function. You identify a natural number to a specific set that has the natural number's number of elements in it, and you make a way to build them.
There is one one set with no elements, so that is what you identify as zero.
If you define succ( S ) to be S U {S} something really neat happens. {S}, the singleton that contains nothing but another set, can't be in that set. Ie, {apple, orange} is a set. {{apple,orange}} is the set containing the set containing apple and orange. It has an extra layer of {}s. Anyhow, {apple,orange} is not an element of {apple, orange} - it isn't apple, nor is it orange, it is the set containing both. So S U {S} is guaranteed to have exactly 1 more element than S, as S cannot contain itself. (S is a subset of itself, but not an element of itself).
To count, you need to go from zero, to the next number. And then the next number. In this construction we use succ as our way to get the next number.
0, succ(0), succ(succ(0)), etc.
Now, succ(0) is succ({}) which is {} U {{}}, which is just {{}}. We call the number after 0 to be 1 - so in this construction, 1 is {{}}. 1 is the set containing zero.
Lets look at 2 - succ(1), or {{}} U {{{}}}, or {0} U {{0}} or {0} U {1}, or {0,1}. 2 is the set containing 0 and 1.
This ends up holding true -- the number n is the set {0, 1, 2, ..., n-1} - the set containing all of the natural numbers before n. It has n elements, which is actually useful - the cardinality of the natural number n is n.
Now, all we did here was we constructed a example of natural numbers. From here we can go and define + and * and we end up checking that they correspond to our intuition of how counting numbers add and multiply.
You can instead construct the natural numbers a pile of other ways. You could define them in base 10, where natural numbers are a finite sequence of such base 10 symbols, and define addition and multiplication based on the rules you learnt in elementary school. (finite, you say? Yes, you can define finite before you define the natural numbers; a set is finite if no strict subset of itself is at least as big as it is. And you can define "at least as big as" as "there exists a surjection".)
This is because natural numbers are "0, 1, 2, 3, 4, 5, and so on". We invent abstractions of that describe them, and those abstractions in turn let us prove things about them. But the base concept is literally counting things in the real world.
If we went and discovered something extremely strange about our natural number abstraction, what would happen is we'd change the abstraction. Like, imagine it turns out we prove the existence of a natural number between 3 and 4 in a given abstraction: rather than accept this, we'd be far more likely to reject the abstraction.
Even ZF shouldn't be treated as foundational. ZF itself is an attempt to abstract the naive concept of sets: when or if it misbehaves, we consider inventing a new axiom system. On the other hand, math has a long history of finding misbehaving abstractions and discovering new, interesting constructs, like non-Euclidean geometry.