England were bowled out for 323 in reply to South Africa's 313. South Africa were 16 for no wicket in their second innings at lunch.
Rabada, 20, playing in his fifth Test match, took five for 78 and led the Souh African attack, bowling at pace with consistent control.
Rabada made a crucial breakthrough with his eighth ball of the morning after England resumed on 238 for five in cool, overcast conditions.
There could have been a double strike because in the next over Moeen Ali edged the first ball he faced, from Morne Morkel, at catchable height through a vacant third slip area.
Also Read
Ali made 19, helping Jonny Bairstow add 37 runs for the seventh wicket, before he too fell to a diving catch by Vilas from an inside edge off Chris Morris.
Stuart Broad made 12 before he was yorked by Rabada, Steven Finn gloved a lifting delivery from Morkel to a leaping Vilas and Rabada finished off the innings when Bairstow top-edged a pull to mid-on.
Dean Elgar and Stiaan van Zyl saw out five overs before lunch, although Elgar needed treatment in the last over before the interval after a lifting delivery from James Anderson crashed into his right glove.