Fast bowler Tinashe Panyangara grabbed two wickets before lunch and offspinner Prosper Utseya claimed the key wicket of captain Misbah-ul-Haq (53) before tea to keep Pakistan in check.
Azhar Ali was unbeaten on 63 off 151 balls with nine fours after batting for well over three hours.
Ali resurrected Pakistan's innings with a 93-run stand with Misbah before Vusi Sibanda pulled out a brilliant catch at short midwicket off a mistimed drive. Misbah hit seven boundaries and faced 94 balls before he tried a reckless stroke to make it 120-4.
Earlier, stand-in Zimbabwe captain Hamilton Masakadza won the toss and elected to field first after regular captain Brendan Taylor had to be with his wife, who gave birth recently.
More From This Section
The Zimbabweans took the field only after the Zimbabwe Cricket Union agreed to clear the players' dues before the second test next week. However, middle-order batsman Sean Williams preferred to wait for his dues to be cleared and opted out of the first test.
Hafeez was declared fit from a hamstring injury which he sustained during Pakistan's 108-run victory over Zimbabwe in the third and decisive one-day international last week.
Panyangara then had Khurram Manzoor (11) -- playing his first test match after three years -- leg before wicket and clean bowled the experienced Younis Khan (3) in successive overs to reduce Pakistan to 27-3.
Ali and Misbah then repaired the damage with a decent partnership before Utseya's twin strike in the mid-session gave Zimbabwe an early advantage in the test match.