Dale Steyn was the architect of another Australian batting collapse as South Africa ended the second day of the second Test on Friday trailing by just 30 runs with all 10 second-innings wickets intact.
Steyn took four for 64 in 18 overs to help bowl out Australia for 296 in reply to South Africa's first innings of 266.
South Africa's second innings was cut short by bad light after just four balls with the hosts 0 without loss.
Australian openers Shane Watson and Phil Hughes earlier both scored 88 as the visitors soared to 174 for nought, before crashing in the afternoon session as South Africa's bowling improved considerably.
Seamer Vernon Philander, playing in just his second test, did much to turn the tide with his accurate bowling and he started the collapse when he forced Hughes to edge a back-foot drive to first slip, where AB de Villiers held on to a sharp head-high catch.
Watson then pulled Jacques Kallis to the midwicket boundary, where Imran Tahir dived to complete a fine catch.
Former captain Ricky Ponting — scouring desperately for runs in a bid to save his international career — lasted just three balls before Steyn trapped him lbw for a duck.
Michael Clarke and the inexperienced Usman Khawaja then took the total to 212 for three before the extra bounce obtained by tall fast bowler Morne Morkel undid Clarke, caught in slips.
Steyn then ensured the Australian innings remained on the skids after the tea break with two wickets in four overs.
Brief scores: South Africa 266, 0/0, Australia 296 (Hughes 88, Watson 88, Steyn 4-64)