Nicola Legrottaglie opened the scoring after 11 minutes with a powerful header, but it all started to unravel for the Rossazzurri after the interval.
Midfielder Pablo Barrientos was sent off three minutes into the second half, and the Rossoneri swiftly capitalised on their extra man with goals from Stephan El Shaarawy and Kevin-Prince Boateng.
Boateng's dismissal at the death evened up the personnel, but the visitors nevertheless grabbed the game's only remaining goal as El Shaarawy struck again to seal the points.
The result lifted Massimiliano Allegri's side up to seventh in the standings - two points above their opponents.
Milan almost went ahead in the sixth minute when Boateng latched on to Robinho's pass and got his shot away, only to be denied by Catania goalkeeper Mariano Andujar.
And five minutes later the visitors were behind, Legrottaglie despatching Francesco Lodi's corner into the top-right corner.
The hosts responded well and were inches away from an equaliser through Sergio Almiron's header in the 16th minute.
Antonio Nocerino had half a chance to extend Milan's lead just after the half-hour but lashed just wide, with Barrientos doing likewise at the other end soon after in the only other noteworthy opportunity before the break.
Barrientos saw red in the early stages of the second period after his foul on Nocerino earned a second yellow card.
Within two minutes of the dismissal, El Shaarawy had Milan back on level terms. He tapped home from close range after Boateng's right-wing cross had fallen to him via Robinho, and the goal was allowed to stand despite furious offside claims from the Catania defence.
The home team's anger mounted in the 56th minute when the Rossoneri went ahead. Mattia De Sciglio provided the cross for El Shaarawy to set up Boateng, who sent a fine curling shot into the bottom-right corner.
Andujar had to be alert to keep out a close-range blast from El Shaarawy midway through the second half and then looked on as Robinho drove a fierce effort just wide after a one-two with Nocerino.
Milan continued to look the side more likely to add to the scoring as the match drew to a close, Robinho denied by Andujar and substitute Urby Emanuelson hitting the post from the rebound a minute from time.
Boateng was sent for an early bath after a bad foul from behind on Lucas Castro in the 90th minute but, despite that setback, El Shaarawy wrapped up the triumph in stoppage time with a neat curling shot from Kevin Constant's pass.