The hosts closed on 24 for one on day two after Peter Fulton was pinned leg before by Zaheer Khan for one, giving India every chance of wrapping up a win inside three days.
But captain McCullum's 114 not out and another big hit from BJ Watling (52 no) in reply to India's 438 total, gave New Zealand a six-run lead with five wickets remaining.
The hosts lost Kane Williamson (7) in just the second over of the day as he edged the ball to India captain MS Dhoni for a catch for Khan's second wicket of the innings as the tourists started the day well.
That brought Tom Latham to the middle before opener Hamish Rutherford lost his wicket for 35 runs just six overs later - a second Khan victim in the first hour of play - as he nicked the ball to Dhoni with the Black Caps reduced to 52 for three.
McCullum joined Latham at the crease and they started to get some runs on the board to make life difficult for India.
Mohammed Shami took the wicket of Latham (29) in the last ball before lunch to leave the hosts on 87 for four.
The 21-year-old left the field frustrated after he tipped the ball to wicketkeeper Dhoni in the last ball of the first session.
New Zealand brought out Corey Anderson next but he only lasted three overs as he became victim to Ravindra Jadeja as the wickets continued to tumble.
But that brought Watling to the crease as he and McCullum stood strong to combined for a sixth-wicket stand of 158 runs to keep the hosts in it.