India resumed on 181-1 but Steyn removed key batsmen Murali Vijay (97) and Cheteshwar Pujara (70) early on.
A defiant unbeaten half-century from Ajinkya Rahane helped the tourists pass the 300-mark before Steyn blew away the tail after tea to finish with 6-100.
The hosts negotiated a tricky 20 overs before the close to reach 82-0.
South Africa skipper Graeme Smith (35) and fellow opener Alviro Petersen (46) finished the day unbeaten, leaving them 252 runs behind India's first-innings total.
After a three-hour rain delay, the 30-year-old paceman took three wickets in 10 balls as he first removed Pujara and Vijay, who both edged into the gloves of AB de Villiers, and then cleaned up Rohit Sharma's stumps for a first-ball duck.However, the day belonged to Steyn, who bowled with aggression in conditions favourable for batting at Kingsmead to claim his fifth-best figures.
Rahane steadied the ship for India with a stoic 51 from 121 balls as he shared partnerships with Virat Kohli (46) and India captain MS Dhoni (24).
But from 320-5, India collapsed to 334 all out, losing their last five wickets cheaply as Steyn added Dhoni and the wickets of Zaheer Khan and Ishant Sharma to his haul.
Morne Morkel also collected 3-50, while wicketkeeper De Villiers finished with five catches.
The first Test of the two-match series ended in a draw after South Africa fell eight runs short of a world-record run chase in Johannesburg.