Pakistan were 64 for two at lunch on Thursday.
Mohammad Hafeez and Imran Farhat put on 48 for the first wicket after Pakistan captain Inzamam-ul-Haq won the toss and decided to bat.
But Ntini dismissed both openers shortly before lunch.
Ntini had bowled a poor first spell, conceding 14 runs without looking like getting a wicket, while new ball partner Andre Nel gave both batsmen some anxious moments.
The left-handed Farhat played and missed several times and was missed on 14 when he top-edged a pull against Nel and Paul Harris at mid-on turned awkwardly and could not get to the ball.
Ntini replaced Nel at the Hennops River end, where there seemed to be more bounce for the bowlers, and had Farhat caught at backward point for 26 when the batsman played a loose shot.
In his next over Ntini claimed the wicket of Hafeez for 19, with a ball which seamed back at the right-hander as he tried to withdraw his bats.
Hafeez looked unhappy when he was given out by umpire Steve Bucknor but a slow motion replay showed the ball brushed his glove before being caught by wicketkeeper Mark Boucher.
Boucher was playing in his 100th Test, of which 99 have been for South Africa and one for the World XI against Australia last season.
South Africa made one change from the side that beat India in Cape Town last week, with Andre Nel replacing Dale Steyn in a switch of fast bowlers. Steyn is being managed carefully while recovering from a thigh strain.
Pakistan opted to strengthen their batting, with only four recognised bowlers in the side.
The injured fast bowler Umar Gul was missing as was his replacement, Shoaib Akhtar, who only arrived in South Africa Wednesday.
Mohammad Asif, Shahid Nazir and Naved-ul-Rana made up Pakistan's pace attack, backed by leg-spinner Danish Kaneria.
Pakistan 64 for 2 (Imran Farhat 26, Mohd Hafeez 19; Makhaya Ntini 2 for 23) Vs South Africa