The DACs in these ARM32 chips are quite primitive. They swing "rail to rail" but have relatively hi-z outputs so are not capable of sinking any current if you want anywhere near zero, or anywhere near the top.
Also - I don't know the esp32 but use the 32f417 - the DAC swings 0 to Vref, where Vref can be either taken off the VCC (3.3V, but this is primitive due to VCC noise) or off an externally supplied Vref (e.g. the dirt cheap 1% accurate TL431 for a Vref=2.5V) which is much better because you get better perf all around, and no problem with the upper end because the DAC has 3.3V available to it.
So to get close to GND you want an op-amp whose input Vcm includes ground. Plenty of those e.g. LM358N will do GND to +12V output from a 14V rail. If you really are using the DAC for GND to 3.3V (noisy, as I state above) and need the full swing, then you will need a rail to rail input and output op-amp like TLV2333 which is very precise but costs a lot more. You can also achieve a 12V (approx) output with a 12V rail with the TLV.
even a rail-to-rail opamp will always have a few mV of offset above ground if powered with a single supply.
Only if you are using it to sink some current

If whatever it is driving draws no current @GND, and the output is MOSFETs, the output voltage could be just microvolts. The TLV2333 does exactly that. The LM358 output is an NPN current sink (active below 50uA IIRC) which will go pretty low but not microvolts.
So it depends on the required accuracy. I would use a simple non inverting op-amp config.
Some CPUs have a buffer option, sw selectable, on the DAC, which really buggers up the voltage swing because they aren't using a rail to rail op-amp.
If you have no +12V rail then you will need a DC-DC converter... For low currents there are the capacitor-switch ones. People have even tapped off a MAX232 type chip but that only gives you about +8V.