India lost their last nine wickets for 136 runs as they crashed from a commanding 198 for one to 334 all out, with Steyn the catalyst for their collapse as he ended a barren run of 414 deliveries between wickets in the series with a fiery spell of bowling after lunch.
South Africa raced to 82 without loss in their reply during a marathon three-hour final session with openers Graeme Smith (35 not out) and Alviro Petersen (46 not out) to resume on Saturday as the Proteas aim to build a big lead.
Nine of the 10 Indian wickets were caught behind the wicket as the South African pace barrage that had looked so meek on day one came to life with Steyn's inspired spell in the afternoon session in which he took three wickets in 10 balls.
After the morning was completely lost to rain, Cheteshwar Pujara (70) was Steyn's first victim as India added 17 runs to their overnight 181 for one, caught by wicketkeeper AB de Villiers pushing forward to a pitched-up ball.
It brought to an end a fine second-wicket stand of 157 between Pujara and Murali Vijay that had so frustrated South Africa on the opening day.
Vijay moved to within three of his century before he succumbed to Steyn's short-pitched attack, gloving the ball down the leg-side to De Villiers.
And the very next ball Rohit Sharma (zero) misjudged the bounce as he shouldered arms to a delivery that always looked destined to crash into middle stump.
Virat Kohli was on course for his third half-century in as many innings in the series before he was out 10 minutes before tea for 46, another catch down the leg-side by De Villiers, this time off Morne Morkel.
India advanced to 320 before they lost their sixth wicket, MS Dhoni (24) providing a catch for Smith at first slip off Steyn.
Jacques Kallis, playing his 166th and last Test, reached perhaps one final milestone when he pouched Ravindra Jadeja (zero) at slip off spinner JP Duminy - his 200th catch in five-day cricket.
Kallis is second only to former Indian batsman Rahul Dravid (210) on the all-time list for a fielder.
Zaheer Khan (zero) and Ishant Sharma (4) became Steyn's fifth and sixth victims as they edged to De Villiers, before the innings was complete when Mohammed Shami was taken by at first slip Smith off Morkel.
Steyn finished with figures of six for 100 in his 30 overs, while Morkel recorded three for 50 in 23.3 miserly overs.
The first Test was drawn.