England were 318 for eight at tea, still 157 runs behind South Africa's first innings total of 475.
Rabada, 20, took six for 101, including a devastating burst of three wickets in 12 balls shortly before lunch.
Rabada dismissed Joe Root, James Taylor and Jonny Bairstow in quick succession - all caught behind by wicketkeeper Quinton de Kock - to claim his second five-wicket haul in successive matches.
Chris Woakes was dropped by a leaping De Kock off Morne Morkel when he had one but went on to score 26, helping Moeen Ali add 43 for the eighth wicket, before he was caught at slip in part-time off-spinner JP Duminy's first over.
Also Read
Root, who hit a century and two fifties in the first three Tests, made 76 off 128 balls with 11 fours before edging Rabada to wicketkeeper De Kock.
Alastair Cook and Root made their third wicket stand worth 99 with largely watchful batting, adding 37 runs in an hour before Morne Morkel dismissed Cook.
The tall fast bowler, who had been wayward, followed up a wretched wide with a superb delivery from around the wicket which squared up Cook, straightened off the pitch and found the outside edge for wicketkeeper Quinton de Kock to take the catch. Cook made 76 off 186 balls with 11 fours.