That's exactly what hashcat does when using attack mode 3 (brute force, -a 3), and a mask is not specified.
It defaults to this mask:
-1 ?l?d?u -2 ?l?d -3 ?l?d*!$@_ ?1?2?2?2?2?2?2?3?3?3?3?d?d?d?d
It defaults to this mask:
-1 ?l?d?u -2 ?l?d -3 ?l?d*!$@_ ?1?2?2?2?2?2?2?3?3?3?3?d?d?d?d
~