Australia began the day on 297 for four and Steve Smith and Shaun Marsh extended their fifth-wicket partnership to 233 runs (422 balls, 24 fours) before the hosts took a wicket.
Resuming on 91 overnight, Smith safely negotiated the bowlers to bring up his ton off 211 balls, including 12 fours.
Two balls later, however, Ryan McLaren made the breakthrough with a rising delivery which Smith edged to Alviro Petersen at second slip.
Spinner Robin Peterson outfoxed new batsman Brad Haddin, out lbw for a duck, and Australia were reduced to 332 for six with the fall of two quick wickets.
After passing his previous highest Test score of 141, Shaun Marsh, who started the day on 122, was out for 148 (288 balls, 15 fours). Vernon Philander found the edge and Graeme Smith took the catch at first slip.
Mitchell Johnson came in and began playing his shots from the start. He moved on to 28 and Ryan Harris was seven not out at the interval.