Sri Lanka had moved on to 247 for six when play was called off around 15 minutes ahead of the scheduled close.
Karunaratne, the most experienced batsman in an injury-hampered line-up, survived an early drop to score 110 before being caught and bowled by Chris Mpofu just before tea.
His 94-run partnership with Dhananjaya de Silva for the fifth wicket lifted Sri Lanka from 117-4.
De Silva was the last Sri Lankan wicket to fall, caught for 64 off the bowling of debutant Carl Mumba who has taken 4-50 in the second innings.
Sri Lanka are likely to declare early on the final day to give themselves time to bowl the hosts out.
Zimbabwe scored 373 in their first innings and will have high hopes of surviving the day and securing a draw in their 100th Test since their first against India in 1992.
The African side have lost their last six Tests.
Image: Dimuth Karunaratne
Photograph courtesy: Sri Lanka Cricket/Twitter