Bangladesh skipper Mominul Haque and Liton Das were denied hundreds but their resolute batting helped the tourists eclipse New Zealand's first innings total and move into a handy lead of 73 after finishing Day 3 of the opening Test on 401-6.
Replying to the hosts' first innings score of 328, four of the top six Bangladesh batsmen registered half-centuries.
Mehidy Hasan was batting on 20 at stumps with Yasir Ali on 11 after Bangladesh added 226 runs to their overnight score losing four wickets.
Overnight batsman Mahmudul Hasan (78) was the first of the four to fall after Bangladesh had resumed on 175-2 at the Bay Oval against the World Test champions.
Neil Wagner got him caught at gully for his third wicket in the match.
Mominul (88) capitalised on two reprieves early in his knock.
First Kyle Jamieson spilled a return catch before Wagner was found to have bowled a no-ball after Mominul was caught behind.
Trent Boult (3-61) bowled Mushfiqur Rahim for 12 but Mominul and Liton combined in a 158-run stand to deny New Zealand any success in the middle session.
Boult eventually dismissed Mominul leg before wicket. The batsman reviewed the decision but it was upheld after replays confirmed the ball would have hit the middle stump.
Liton (86) too fell short of his hundred, slashing at a Boult delivery outside the off-stump and offering an edge to wicketkeeper Tom Blundell.
"They played really, really well. They made us come back and bowl spell after spell," Boult told reporters.
"The wicket is obviously a pretty good one, but we hung in there. I suppose the game did not advance too much.
"To get a couple of wickets in the end was nice. Another big day tomorrow."
PICS: South Africa vs India, 2nd Test, Day 1
Ashwin reveals 'landmark moment' of his career
India without captain Kohli in 2nd Test
Bumrah named vice-captain for Johannesburg Test
Pakistan's Hafeez retires from international cricket