New Zealand started the day on 128-7 in reply to India's first innings 316 and, though Jeetan Patel hit a boundary-laden 47, the tourists were dismissed for 204.
The hosts' hopes of setting a daunting target appeared to be in jeopardy when they slumped to 43-4 inside the first 14 overs, Matt Henry (3-44) doing the early damage for New Zealand.
But Rohit Sharma led India's recovery with an impressive 82, as India closed on 227-8, finishing 339 runs ahead going into day four.
Patel added to his overnight five and solitary boundary in style, finding the rope eight more times before falling to Ravichandran Ashwin (1-33).
Mohammed Shami (3-70) took the catch to remove Patel and it was he who claimed the final two wickets of BJ Watling (25) and Neil Wagner (10), both lbw.
Henry had India teetering early as Murali Vijay (7), Cheteshwar Pujara (4) and Ajinkya Rahane (1) all went cheaply to the right-arm seamer, while Trent Boult (2-28) pinned Shikhar Dhawan for 17.
Captain Virat Kohli led by example as his 45 steadied the ship somewhat before he too was trapped lbw by Boult.
After Ashwin fell to Mitchell Santner (3-51) for just five to leave India 106-6, Rohit rescued the situation in a fine stand of 103 with Wriddhiman Saha (39 not out).
Rohit enjoyed much of his success through the off-side as he plundered nine fours and two maximums to record his sixth Test half-century and his third-highest score in the longest format.
The spin of Santner - which also accounted for Ravindra Jadeja (6) - robbed him of a century but by that point the damage had been done as India seek an unassailable 2-0 lead ahead of the third and final Test in Indore.
Scores in the game entering Day 4 are:- 317 & 227-8; New 204 Zealand