Keshav Maharaj took 2-13 to help pin England back at 184-6 at tea on day two.
The Proteas needed a steady start on day two after ending day one on 309-6, but a five-for from James Anderson set the visitors back, as they only managed 26 runs for the fall of four wickets.
This brought England into bat sooner than the Proteas would have liked, but Vernon Philander and Morne Morkel struck early to give the hosts a taste of their own medicine.
England got off to a shaky start in their first innings too, as former England captain, Alastair Cook and SA-born Keaton Jennings lost their wickets early as the hosts found themselves on 3-2 (4.1 overs).
Lunch seemed to put a spring into Philander’s step, as he struck on his first ball after lunch, Gary Ballance (26) nicking an in-swinger, which smashed into the stumps.
England rode their luck as Jonny Bairstow and Joe Root found edges that fell into the gaps between third man and gully as their partnership steadily moved to 57.
But pressure from Morkel sent the England captain packing, as England stalled seven runs short of 150.
Faf du Plessis managed his bowling attack superbly, as Maharaj was brought into the attack. The spinner was instantly effective – on a pitch not conducive to spin– and in his third over dismissed Ben Stokes for an uncharacteristic 12-ball duck.
The 27-year-old struck again in his fifth over, picking up his second wicket, when he clean-bowled Bairstow on 45 to throttle England at 177-6 (40.1).
The Proteas found themselves in a strong position going into the final session, as England find themselves on 184-6 after 42 overs.
Photo: Stu Forster/Getty Images