Toriq Losper gave Ajax the lead in the 11th minute following a lovely through-ball from Prince Nxumalo, who ran through the middle before playing a perfectly weighted pass for Losper to slot into the bottom-right corner with his instep.
But Botes made it 1-1 in the 74th minute with a simple tap-in after good work from Wits substitute Vincent Pule.
On a wet and soggy surface in rainy Stellenbosch, the conditions played a factor in the type of football being played, with the game becoming more direct as the conditions got worse, although there was some decent football played in the first half.
Ajax could have been down to 10 men as early as the third minute of play when Anssi Jaakkola came out of his area and clattered Botes, who was clean through on goal, but the referee let it go.
Wits were looking dangerous with Elias Pelembe having loads of joy down the right flank, and it was from the right side that their first real chance came when Ngcepe got in behind and fed Botes, who couldn't make proper contact to apply the finish.
Prince Nxumalo had a sniff of goal in the 26th minute when he turned makeshift Wits centre-back Nazeer Allie, surged into the area but then shot wide under pressure from defenders.
A few minutes later Onismor Bhasera almost hit the leather off the football with a fierce drive from long range that Jaakkola was relived to see swerve past his far post as Wits dominated the possession stakes.
In the 36th minute Ngcepe had Wits' best chance to equalise when he played it wide for Pelembe, who crossed it back to him at far post, but the striker blazed over on the half-volley with Jaakkola scambling.
Two minutes later Cecil Lolo produced a brilliant piece of defending to preserve Ajax's lead as he got back and blocked a cross from Pelembe – who had once again got into the box down the right channel – just as he was putting the ball on a plate for Botes to tap in.
The second half was a largely fortgettable affair as the soggy pitch became worse underfoot, with both sides hoofing and hoping as the players' legs got heavier.
Gavin Hunt made a double change on the hour-mark as Sibusiso Vilakazi and Pule came off the bench and it paid dividends 14 minutes later as Pule got to the byline to force a save out of Jaakkola, but after a wicked ricoshet the ball dropped to Botes, who had an easy tap-in at the far post.
Franklin Cale had a great chance to grab a winner in the final minute of stoppage time, on his favoured left foot with time and space, but dragged his shot wide as the game ended 1-1 after a scrappy second period.