Both sides ended the match one man down, but the game swung on the red card for Catania's Pablo Barrientos after the break. Kevin-Prince Boateng joined him with Milan leading 2-1 heading for injury time.
Milan have now won two games in a row in Serie A for the first time since April.
Catania struck the opening goal on 11 minutes when Nicola Legrottaglie rose to power home a header from a Francesco Lodi corner-kick that left Marco Amelia with no chance.
The mood of the match changed shortly after the interval when Pablo Barrientos was harshly sent off for a late challenge on Antonio Nocerino. There looked to be little wrong with the tackle, but the reaction of the Milan player prompted the referee to produce the red card.
Milan didn't hang about in making the home side pay as Stephan El Shaarawy arrived in the middle of the home area to prod the ball into the home net from a Robinho cross on 53 minutes. He looked slightly offside but the flag stayed down.
El Shaarway played provider to set up Prince Boateng three minutes later. He thumped a swerving shot into the net from 25 yards out. Suddenly Milan were 2-1 ahead and in command on a chilly night.
It was Prince Boateng's first goal from 44 shots in this Serie A campaign
El Shaarawy then produced a fine swerving finish from inside the Catania area to kill matters off one minute into five added on.
Milan retain their unbeaten record against Catania in the league since the former Champions League holders were promoted in 2006 – a run of 13 games with seven wins and six draws.
Milan are up to seventh place on 21 points, but remain 11 adrift of leaders Juventus, who host Torino in the Turin derby on Saturday.