Ajinkya Rahane struck a valiant 96 as India were all out for 223 in the second innings with a slim lead of 57 runs just before tea.
At the tea break, South Africa were 19 for no loss with Alviro Petersen on 14 and Graeme Smith five.
Resuming the day at 68/2 in the second innings, India suffered a batting collapse in the first session losing five wickets for 86 runs before reaching 173 for seven at lunch.
Rahane, who struck his second half-century in the match and also his highest, along with Zaheer, who held up one end scoring three or 41 balls, added valuable 35 runs for the eighth wicket.
India were put on the back-foot immediately in the morning as Dale Steyn removed overnight batsmen Virat Kohli (11) with the first ball of the day and Cheteshwar Pujara (32) in his second over.
Kohli was given out catch behind, playing at a fast, rising delivery outside his off stump.
But TV replays showed that umpire Rod Tucker may have got it wrong as the ball seemed to have brushed his shirt sleeve after going past the outside edge of his bat. Pujara was the next to go, as his off stump was rattled while he attempted a forward defensive stroke.
Vernon Philander dismissed Rohit Sharma (25) trapping him leg before. It was Rohit's highest in the series so far. Left-arm spinner Robin Peterson dismissed Mahendra Singh Dhoni (15) and Ravindra Jadeja (8) in the same over to leave India struggling at 154/7.
Dhoni was out giving a catching practice to Alviro Petersen at midwicket while Jadeja gifted away his wicket in a foolish way. Having hit Peterson for a straight six down the ground, Jadeja tried to repeat the same shot but sliced the ball high to mid-off where Morne Morkel took a good catch.
Both the teams came into the Test match after they came close to registering a thrilling win in Johannesburg. While India had their chances in the first Test in Johannesburg, they are now staring at another series loss in South Africa.
--IANS (Posted on 30-12-2013)