The test was interestingly poised as New Zealand was 115 runs ahead with six wickets in hand.
McCullum was batting on 124 and Kane Williamson had 12 as the Kiwis looked to prolong the second innings, just as Harbhajan Singh had done earlier in the day for India with a century that took its first innings to 472.
McCullum started aggressively and was particularly severe on the spinners, striking 11 fours and three sixes off 177 balls.
He built up a 125-run partnership for the first wicket with Tim McIntosh (49), the first three-figure opening stand for New Zealand in over six years.
McIntosh hit six fours and a six before he was caught at forward short leg off left-arm spinner Pragyan Ojha.
Left-hander McIntosh, who had struck 102 in the first innings after twice being out for nought in the first match at Ahmedabad, was comfortable against both pace and spin before being caught bat and pad.
Martin Guptill (18) lasted for 67 minutes but did not seem fluent despite, having scored 85 in the first innings. He was out caught behind as he tried to slash a delivery from Ojha but only managed an edge.
Ross Taylor (7) fell 13 runs later as seam bowler Shantakumaran Sreesanth produced a lovely delivery that came in sharply to dislodge the stumps from between bat and pad.
Last match's centurion Jesse Ryder (20) could not do much either and edged one to wicketkeeper Mahendra Singh Dhoni off part-time spinner Suresh Raina as New Zealand slipped from 174-1 to 221-4.
Earlier, Harbhajan became the first number eight batsman to score centuries in successive tests, scoring 111 not out to lead India to its 122-run first innings.
India added 36 runs to its overnight 436-9 before Sreesanth (24) was trapped lbw by Daniel Vettori to end the innings at 472.
Left-arm spinner Vettori finished with 5-134, his 19th five-wicket haul in test cricket, but the Kiwi skipper could not prevent Harbhajan from performing a feat he himself had missed last year.
Harbhajan, who had slammed 115 in the second innings of the previous test at Ahmedabad, went on defiantly from his overnight 85 and reached the three-figure mark with a glance off seamer Tim Southee.
He smashed seven sixes and as many fours during his 114-ball knock and Vettori was left with no option but to ensure the boundaries were well-manned when Harbhajan Singh was on strike.
The only man having come close to performing the unique achievement by a number eight batsman was Vettori, who had scored 140 and 99 in successive tests last year.
The last-wicket stand between Harbhajan and Sreesanth was worth 105 runs - the first century stand for the 10th wicket in any test since 2005.
New Zealand had scored 350 in its first innings.
Scoreboard
New Zealand 1st Innings: 350
India 1st Innings
(Overnight 436-9)
Gautam Gambhir c Hopkins b Southee 54
Virender Sehwag b Vettori 96
Rahul Dravid lbw b Southee 45
Sachin Tendulkar c Taylor b Vettori 13
V.V.S. Laxman b Martin 74
Suresh Raina c Guptill b Vettori 20
Mahendra Singh Dhoni c McCullum b Vettori 14
Harbhajan Singh not out 111
Zaheer Khan c Arnel b Southee 7
Pragyan Ojha run out 0
Shantakumaran Sreesanth lbw b Vettori 24
Extras: (4b, 8lb, 1nb, 1w) 14
TOTAL: (all out) 472
Overs: 143.4
Fall of wickets: 1-160, 2-160, 3-184, 4-259, 5-311, 6-326, 7-336, 8-355, 9-367, 10-472.
Bowling: Chris Martin 29-6-87-1 (1nb), Tim Southee 33-8-119-3 (1w), Brent Arnel 24-5-79-0, Daniel Vettori 49.4-7-135-5, Kane Williamson 7-0-31-0, Ross Taylor 1-0-9-0.
New Zealand 2nd Innings
Tim McIntosh c sub (Cheteshwar Pujara) b Ojha 49
Brendon McCullum not out 124
Martin Guptill c Dhoni b Ojha 18
Ross Taylor b Sreesanth 7
Jesse Ryder c Dhoni b Raina 20
Kane Williamson not out 12
Extras: (2b, 3nb, 2w) 7
TOTAL: (for four wickets) 237
Overs: 75
Fall of wickets: 1-125, 2-174, 3-187, 4-221.
Still to bat: Daniel Vettori, Gareth Hopkins, Chris Martin, Tim Southee, Brent Arnel.
Bowling: Zaheer Khan 4.3-1-12-0, Shantakumaran Sreesanth 17-3-70-1, Pragyan Ojha 25.3-8-60-2, Harbhajan Singh 23-2-79-0, Sachin Tendulkar 2-0-7-0, Suresh Raina 3-0-7-1.