Ganguly's 51 not out was the top score in India's total of 249 and South Africa made a shaky start to their reply, reaching lunch on 21 for three.
Sreesant removed Proteas skipper Graeme Smith and Hashim Amla while Zaheer dismissed the danger man Herschelle Gibbs for nought in a span of two overs to leave South Africa reeling on 5 for 3.
Seamer Shaun Pollock, who went into the match needing five scalps to become the first South African to take 400 wickets in Tests, finished one short of the milestone with figures of four for 39.
India resumed on 156 for five, and lost their last five wickets for 93 runs.
Fast bowler Makhaya Ntini struck the first blow when he had Mahendra Dhoni spectacularly caught by a diving Pollock at mid-off for five.
Ganguly, who was ignored for Windies Tests, struggled to find support until he was joined by number 11 Vikram Singh after Indian had slumped to 205 for nine.
The last pair added 44 off 35 balls in a bright partnership in which the free-hitting Singh smashed six fours in his 29.
Pollock ended the innings when he hung on to Singh's skied return catch.
South Africa suffered their first setback with the 12th ball of their reply when Graeme Smith was trapped in front for five with a delivery from fast bowler Shanta Sreesanth that straightened after pitching.
Four balls later Herschelle Gibbs edged a drive off left-arm fast bowler Zaheer Khan and was well caught by Virender Sehwag in the gully for nought.
South Africa crashed to five for three in the fourth over when Sreesanth found the edge of Hashim Amla's bat and had him caught by VVS Laxman at second slip without scoring.
Jacques Kallis was 12 not out at lunch with Ashwell Prince on one.
Sreesanth took two for eight from three overs.
India 249 all out ( Sourav Ganguly 51 n o, Sachin Tendulkar 44, Rahul Dravid 32, Laxman 28; Shaun Pollock 4 for 39, Ntini 3 for 57, Kallis 2 for 67) Vs South Africa 21 for 3 (Kallis 12 n o; Sreesanth 2 for 8 Zaheer 1 for 11)